2017-04-13 44 views
3

我正致力于DotNet Core的加密改编,主要来源于这篇出色的文章(https://medium.com/@MaartenSikkema/automatically-request-and-use-lets-encrypt-certificates-in-dotnet-core-9d0d152a59b5)。让我们加密API不返回根证书?

我有它99%的方式;挑战请求被接收并接受,并且我正确地点击了我们的加密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 
======== 

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

回答

2

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

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

如果你正在寻找一个超级真棒方法,使您DOTNET的核心应用HTTPS免费使用让我们的加密,数十间其他现代的钟声和口哨声,我强烈推荐@ Maarten的图书馆(https://github.com/Maarten88/rrod)和博客文章系列!

+0

所以你不得不将它添加到Certes csproj文件中?我不明白这是如何工作的,也许是因为我使用了隐式嵌入.cer文件的不同sdk版本? – Maarten

+0

@Maarten,是的,这是正确的 –

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

+0

很高兴收到你的来信,再次感谢你为这个美好的项目放在一起。是的,那就是我的代码。我可以确认我正在向Let's Encrypt发出正确的证书请求;实际上我只是限制了速度,所以我切换到了分段URL。我相信我的问题是Certes项目中的.cer文件不会作为嵌入式资源包含在我的程序集中(https://github.com/fszlin/certes/issues/4)。我不确定如何包括他们,我正在尝试一切。有任何想法吗?他们将不胜感激。 –

+0

我做到了!见下文。我想知道为什么这不需要包含在你的.csproj中?也许是因为我没有使用Visual Studio IDE –