如何创建签名证书并在生产中的 IdentityServer4 中使用它?
How to create a signing certificate and use it in IdentityServer4 in production?
IdentityServer4 docs site 上的大部分(全部?)示例代码使用 AddDeveloperSigningCredential()
,但建议在生产中使用 AddSigningCredential()
。我花了比我想的更多的时间来尝试弄清楚如何做到这一点。
如何创建签名证书并在生产中的 IdentityServer4 中使用它?
创建证书并添加到计算机的证书存储区
我决定创建一个证书并将其添加到机器的证书存储中。 Brock Allen 有一个 2015 年的博客 post here describing how to create the certificate using MakeCert. However according to the Microsoft MakeCert documentation it is now deprecated. So I decided to use the PowerShell New-SelfSignedCertificate applet instead (MS docs)。我翻译了 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”,转到文件,“Add/Remove 管理单元”,select “证书”,点添加,select“计算机帐户”,下一步,“本地计算机”,完成,确定。然后浏览到Certificates\Personal\Certificates,应该有一个发给MyIdsvCertificate
.
授予证书权限
创建证书后,您需要授予任何 Windows 身份的读取权限 运行 IIS(或为您的 IdentityServer 应用程序提供服务的任何内容),否则您会收到“密钥集不存在” " 当 IdentityServer 尝试使用密钥时出错。为此,找到文件夹 %ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys 找到时间戳与您创建证书的时间匹配的文件,然后授予 read 访问(不需要其他任何东西)Windows 身份 运行 IIS。讨论这个问题on the IdentityServer4 GitHub Issues forum and explained by Brock Allen and Dominick Baier. If you're a genius like Brock or Dominick then that explanation might have been enough, but dummies like me might find the clearer explanation and solution provided to a very similar issue on the Microsoft Support site更有用。
告诉 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=”位,这也花费了我一些时间。我实际上是在运行时从配置文件中获取名称的,但我们不需要在这里讨论这些细节。
IdentityServer4 docs site 上的大部分(全部?)示例代码使用 AddDeveloperSigningCredential()
,但建议在生产中使用 AddSigningCredential()
。我花了比我想的更多的时间来尝试弄清楚如何做到这一点。
如何创建签名证书并在生产中的 IdentityServer4 中使用它?
创建证书并添加到计算机的证书存储区
我决定创建一个证书并将其添加到机器的证书存储中。 Brock Allen 有一个 2015 年的博客 post here describing how to create the certificate using MakeCert. However according to the Microsoft MakeCert documentation it is now deprecated. So I decided to use the PowerShell New-SelfSignedCertificate applet instead (MS docs)。我翻译了 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”,转到文件,“Add/Remove 管理单元”,select “证书”,点添加,select“计算机帐户”,下一步,“本地计算机”,完成,确定。然后浏览到Certificates\Personal\Certificates,应该有一个发给MyIdsvCertificate
.
授予证书权限
创建证书后,您需要授予任何 Windows 身份的读取权限 运行 IIS(或为您的 IdentityServer 应用程序提供服务的任何内容),否则您会收到“密钥集不存在” " 当 IdentityServer 尝试使用密钥时出错。为此,找到文件夹 %ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys 找到时间戳与您创建证书的时间匹配的文件,然后授予 read 访问(不需要其他任何东西)Windows 身份 运行 IIS。讨论这个问题on the IdentityServer4 GitHub Issues forum and explained by Brock Allen and Dominick Baier. If you're a genius like Brock or Dominick then that explanation might have been enough, but dummies like me might find the clearer explanation and solution provided to a very similar issue on the Microsoft Support site更有用。
告诉 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=”位,这也花费了我一些时间。我实际上是在运行时从配置文件中获取名称的,但我们不需要在这里讨论这些细节。