我想使用 .Net 4.8 下我的 Windows 证书存储中的证书建立 GRPC SslCredentials()。此链接非常相似,但没有提供可行的解决方案。
https://github.com/grpc/grpc/issues/8978
我使用类似于以下的代码。 ExportToPEM() 是将证书转换为 PEM 格式的本土尝试,但它不起作用。我希望 GRPC 的 C# 包装器能让这一切变得简单。
var cred = new SslCredentials(GetCertificate());
Channel = new Channel("127.0.0.1", BINDING_PORT, cred);
private static string GetCertificate()
{
var storex = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
storex.Open(OpenFlags.ReadOnly);
var certificatesx = storex.Certificates.Find(X509FindType.FindBySubjectName, CERTIFICATE_SUBJECTNAME, true);
if (certificatesx.Count > 0)
{
foreach (X509Certificate2 cert in certificatesx)
{
if (!string.IsNullOrWhiteSpace(cert.FriendlyName) && cert.FriendlyName == ROOT_CERTIFICATE_FRIENDLYNAME)
{
return ExportToPEM(cert.GetRSAPrivateKey());
}
}
}
...
}
答案 0 :(得分:0)
您是否尝试过 Grpc .Net client fails to connect to server with SSL 给出的 https://stackoverflow.com/users/727250/rene-r 答案中的代码? 它提供证书,您正在提取代码中的密钥,但易于替换。
/// <summary>
/// Export a certificate to a PEM format string
/// </summary>
/// <param name="cert">The certificate to export</param>
/// <returns>A PEM encoded string</returns>
private static string ExportToPem(X509Certificate cert)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine("-----BEGIN CERTIFICATE-----");
builder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert),Base64FormattingOptions.InsertLineBreaks));
builder.AppendLine("-----END CERTIFICATE-----");
return builder.ToString();
}
答案 1 :(得分:0)
我发现 Grpc.Net.Core 的预发布版会自动处理证书并提供 .Net 标准 2.0 支持,但我已经放弃了 GRPC 架构,因为我无法让它在必要的 .Net 4.8 客户端上运行,并且操作系统组合。一位作者指出,我可以让它在最新的 Windows 10 操作系统上运行,但我不能被限制。