提问者:小点点

如何将 SSL 证书与 gRPC 和 ASP Net Core 3.0 配合使用?


我正在将服务配置为使用SSL证书。我读过这篇文章:

如何为gRPC启用服务器端SSL?

我猜这是主要代码:

var cacert = File.ReadAllText(@"ca.crt");
var servercert = File.ReadAllText(@"server.crt");
var serverkey = File.ReadAllText(@"server.key");
var keypair = new KeyCertificatePair(servercert, serverkey);
var sslCredentials = new SslServerCredentials(new List<KeyCertificatePair>() { keypair }, cacert, false);

var server = new Server
{
    Services = { GrpcTest.BindService(new GrpcTestImpl(writeToDisk)) },
    Ports = { new ServerPort("0.0.0.0", 555, sslCredentials) }
};
server.Start();

问题是,在我的例子中,我没有以这种方式启动服务,我使用的是kestrel,代码是这样的:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                System.Net.IPAddress miAddress = System.Net.IPAddress.Parse("x.x.x.x");
                //options.Listen(miAddress, 5001, o => o.Protocols = HttpProtocols.Http2);

                options.Listen(miAddress, 5001, l =>
                {
                    l.Protocols = HttpProtocols.Http2;
                    l.UseHttps();
                    });
            });
            webBuilder.UseStartup<Startup>();
        });

在这种情况下,我无法访问SslCredentials,因此我无法创建一个新的。

如何使用kestrel配置我的ssl证书?

谢谢。


共2个答案

匿名用户

你链接的帖子是Grpc的。核心,grpc-dotnet实现的配置是不同的。

此文档和示例应有助于:https://github.com/grpc/grpc-dotnet/blob/dd72d6a38ab2984fd224aa8ed53686dc0153b9da/testassets/InteropTestsWebsite/Program.cs#L55

https://docs.microsoft.com/en-us/aspnet/core/grpc/authn-and-authz?view=aspnetcore-3.1

(换句话说,您可以在服务器端配置证书,就像在任何其他HTTP / 2服务器上配置证书一样 - 在 ASP.NET Core中配置安全连接时没有任何grp特定)。

匿名用户

看起来您错误地通过证书进行身份验证以进行SSL数据加密。如果您只想加密数据通道,最好的做法是使用 Kestrel:

   public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(builder =>
    {
        builder.ConfigureKestrel(options =>
        {
            options.Listen(IPAddress.Loopback, 5005, configure => { configure.UseHttps(); configure.Protocols = HttpProtocols.Http2; });
        });
    });

对UseHttps()的调用使用内部ASP.NETCore的受信任开发证书。

如果您想自己提供一个,请使用即(或其他重载):

public static ListenOptions UseHttps(this ListenOptions listenOptions, X509Certificate2 serverCertificate)