在 .net5 中使用证书
Playing around with certificates in .net5
我正在尝试了解证书,对此的需求源于我几天前的一个想法,即简化向同事订购和交付 SSL 证书的过程。所以我开始研究“到底有多难”?
对于大热心的人来说,整个过程“并不难”,但后来我来到了“生成pfx证书”,用私钥...
代码来自控制台测试应用程序:
创建密钥并存储它。
int keysize = 2048;
CngKeyCreationParameters ckcParams = new CngKeyCreationParameters()
{
ExportPolicy = CngExportPolicies.AllowPlaintextExport,
KeyCreationOptions = CngKeyCreationOptions.None,
KeyUsage = CngKeyUsages.AllUsages,
};
ckcParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(KeySize), CngPropertyOptions.None));
CngKey myCngKey = CngKey.Create(CngAlgorithm.Rsa, KeyName, ckcParams);
byte[] privatePlainTextBlob = myCngKey.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
string privateblob_string = Convert.ToBase64String(privatePlainTextBlob);
// Now I can save the Pkcs8PrivateBlob "somewhere"
稍后我可以拿起它并创建证书请求并通过 API 将其发送到证书服务。
byte[] cngbytes = Convert.FromBase64String( privateblob_string );
CngKey importedkey = CngKey.Import(cngbytes, CngKeyBlobFormat.Pkcs8PrivateBlob, CngProvider.MicrosoftSoftwareKeyStorageProvider);
RSACng rsa = new RSACng(importedkey);
request = new CertificateRequest(
new X500DistinguishedName(order.CertName),
rsa,
HashAlgorithmName.SHA512,
RSASignaturePadding.Pkcs1);
etc....
现在我可以从 API.
下载各种格式的颁发证书
到目前为止,一切都很好。现在我想创建PFX文件和KEY文件。
正在创建 PFX:
// My issued certificate from provider
byte[] PublicKeyStr = System.Text.Encoding.ASCII.GetBytes(CER_STRING);
// pfx
var certificate = new X509Certificate2(PublicKeyStr, string.Empty, X509KeyStorageFlags.Exportable);
byte[] certificateData = certificate.Export(X509ContentType.Pfx, "password");
// Now I have the pfx, but no private key
我显然没有能力解决这个问题。我一直在前往充气城堡,但运气不佳(顺便说一句:他们的文件在哪里?)。
我注意到 .net5 有一个方法,我认为(再次)可以解决这个问题。
X509Certificate2.CreateFromPem(ReadOnlySpan certpem, ReadOnlySpan keypem)
但随后我需要获取 keypem“私钥 pem”。
我的问题很简单:我是否完全误解了或者是否有任何方法可以使用我从 CngKey 存储的信息将所需的私钥添加到 pfx 文件?
我们非常欢迎任何建议、想法、帮助和提示。如此接近却惨遭失败真是太令人沮丧了。
您需要先将 public 证书与私钥相关联,然后才能将其导出为 PFX。
// Key
byte[] cngbytes = Convert.FromBase64String( privateblob_string );
CngKey importedkey = CngKey.Import(cngbytes, CngKeyBlobFormat.Pkcs8PrivateBlob, CngProvider.MicrosoftSoftwareKeyStorageProvider);
RSACng rsa = new RSACng(importedkey);
// Cert
byte[] PublicKeyStr = System.Text.Encoding.ASCII.GetBytes(CER_STRING);
var certificate = new X509Certificate2(PublicKeyStr);
// Together:
X509Certificate2 certWithKey = certificate.CopyWithPrivateKey(rsa);
// PFX:
byte[] pfx = certWithKey.Export(X509ContentType.Pfx, pwd);
我正在尝试了解证书,对此的需求源于我几天前的一个想法,即简化向同事订购和交付 SSL 证书的过程。所以我开始研究“到底有多难”?
对于大热心的人来说,整个过程“并不难”,但后来我来到了“生成pfx证书”,用私钥...
代码来自控制台测试应用程序:
创建密钥并存储它。
int keysize = 2048;
CngKeyCreationParameters ckcParams = new CngKeyCreationParameters()
{
ExportPolicy = CngExportPolicies.AllowPlaintextExport,
KeyCreationOptions = CngKeyCreationOptions.None,
KeyUsage = CngKeyUsages.AllUsages,
};
ckcParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(KeySize), CngPropertyOptions.None));
CngKey myCngKey = CngKey.Create(CngAlgorithm.Rsa, KeyName, ckcParams);
byte[] privatePlainTextBlob = myCngKey.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);
string privateblob_string = Convert.ToBase64String(privatePlainTextBlob);
// Now I can save the Pkcs8PrivateBlob "somewhere"
稍后我可以拿起它并创建证书请求并通过 API 将其发送到证书服务。
byte[] cngbytes = Convert.FromBase64String( privateblob_string );
CngKey importedkey = CngKey.Import(cngbytes, CngKeyBlobFormat.Pkcs8PrivateBlob, CngProvider.MicrosoftSoftwareKeyStorageProvider);
RSACng rsa = new RSACng(importedkey);
request = new CertificateRequest(
new X500DistinguishedName(order.CertName),
rsa,
HashAlgorithmName.SHA512,
RSASignaturePadding.Pkcs1);
etc....
现在我可以从 API.
下载各种格式的颁发证书
到目前为止,一切都很好。现在我想创建PFX文件和KEY文件。
正在创建 PFX:
// My issued certificate from provider
byte[] PublicKeyStr = System.Text.Encoding.ASCII.GetBytes(CER_STRING);
// pfx
var certificate = new X509Certificate2(PublicKeyStr, string.Empty, X509KeyStorageFlags.Exportable);
byte[] certificateData = certificate.Export(X509ContentType.Pfx, "password");
// Now I have the pfx, but no private key
我显然没有能力解决这个问题。我一直在前往充气城堡,但运气不佳(顺便说一句:他们的文件在哪里?)。
我注意到 .net5 有一个方法,我认为(再次)可以解决这个问题。
X509Certificate2.CreateFromPem(ReadOnlySpan certpem, ReadOnlySpan keypem)
但随后我需要获取 keypem“私钥 pem”。
我的问题很简单:我是否完全误解了或者是否有任何方法可以使用我从 CngKey 存储的信息将所需的私钥添加到 pfx 文件?
我们非常欢迎任何建议、想法、帮助和提示。如此接近却惨遭失败真是太令人沮丧了。
您需要先将 public 证书与私钥相关联,然后才能将其导出为 PFX。
// Key
byte[] cngbytes = Convert.FromBase64String( privateblob_string );
CngKey importedkey = CngKey.Import(cngbytes, CngKeyBlobFormat.Pkcs8PrivateBlob, CngProvider.MicrosoftSoftwareKeyStorageProvider);
RSACng rsa = new RSACng(importedkey);
// Cert
byte[] PublicKeyStr = System.Text.Encoding.ASCII.GetBytes(CER_STRING);
var certificate = new X509Certificate2(PublicKeyStr);
// Together:
X509Certificate2 certWithKey = certificate.CopyWithPrivateKey(rsa);
// PFX:
byte[] pfx = certWithKey.Export(X509ContentType.Pfx, pwd);