在 .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);