.NET Framework项目使用gRPC双向流时SSL配置报错如何解决?
解决方案
报错的核心原因是基于HttpClient实现的GrpcChannel不支持直接在Credentials属性传入带自定义证书参数的SslCredentials,所有证书相关配置必须直接配置在绑定的WinHttpHandler实例中,按以下步骤修改即可:
核心修改点
- 移除对
GrpcChannelOptions.Credentials的赋值操作 - 客户端访问地址前缀改为
https而非http - 客户端证书直接加载到
WinHttpHandler.ClientCertificates集合中 - 自签名CA证书需配置服务端证书校验回调处理信任问题
修改后客户端代码
open System.Net.Http open System.Security.Cryptography.X509Certificates open Grpc.Net.Client open System // 加载客户端证书(如果crt+key无法直接加载,可先合并导出为pfx格式后加载) let clientCert = new X509Certificate2(@"client.pfx", "你的pfx导出密码") // 也可以用BouncyCastle库直接读取crt+key组合成X509Certificate2,避免转pfx let cacert = new X509Certificate2(@"ca.crt") let channelOptions = GrpcChannelOptions() let winHttpHandler = new WinHttpHandler() // 添加客户端证书 winHttpHandler.ClientCertificates.Add(clientCert) |> ignore // 自签名证书校验逻辑,如果CA已经导入系统根证书存储可省略此步 winHttpHandler.ServerCertificateCustomValidationCallback <- fun sender cert chain sslPolicyErrors -> if sslPolicyErrors = Net.Security.SslPolicyErrors.None then true else cert.Equals(cacert) // 校验服务端证书是否由指定CA签发 channelOptions.HttpHandler <- winHttpHandler // 地址改为https前缀 let channel = GrpcChannel.ForAddress("https://127.0.0.1:5001", channelOptions)
补充说明
如果不想将crt+key合并为pfx,可以引入BouncyCastle库直接读取两个文件生成X509Certificate2实例,服务端配置无需做任何改动。
内容的提问来源于stack exchange,提问作者tobiasholmdk
相关产品推荐
相关产品推荐

