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

Rob*_*Rob 18 c# mmc x509 .net-core identityserver4

IdentityServer4 文档站点上的大多数(全部?)示例代码使用AddDeveloperSigningCredential(),但建议AddSigningCredential()在生产中使用。我花了更多的时间来思考如何做到这一点。

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

Rob*_*Rob 33

创建证书并添加到机器的证书库

我决定创建一个证书并将其添加到机器的证书存储中。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"
Run Code Online (Sandbox Code Playgroud)

如果要检查证书是否已正确安装,从运行提示启动“mmc”,转到文件,“添加/删除管理单元”,选择“证书”,单击“添加”,选择“计算机帐户”,下一步, “本地计算机”,完成,OK。然后浏览到 Certificates\Personal\Certificates,应该有一个颁发给 MyIdsvCertificate。

授予证书权限

创建证书后,您需要向运行 IIS 的任何 Windows 身份(或为 IdentityServer 应用程序提供服务的任何身份)授予读取权限,否则当 IdentityServer 尝试使用密钥时,您会收到“密钥集不存在”错误。为此,请找到文件夹 %ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys 找到时间戳与您创建证书的时间相匹配的文件,然后授予对运行 IIS 的 Windows 身份的读取访问权限(无需其他任何内容)。此问题在 IdentityServer4 GitHub 问题论坛上讨论并由 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
        // ...
    }
Run Code Online (Sandbox Code Playgroud)

请注意,在对 AddSigningCredential() 的调用中需要“CN=”位,这也花费了我一些时间。我实际上是在运行时从配置文件中获取名称的,但我们不需要在这里详细介绍这些细节。

  • 不需要将 *signing* 证书安装到 CertStore 中。从文件系统将其作为文件读取就足够了。然而,powershell 方法不提供一种一步创建文件的方法。但是可以将其从商店导出到文件中。另一种选择是 OpenSSL。仍然是 MakeCert。更多选项[此处](https://medium.com/the-new-control-plane/generating-self-signed-certificates-on-windows-7812a600c2d8) (2认同)
  • 谢谢,这是一个有用的参考。我认为使用证书存储会更安全,因为系统管理员将证书文件保存在不适当的位置或使用不安全的密码的可能性较小。而且,现在我知道了它是如何完成的,它实际上看起来更加简单。 (2认同)