.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 证书中获取正确的密钥?
我试过的第一个答案是:
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
选项。
我创建了一个自签名证书。后来我创建了一个需要证书和密钥文件的 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 证书中获取正确的密钥?
我试过的第一个答案是:
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
选项。