如何在生产环境中创建签名证书并在IdentityServer4中使用?

27

IdentityServer4文档网站 上的大部分(所有?)示例代码使用 AddDeveloperSigningCredential(),但建议在生产环境中改用 AddSigningCredential()。我花了比我愿意想象的时间来尝试弄清楚如何实现这一点。

我该如何在生产环境中创建签名证书并在IdentityServer4中使用它?

1个回答

45

创建证书并添加到计算机的证书存储

我决定创建一个证书并将其添加到计算机的证书存储中。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=",这也浪费了一些我的时间。实际上我会在运行时从配置文件中获取名称,但我们不需要在这里讨论这些细节。

2
不需要将签名证书安装到CertStore中。从文件系统中读取它作为文件就足够了。然而,PowerShell方法没有提供一种一步创建文件的方式。但是可以从存储中将其导出到文件中。另一个选择是OpenSSL。还有MakeCert。更多选项在这里 - d_f
2
谢谢,这是一个有用的参考。我决定使用证书存储会更安全,因为系统管理员保存证书文件的位置或密码不安全的可能性较小。而且,现在我知道如何做了,它似乎更加简单明了。 - Rob
我猜只是不同的课程需要不同的工具。 - Rob
1
谢谢,这非常有帮助。您还可以在appsetting.json文件中指定签名证书。 - dobestar
1
关于权限的说明。您可以使用证书管理器而非直接修改 MachineKeys。右键单击新证书,选择“所有任务”>“管理私钥”。从那里,添加应用程序池用户并删除完全控制以仅授予读取权限。 - Rand.Function
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接