我正在修改Let's Encrypt for DotNet Core,这很大程度上源于这篇很棒的帖子(https://medium.com/@MaartenSikkema/automatically-request-and-use-lets-encrypt-certificates-in-dotnet-core-9d0d152a59b5)。
我有99%的路在那里;收到并接受质询请求,我正确地访问了极致的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的证书?谢谢你的时间。
答案 0 :(得分:2)
问题是我需要的某些.cer依赖项未标记为嵌入式资源。我使用的代码利用这个名为Certes(https://github.com/fszlin/certes)的库来处理ACME通信。我使用DotNet Core和VS Code,这意味着我必须手动添加到csproj中:
maven
如果您正在寻找一种超级棒的方式,使用Let's Encrypt免费提供您的DotNet Core应用程序HTTPS,以及其他几十种现代的花哨,我强烈推荐@ Maarten的库(https://github.com/Maarten88/rrod)和博文系列!
答案 1 :(得分:1)
感谢我在博客上的称赞!
为什么要尝试获得多个证书?它的工作方式是,如果您传入多个域,它应该生成单一证书,其中包含多个替代名称。示例代码如下:
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