让我们加密 API 不返回根证书?

Let's Encrypt API not returning root cert?

我正在为 DotNet Core 编写 Let's Encrypt 的改编版,它在很大程度上源自这个很棒的 post (https://medium.com/@MaartenSikkema/automatically-request-and-use-lets-encrypt-certificates-in-dotnet-core-9d0d152a59b5)。

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

问题是,在我从 API 收到的两个证书中,没有一个被视为 "root",在这种情况下,证书 IssuerDN 等于证书主题 DN。下面是感兴趣的代码和控制台中的结果行。

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 的证书?谢谢你的时间。

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

您为什么要尝试获得多个证书?它应该工作的方式是,如果您传入多个域,它应该生成一个 单一证书 ,其中包含 多个替代名称 。示例代码如下:

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

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

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

如果您正在寻找一种超级棒的方式来使用 Let's Encrypt 免费制作您的 DotNet Core 应用程序 HTTPS,在许多其他现代风吹草动中,我强烈推荐@Maarten 的库 (https://github.com/Maarten88/rrod) 和博客 post 系列!