我正在我自己的根CA下设置一台服务器,以在.NET Core下即时生成SSL证书。
我可以使用shipped_Date
类生成自签名证书。但是,拥有我自己的根CA的客户端显然不信任这些证书。我正在使用CertificateRequest
方法来执行此操作。但是,我不能使用我的根CA来签署这些新证书。使用CertificateRequest.CreateSelfSigned()
方法将生成我的新证书,但不会提供私钥。
CertificateRequest.Create()
使用public static X509Certificate2 CreateSelfSignedCertificate(string domain)
{
SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddDnsName(domain);
X500DistinguishedName distinguishedName = new X500DistinguishedName($"CN=On-The-Fly Generated Cert");
using (RSA rsa = RSA.Create(2048))
{
var request = new CertificateRequest(distinguishedName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
request.CertificateExtensions.Add(
new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature, false));
request.CertificateExtensions.Add(
new X509EnhancedKeyUsageExtension(
new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, false));
request.CertificateExtensions.Add(sanBuilder.Build());
var ca = new X509Certificate2(File.ReadAllBytes(@"E:\testing_ca_certificate.pfx"), "password"); //Open my root CA cert, generated in OpenSSL
//Generates a cert, but does not provide a private key.
var certificate = request.Create(ca, new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(365)), new byte[] { 0, 1, 2, 3 });
//Generates a usable cert, but is not under my root CA
//var certificate = request.CreateSelfSigned(new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(365)));
return new X509Certificate2(certificate.Export(X509ContentType.Pfx, "password"), "password", X509KeyStorageFlags.DefaultKeySet);
}
}
方法,我获得了没有私钥的有效证书。我应该拥有此私钥,以便可以加密SSL通信。
答案 0 :(得分:0)
鉴于证书请求是使用您的rsa
实例创建的,因此您应该能够从中导出私钥。 RSA.ToXmlString()
允许将密钥导出为以后可以使用RSA.FromXmlString()
导入的格式。
答案 1 :(得分:0)
使用
CertificateRequest.Create()
方法,我获得了没有私钥的有效证书。
真实证书颁发机构不应具有CA的私钥以及与要在同一位置同时创建的证书相匹配的私钥。除了目前尚无办法解码认证请求(CSR)的事实外,该方法还假定它与提供给CertificateRequest构造函数的仅公用密钥一起使用。
遵循流程,“预期”模型为:
CertificateRequest
对象CertificateRequest.Create()
的证书cert.RawData
)X509Certificate2
实例(仅具有公共密钥)CopyWithPrivateKey
(扩展名)方法将私钥与新的证书对象相关联。所以,之后
//Generates a cert, but does not provide a private key.
var certificate = request.Create(ca, new DateTimeOffset(DateTime.UtcNow.AddDays(-1)), new DateTimeOffset(DateTime.UtcNow.AddDays(365)), new byte[] { 0, 1, 2, 3 });
您应该添加
certificate = certificate.CopyWithPrivateKey(rsa);
(尽管,实际上,您应该在using
语句中放置证书对象,以便在不再需要它们时将其丢弃,在这种情况下,您需要第二个变量来保存带证书的证书)< / p>