在 IdentityServer4文档网站 上的大部分(所有?)示例代码使用 AddDeveloperSigningCredential()
,但建议在生产环境中改用 AddSigningCredential()
。我花了比我愿意想象的时间来尝试弄清楚如何实现这一点。
我该如何在生产环境中创建签名证书并在IdentityServer4中使用它?
在 IdentityServer4文档网站 上的大部分(所有?)示例代码使用 AddDeveloperSigningCredential()
,但建议在生产环境中改用 AddSigningCredential()
。我花了比我愿意想象的时间来尝试弄清楚如何实现这一点。
我该如何在生产环境中创建签名证书并在IdentityServer4中使用它?
创建证书并添加到计算机的证书存储
我决定创建一个证书并将其添加到计算机的证书存储中。Brock Allen在2015年的博客文章(这里)中描述了如何使用MakeCert创建证书。但是根据Microsoft MakeCert文档,它现在已被弃用。因此,我决定改用PowerShell New-SelfSignedCertificate应用程序(MS文档)。我将Brock的MakeCert命令转换为使用New-SelfSignedCertificate参数,并最终得到以下PowerShell命令:
New-SelfsignedCertificate
-KeyExportPolicy Exportable
-Subject "CN=MyIdsvCertificate"
-KeySpec Signature
-KeyAlgorithm RSA
-KeyLength 2048
-HashAlgorithm SHA256
-CertStoreLocation "cert:\LocalMachine\My"
如果您想检查证书是否已正确安装,请从运行提示中启动“mmc”,转到“文件”、“添加/删除快捷方式”,选择“证书”,点击添加,选择“计算机帐户”,下一步,“本地计算机”,完成,确定。然后浏览到 Certificates\Personal\Certificates,应该有一个发给MyIdsvCertificate
的证书。
授予证书权限
创建证书后,您需要授予读取权限,以使运行IIS(或服务IdentityServer应用程序的任何内容)的Windows标识可以使用密钥,否则在IdentityServer尝试使用密钥时会出现“密钥集不存在”错误。为此,请找到文件夹 %ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys,找到与您创建证书的时间匹配的时间戳文件,然后授予Windows标识运行IIS的读取访问权限(无需其他任何权限)。这个问题在IdentityServer4 GitHub Issues 论坛上得到了讨论,并由Brock Allen和Dominick Baier解释。如果您像 Brock 或 Dominick 一样聪明,则可能已经足够理解,但像我这样的笨蛋可能会发现在Microsoft支持网站提供的更清晰的解释和解决方案非常有用。
告诉IdentityServer使用证书
现在,重要的工作已经完成。唯一剩下的就是告诉IdentityServer在非开发环境下使用该证书:
public void ConfigureServices(IServiceCollection services)
{
// ...
// Configure some awesome services
// ...
var identityServer = services.AddIdentityServer(...options...)...AddStuff()...;
if (_env.IsDevelopment())
{
identityServer.AddDeveloperSigningCredential();
}
else
{
identityServer.AddSigningCredential("CN=MyIdsvCertificate");
}
// ...
// Configure more awesome services
// ...
}
请注意,在调用AddSigningCredential()
时需要使用"CN=",这也浪费了一些我的时间。实际上我会在运行时从配置文件中获取名称,但我们不需要在这里讨论这些细节。