【问题标题】:Let's Encrypt API not returning root cert?让我们加密 API 不返回根证书?
【发布时间】:2017-09-08 22:36:56
【问题描述】:

我正在为 DotNet Core 改编 Let's Encrypt,这很大程度上源于这篇精彩的帖子 (https://medium.com/@MaartenSikkema/automatically-request-and-use-lets-encrypt-certificates-in-dotnet-core-9d0d152a59b5)。

我已经完成了 99% 的任务;收到并接受了质询请求,并且我正确地点击了 acme-staging Let's Encrypt API 端点并接收证书。

问题在于,在我从 API 收到的两个证书中,没有一个被视为“根”,即证书 IssuerDN 等于证书 SubjectDN。下面是感兴趣的代码和控制台中的结果行。

var certificates = issuers.Values
            .Select(cert => {
                Console.WriteLine("IssuerDN: " + cert.IssuerDN.ToString());
                Console.WriteLine("SubjectDB: " + cert.SubjectDN.ToString());
                Console.WriteLine("========");
                return new
                {
                    IsRoot = cert.IssuerDN.Equivalent(cert.SubjectDN),
                    Cert = cert
                };
            });
var rootCerts = new HashSet(certificates.Where(c => c.IsRoot).Select(c => new TrustAnchor(c.Cert, null)));



IssuerDN: CN=Fake LE Root X1
SubjectDN: CN=Fake LE Intermediate X1
========
IssuerDN: CN=Fake LE Root X1
SubjectDN: CN=Fake LE Intermediate X1
========

因为没有根证书,ACME 客户端中断。我相信我已经遵循了上述教程中的每一步,但是任何想法为什么没有具有相同 IssuerDN 和 SubjectDN 的证书?感谢您的宝贵时间。

【问题讨论】:

    标签: c# ssl https .net-core lets-encrypt


    【解决方案1】:

    问题是我需要的某些 .cer 依赖项未标记为嵌入式资源。我使用的代码利用这个名为 Certes (https://github.com/fszlin/certes) 的库来处理 ACME 通信。我使用 DotNet Core 和 VS Code,这意味着我必须手动添加到 csproj:

    <ItemGroup>
         <EmbeddedResource Include="**/*.cer" />
    </ItemGroup>
    

    如果您正在寻找一种超级棒的方式来让您的 DotNet Core 应用程序免费使用 Let's Encrypt,以及其他许多现代花里胡哨,我强烈推荐 @Maarten 的库 (https://github.com/Maarten88/rrod) 和博客文章系列!

    【讨论】:

    • 所以您必须将其添加到 Certes csproj 文件中?我不明白这对我来说是如何工作的,也许是因为我使用的是隐式嵌入 .cer 文件的不同 sdk 版本?
    【解决方案2】:

    感谢您对我的博文的称赞!

    您为什么要尝试获取多个证书?它应该工作的方式是,如果您传入多个域,它应该生成一个 single cert,其中包含 multiple Alternative names。示例代码如下:

    var csr = new CertificationRequestBuilder();
    csr.AddName("CN", domainNames.First()); // "www.my_domain.com";
    foreach (var alternativeName in domainNames.Skip(1))
    {
        csr.SubjectAlternativeNames.Add(alternativeName);
    }
    var cert = await client.NewCertificate(csr);
    
    // Export Pfx
    var pfxBuilder = cert.ToPfx();
    var pfx = pfxBuilder.Build(domainNames.First(), acmeSettings.PfxPassword);
    

    在此处查看示例代码: https://github.com/Maarten88/rrod/blob/master/src/Webapp/Services/AcmeCertificateManager.cs#L148-L158

    【讨论】:

    • 很高兴收到您的来信,再次感谢您为您完成的这个精彩项目。是的,这正是我拥有的代码。我可以确认我正在向 Let's Encrypt 发出正确的证书请求;事实上,我只是受到了速率限制,所以我切换到了暂存 URL。我相信我的问题是 Certes 项目中的 .cer 文件没有作为嵌入资源包含在我的程序集中 (github.com/fszlin/certes/issues/4)。我不确定如何包含它们,我正在尝试一切。有任何想法吗?他们将不胜感激。
    • 我做到了!见下文。我想知道为什么这不需要包含在您的 .csproj 中?可能是因为我没有使用 Visual Studio IDE
    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多