创建自签名公用证书来对应用程序进行身份验证

对于服务主体,Microsoft Entra ID 支持两种类型的身份验证:基于密码的身份验证(应用机密)和基于证书的身份验证。 虽然可通过 Azure 门户或使用 Microsoft API(例如 Microsoft Graph)轻松创建应用机密,但它们是长期存在的,不如证书安全。 因此,建议应用程序使用证书而不是机密。

对于测试,你可以使用自签名公用证书,而不是使用证书颁发机构 (CA) 签名证书。 此操作说明介绍了如何使用 PowerShell 来创建和导出自签名证书。

注意

自签名证书是未由受信任的第三方 CA 签名的数字证书。 自签名证书由负责签署网站或软件的公司或开发人员创建、颁发和签名。 这就是为什么对于面向公众的网站和应用程序,自签名证书被视为不安全的原因。

使用 PowerShell 创建证书时,可以指定加密算法和哈希算法、证书有效期和域名等参数。 然后可以根据应用程序的需要,导出带或不带私钥的证书。

启动身份验证会话的应用程序需要私钥,而确认身份验证的应用程序需要公钥。 因此,如果要从 PowerShell 桌面应用向 Microsoft Entra ID 进行身份验证,只需导出公钥(.cer 文件)并将其上传到 Azure 门户即可。 PowerShell 应用使用本地证书存储中的私钥来启动身份验证,并获取用于调用 Microsoft API(例如 Microsoft Graph)的访问令牌。

你的应用程序也可以从另一台计算机(例如 Azure 自动化)运行。 在这种情况下,请从本地证书存储中导出公钥和私钥对,并将公钥上传到 Azure 门户,将私钥(一个 .pfx 文件)上传到 Azure 自动化。 在 Azure 自动化中运行的应用程序将使用私钥来启动身份验证并获取用于调用 Microsoft API(例如 Microsoft Graph)的访问令牌。

本文使用 New-SelfSignedCertificate PowerShell cmdlet 创建自签名证书,并使用 Export-Certificate cmdlet 将其导出到可轻松访问的位置。 这些 cmdlet 内置于 Windows 的新式版本(Windows 8.1 和更高版本,以及 Windows Server 2012R2 和更高版本)中。 自签名证书将具有以下配置:

  • 2048 位的密钥长度。 虽然支持更长的值,但强烈建议你使用 2048 位大小来实现最佳的安全和性能组合。
  • 使用 RSA 加密算法。 Microsoft Entra ID 当前仅支持 RSA。
  • 证书使用 SHA256 哈希算法进行签名。 Microsoft Entra ID 还支持使用 SHA384 和 SHA512 哈希算法进行签名的证书。
  • 证书有效期只有一年。
  • 支持将此证书用于客户端和服务器身份验证。

若要自定义证书的开始日期、到期日期和其他属性,请参阅 New-SelfSignedCertificate

创建并导出公用证书

使用通过此方法创建的证书从计算机上运行的应用程序进行身份验证。 例如,从 PowerShell 进行身份验证。

在 PowerShell 提示符中,运行以下命令并使 PowerShell 控制台会话保持打开状态。 将 {certificateName} 替换为你要为证书指定的名称。

$certname = "{certificateName}"    ## Replace {certificateName}
$cert = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256

上一命令中的 $cert 变量将证书存储在当前会话中,允许你将其导出。

下面的命令采用 .cer 格式导出证书。 你还可以将其导出为 Azure 门户中支持的其他格式,包括 .pem 和 .crt。


Export-Certificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.cer"   ## Specify your preferred location

你的证书现在可以上传到 Azure 门户了。 上传后,检索用于对应用程序进行身份验证的证书指纹。

(可选):导出带私钥的公用证书

如果应用程序将从其他计算机或云(例如Azure 自动化)运行,则还需要私钥。

接着以前的命令操作,为证书私钥创建密码,并将其保存在变量中。 将 {myPassword} 替换为要用来保护证书私钥的密码。


$mypwd = ConvertTo-SecureString -String "{myPassword}" -Force -AsPlainText  ## Replace {myPassword}

通过此命令使用 $mypwd 变量中存储的密码保护并导出私钥;


Export-PfxCertificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.pfx" -Password $mypwd   ## Specify your preferred location

你的证书(.cer 文件)现在可以上传到 Azure 门户了。 私钥(.pfx 文件)已加密,他方无法读取它。 上传后,请检索可用于对应用程序进行身份验证的证书指纹。

可选任务:从密钥存储中删除证书。

可以通过运行以下命令来检索证书指纹,以便从个人存储中删除密钥对。


Get-ChildItem -Path "Cert:\CurrentUser\My" | Where-Object {$_.Subject -Match "$certname"} | Select-Object Thumbprint, FriendlyName

然后,复制显示的指纹,使用它来删除证书及其私钥。


Remove-Item -Path Cert:\CurrentUser\My\{pasteTheCertificateThumbprintHere} -DeleteKey

了解证书到期日期

按照上述步骤创建的自签名证书具有有限的生存期,之后将会过期。 在 Azure 门户的“应用注册”部分,”证书和机密”屏幕会显示证书的到期日期。 如果你使用 Azure 自动化,则自动化帐户的“证书”屏幕会显示证书的到期日期。 按照前面的步骤创建一个新的自签名证书。