【问题标题】:How to create a signing certificate and use it in IdentityServer4 in production?如何创建签名证书并在生产中的 IdentityServer4 中使用它?
【发布时间】:2020-01-27 21:53:01
【问题描述】:

IdentityServer4 docs site 上的大多数(全部?)示例代码使用AddDeveloperSigningCredential(),但建议在生产中使用AddSigningCredential()。我花了更多的时间来尝试弄清楚如何做到这一点。

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

【问题讨论】:

    标签: c# .net-core identityserver4 x509 mmc


    【解决方案1】:

    创建证书并添加到机器的证书存储区

    我决定创建一个证书并将其添加到机器的证书存储中。 Brock Allen 有一篇 2015 年的博客文章 here,描述了如何使用 MakeCert 创建证书。但是根据Microsoft MakeCert documentation,它现在已被弃用。所以我决定改用 PowerShell New-SelfSignedCertificate 小程序 (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”,转到文件,“添加/删除管理单元”,选择“证书”,单击“添加”,选择“计算机帐户” ,下一步,“本地计算机”,Finish,OK。然后浏览到Certificates\Personal\Certificates,应该有一个发给MyIdsvCertificate

    授予证书权限

    创建证书后,您需要向运行 IIS 的任何 Windows 身份(或为您的 IdentityServer 应用程序提供服务的任何身份)授予读取权限,否则当 IdentityServer 尝试使用该密钥时,您会收到“密钥集不存在”错误。为此,请找到文件夹 %ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys 找到时间戳与您创建证书的时间相匹配的文件,然后授予 读取 访问权限(不需要其他任何东西)到运行 IIS 的 Windows 身份。这个问题在on the IdentityServer4 GitHub Issues forum 进行了讨论,并由 Brock Allen 和 Dominick Baier 进行了解释。如果您是像 Brock 或 Dominick 这样的天才,那么这种解释可能就足够了,但像我这样的傻瓜可能会发现在 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=”位,这也花费了我一些时间。我实际上是在运行时从配置文件中获取名称的,但我们不需要在这里详细介绍。

    【讨论】:

    • 不需要将 signing 证书安装到 CertStore。从文件系统中将其作为文件读取就足够了。但是,powershell 方法不提供一步创建文件的方法。但是,可以将其从商店导出到文件中。另一种选择是 OpenSSL。仍然是 MakeCert。更多选项here
    • 谢谢,这是一个有用的参考。我决定使用证书存储会更安全,因为系统管理员将证书文件保存在不适当的位置或使用不安全的密码的可能性较小。此外,现在我知道它是如何完成的,它实际上看起来更简单。
    • 呵呵,生产管理员通常使用经过验证的脚本和图像,当我们考虑跨平台时,文件方法更直接,但在 Windows 上,商店可能仍然有效:)
    • 我猜只是不同课程的不同马匹。
    • 谢谢,这很有帮助。您也可以在 appsetting.json 文件中指定签名证书
    猜你喜欢
    • 2012-08-03
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2012-11-28
    • 2019-11-07
    相关资源
    最近更新 更多