【发布时间】:2020-03-31 02:41:32
【问题描述】:
我需要生成证书以用于代理之间的安全通信。每个代理都会生成一个证书,并且必须将其发送到另一台机器中的系统 CA,以进行签名(并被其他代理信任)。我正在使用 C# 和以下代理代码:
//generate certificate
ECDsa elipticCurveNistP256Key = ECDsa.Create(ECCurve.CreateFromValue("1.2.840.10045.3.1.7")); // nistP256 curve
CertificateRequest certificateRequest = new CertificateRequest("CN=" + agentId, elipticCurveNistP256Key, HashAlgorithmName.SHA256);
certificateRequest.CertificateExtensions.Add(
new X509BasicConstraintsExtension(false, false, 0, false));
certificateRequest.CertificateExtensions.Add(
new X509KeyUsageExtension(
X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation,
false));
// Add the SubjectAlternativeName extension
var sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddIpAddress(IPAddress.Parse(agentIpAddress));
certificateRequest.CertificateExtensions.Add(sanBuilder.Build());
certificateRequest.CertificateExtensions.Add(
new X509EnhancedKeyUsageExtension(
new OidCollection
{
new Oid("1.3.6.1.5.5.7.3.8")
},
true));
certificateRequest.CertificateExtensions.Add(
new X509SubjectKeyIdentifierExtension(certificateRequest.PublicKey, false));
CA系统的代码如下:
X509Certificate2 signedCertificate = certificateRequest.Create(
caCertificatePFX,
DateTimeOffset.UtcNow.AddDays(-1),
DateTimeOffset.UtcNow.AddDays(30),
new byte[] {1, 2, 3, 4});
当然,我也使用代码来实现机器之间的通信,这里没有展示。但我至少有两个问题:
-
我希望将证书生成和签名完全分开,但即使尝试了很多次,这也是我能设法开始工作的唯一代码。如果我没记错的话,这段代码在 CA 系统上创建了证书,这不是理想的场景(CA 可以访问代理私钥),但如果我没有找到更好的,我可以接受。
第二个问题是,即使我接受第一个问题,我仍然需要将 CertificateRequest 对象从一台机器发送到另一台机器,并且 CertificateRequest 不可序列化。我找到了 CreateSigningRequest() 方法,它“创建一个 ASN.1 DER 编码的 PKCS#10 CertificationRequest 值,表示当前对象的状态。”但是我还没有找到一种方法让它再次成为一个 CertificateRequest 对象,以便我可以运行 CA 系统代码。
有人知道我该怎么做吗?希望将证书生成和证书签名完全分开,但如果这不可能,至少要创建 CertificateRequest 对象。
我正在运行需要维护的 .Net Framework 4.7.2,以便使用以前开发的 Windows 窗体。
谢谢
【问题讨论】:
-
请求/生成证书的步骤随处可见(如help.tableau.com/current/server/en-us/ssl_cert_create.htm)。所以给你的提示是,可以将 CSR 保存为文本文件然后传输。
-
感谢您的提示。我可以保存 CreateSigningRequest() 输出,但我怎样才能重建 CertificateRequest 对象?我无法找到一种方法来做到这一点
-
你将不得不携带和关心很多东西。这包括 PKCS#10、PKCS#7 (CMC) 格式、正确的 CSR 签名等。这是一块薄冰。
标签: c# security x509certificate2