【发布时间】:2020-10-27 19:31:53
【问题描述】:
我创建了一个自签名证书。后来我创建了一个需要证书和密钥文件的谷歌 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 不等于 serverkey。但从 grpc 服务接受。
【问题讨论】:
-
key 的填充模式可能与使用 JSON 和 c# 的应用程序不同。填充将随机字节添加到密钥的末尾以使密钥看起来像固定大小(256,512、1024),从而使黑客更难确定密钥的大小。 JSON 和 c# 模式是不同的。因此,您可能会遇到键匹配问题。
标签: c# .net-core certificate grpc x509certificate2