让我们加密 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);
问题是我需要的某些 .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 系列!
我正在为 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);
问题是我需要的某些 .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 系列!