【问题标题】:.net core get certificate private key to work with GRPC.net 核心获取证书私钥以使用 GRPC
【发布时间】: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 证书中获取正确的密钥?

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 不等于 serverkey。但从 grpc 服务接受。

【问题讨论】:

  • key 的填充模式可能与使用 JSON 和 c# 的应用程序不同。填充将随机字节添加到密钥的末尾以使密钥看起来像固定大小(256,512、1024),从而使黑客更难确定密钥的大小。 JSON 和 c# 模式是不同的。因此,您可能会遇到键匹配问题。

标签: c# .net-core certificate grpc x509certificate2


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2014-08-19
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多