场景:我有一个用C#实现的客户端,应该使用SSL加密的Connection使用gRPC连接到服务器。但是,服务器使用的证书可以是自签名的,也可以不是。
在文档中,我仅看到我可以使用自定义根证书(或使用不会验证自签名证书的公共根CA)来设置不安全(完全没有SSL)或安全的通道凭据),这实际上意味着我必须确保以root用户身份安装自签名服务器证书。基本上,我该如何以编程方式做到这一点?
var channelCredentials = new SslCredentials(rootAsPem);
// FIXME: specify that channelCredentials can accept self-signed certificates or fetch certificates?
var channel = new Channel("myservice.example.com", channelCredentials);
var client = new Greeter.GreeterClient(channel);
我要实现的是询问用户,例如“嘿,您配置的服务器使用自签名证书,您同意吗?”如果是这样,请在PEM中将证书安装为根证书。
我现在的主要问题是:
答案 0 :(得分:2)
var httpClientHandler = new HttpClientHandler();
// Return `true` to allow certificates that are untrusted/invalid
httpClientHandler.ServerCertificateCustomValidationCallback =
HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
var httpClient = new HttpClient(httpClientHandler);
var channel = GrpcChannel.ForAddress("https://localhost:5001",
new GrpcChannelOptions { HttpClient = httpClient });
var client = new Greet.GreeterClient(channel);
https://docs.microsoft.com/en-us/aspnet/core/grpc/troubleshoot?view=aspnetcore-3.0
答案 1 :(得分:2)
我遇到了类似的问题,终于找到了一种在两者之间建立HTTP连接的解决方案
解决方案的关键是首先在gRPC目标服务器上使用常规object.resetMatrix();
object.rotateX(ConvertToRadians(pitch));
和HttpClient
下载服务器证书。通过Get
及其HttpClientHandler
,您可以获得服务器的X509证书,并检查它是否是自签名证书,以提示用户确认可能不安全的连接。如果为Confirmend,则可以将证书导出为PEM格式的字符串,然后在ServerCertifacteCustomValidationCallback
的构造函数中使用它。还有另一件事很重要:证书必须包含DNS名称或您通过其与服务器联系的URL的IP,因为客户端对此进行了检查。通过启用gRPC客户端调试,您可以看到详细的错误:
在这里查看我的更详细的答案:
答案 2 :(得分:0)
对于那些有相同问题的人:不幸的是,目前尚不可能。 C库确实允许这样做,但是C#包装程序却不允许。正在进行拉取请求,但尚未合并:https://github.com/grpc/grpc/pull/17051