ssl HTTP2 .Net Framework与gRPC的问题

bjg7j2ky  于 7个月前  发布在  .NET
关注(0)|答案(2)|浏览(64)

我需要使用gRPC进行双向流,其中客户端是.Net Framework项目,由于遗留问题,无法升级到.NET5+。
当阅读微软文档时,我可以看到应该使用WinHttpRequest(https://learn.microsoft.com/en-us/aspnet/core/grpc/netstandard?view=aspnetcore-5.0)。
但我似乎有一个问题,使用SSL与此设置,有没有人有一个建议,可以做些什么来解决这个问题?
我得到以下错误:
“InvalidOperationException:GrpcChannel不支持具有非空参数的SslCredentials。GrpcChannel使用HttpClient进行gRPC调用,并且HttpClient自动从操作系统证书存储加载根证书。应在HttpClient上配置客户端证书。有关详细信息,请参阅https://aka.ms/aspnet/grpc/certauth
我的服务器设置如下:

let cacert = File.ReadAllText(@"ca.crt");
let servercert = File.ReadAllText(@"server.crt");
let serverkey = File.ReadAllText(@"server.key");

let certificatePair = new KeyCertificatePair(servercert, serverkey);
let certList = new System.Collections.Generic.List<KeyCertificatePair>()
    certList.Add(certificatePair)
let server = new Server()
    server.Services.Add(EventSubscriberService.EventSubscriberServiceMethodBinder.BindService(new EventSubscriber()))
    server.Ports.Add(new ServerPort("localhost", 5001,SslServerCredentials(certList,cacert,false))) 
    |> ignore'''

字符串
客户端使用此设置:

let cacert = File.ReadAllText(@"ca.crt");
let clientcert = File.ReadAllText(@"client.crt");
let clientkey = File.ReadAllText(@"client.key");
let ssl = new SslCredentials(cacert, new KeyCertificatePair(clientcert, clientkey))

let channelOptions = GrpcChannelOptions()
channelOptions.HttpHandler <- new WinHttpHandler()    
channelOptions.Credentials <- ssl

let channel = GrpcChannel.ForAddress("http://127.0.0.1:5001",channelOptions)


它是用F#编写的,但类似于C#代码,如果参考有助于可读性。How to enable server side SSL for gRPC?

x0fgdtte

x0fgdtte1#

也许沿着以下几行(粗略的草案)应该工作:

open System.Net.Http
open Grpc.Net.Client
open System.Security.Cryptography.X509Certificates

let clientCert = new X509Certificate() // create according to your needs
let handler = new HttpClientHandler()
handler.ClientCertificates.Add(clientCert) |> ignore
// insecure, check your custom server cert
handler.ServerCertificateCustomValidationCallback <- fun msg cert chain e -> true
let client = new HttpClient(handler)
let channelOptions = GrpcChannelOptions(HttpClient = client)
let channel = GrpcChannel.ForAddress("http://127.0.0.1:5001", channelOptions)

字符串

ux6nzvsh

ux6nzvsh2#

与@CaringDev写的相同,但对于C#:

using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using Grpc.Net.Client;

namespace IntegrationTests
{
    public class Class
    {
        public void Method()
        {
            var clientCert = new X509Certificate();
            var handler = new HttpClientHandler();
            handler.ClientCertificates.Add(clientCert);
            handler.ServerCertificateCustomValidationCallback = delegate { return true; };
            var client = new HttpClient(handler);
            var channelOptions = new GrpcChannelOptions() { HttpClient = client };
            var channel = Grpc.Net.Client.GrpcChannel.ForAddress("http://127.0.0.1:5001", channelOptions);
        }

        public void Or_GrpcCore_InsteadOf_GrpcNetClient_Namespace()
        {
            /* For HTTP 1 / 1.1 Use Obsolete "Grpc.Core" */
            var channel = new Grpc.Core.Channel(host: "localhost", port: 5001,
                ChannelCredentials.Insecure,
                new ChannelOption[]
                {
                    new ChannelOption(global::Grpc.Core.ChannelOptions.MaxReceiveMessageLength, int.MaxValue)
                });
        }
    }
}

字符串

相关问题