.net 核心获取证书私钥以与 GRPC 一起工作

.net core get certificate private key to work with GRPC

我创建了一个自签名证书。后来我创建了一个需要证书和密钥文件的 google GRPC 服务器。我尝试从加载的 .net 证书中获取信息。我获得了证书,但密钥文件有问题。我没有从存储的证书中获得正确的密钥格式。

这只是一个例子。通常我想将证书存储在 .net 证书存储中,当创建 grpc 服务 ic 时,我想从存储中读取证书和密钥。有了它,我将实例化服务。

证书创建:

 openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out myCert.crt -keyout myCert.key -config cert.conf
 openssl pkcs12 -export -in myCert.crt -inkey myCert.key -out myCert.pfx -passin pass: -passout pass:

然后我将证书加载为 .net 证书(通常我会从商店获取):

var cert = new X509Certificate2("myCert.pfx", "", X509KeyStorageFlags.Exportable);
// some stringbuild before to add -----BEGIN PRIVATE KEY-----
var privateKeyFromDotNetCert = Convert.ToBase64String(x509Certificate2.GetRSAPrivateKey().ExportRSAPrivateKey());
// for reference read the original key..only to shwo the problem
var serverkey = File.ReadAllText("myCert.key");

privateKeyFromDotNetCert 与原始服务器密钥不同。

稍后我尝试

  var keypair = new KeyCertificatePair(cacert, serverkey);
  var sslCredentials = new SslServerCredentials(new List<KeyCertificatePair> { keypair }, cacert, false);

使用 serverKey 可以正常工作,但不能使用从 .net 证书中提取的密钥。是否可以从 .net 证书中获取正确的密钥?

Cert creation from .net cert

我试过的第一个答案是:

  StringBuilder builder = new StringBuilder();
  builder.Append("-----BEGIN PRIVATE KEY-----");
  builder.AppendLine(Convert.ToBase64String(certificate.GetRSAPrivateKey().ExportPkcs8PrivateKey(),Base64FormattingOptions.InsertLineBreaks));
  builder.Append("-----END PRIVATE KEY-----");

  privateKeyFromDotNetCert = builder.ToString();

这是有效的。 privateKeyFromDotNetCert 不等于服务器密钥。但是从 grpc 服务接受了。

您的评论说您在前面加上 -----BEGIN PRIVATE KEY-----(并且可能会附加 -----END PRIVATE KEY-----),但您选择的导出方法 (ExportRSAPrivateKey) 与该格式不匹配。尝试 ExportPkcs8PrivateKey,它以 PKCS#8 PrivateKeyInfo 格式导出,与 -----BEGIN PRIVATE KEY----- header 匹配。 (ExportRSAPrivateKey 生成 PKCS#1 RSAPrivateKey,即 -----BEGIN RSA PRIVATE KEY-----。)

您可能还想使用 Base64FormattingOptions.InsertLineBreaks 选项。