【问题标题】:SSL Certification for GRPCGRPC 的 SSL 认证
【发布时间】:2019-07-05 14:08:15
【问题描述】:

您能帮我进行 gRPC 服务器的 ssl 认证吗?

这就是我使用 C# Core Console 应用程序的方式:

const int Port = 50051;
const string host = "127.0.0.1";

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


var server = new Server()
{
    // setup host, port and server credentials
    Ports = { new ServerPort(host, Port, sslCredentials) },
    // register the service we built earlier
    Services = { Messages.BindService(new MessagesImpl()) }
};

server.Start();

不知道如何在ASP.NET core gRPC Server中提供SslServerCredentials?

通过在配置部分添加 Stattup.cs 文件来启动 cRPG 服务器:

public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        // Communication with gRPC endpoints must be made through a gRPC client.
        // To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909
        endpoints.MapGrpcService<ServiceBaaseClass>();
    });
}

【问题讨论】:

    标签: c# asp.net-core grpc


    【解决方案1】:

    您应该在构建主机时配置 https。如果您使用的是 grpc 模板,那在 Program.cs 中。

    例子:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(options =>
                {
                    options.ListenLocalhost(50051, listenOptions =>
                    {
                        listenOptions.Protocols = HttpProtocols.Http2;
                        var cert = new X509Certificate2("localhost.pfx", "test");
    
                        listenOptions.UseHttps(cert);                    
                    });
                });                   
    
                webBuilder.UseStartup<Startup>();
            });
    

    我有一个这样生成的 pfx 文件:

    openssl req -new -x509 -newkey rsa:2048 -keyout localhost.key -out localhost.cer -days 365 -subj /CN=localhost
    openssl pkcs12 -export -out localhost.pfx -inkey localhost.key -in localhost.cer
    

    【讨论】:

    • 谢谢。我创建了新证书并将它们转换为 pfx 文件。 gRPC 服务器运行没有任何错误。现在我如何将这些证书文件与客户端一起使用?我是认证和 .net 核心的新手。
    • 您是否正在尝试使用客户端证书进行身份验证?在我假设您只想要与 grpc 服务的加密连接之前。如果您尝试使用证书进行身份验证,请查看:docs.microsoft.com/en-us/aspnet/core/security/authentication/… 我将在今天晚些时候编辑我的帖子以包含此内容,但从文档中应该不难做到。
    • 首先我使用 ca.crt、server.crt、server.key 创建了服务器来获取 sslServerCredentials,然后在客户端我使用 ca.crt、client.crt、client.key 作为 sslCredentials 这个解决方案适用于 .NET Core 控制台应用程序。但是在 ASP .Net 控制台核心应用程序中,我需要像您建议的那样使用 ConfigureWebHostDefaults 来做到这一点。我使用 server.crt 和 server.key 创建了 pfx 文件。我正在构建 rpc 服务,其中大多数 rpc 将是服务器,但具有更复杂逻辑的一个将是服务器/客户端以及使用其他 rpc 服务。您对此设置有什么建议?
    【解决方案2】:

    也许你可以像我一样尝试。 首先,您应该将此配置添加到您的 appsettings.json

    },
      "AllowedHosts": "*",
      "Kestrel": {
        "EndpointDefaults": {
          "Protocols": "Http2"
        },
        "EndPoints": {
          "Https": {
            "Url": "https://*:5002",
            "Certificate": {
              "Path": "c:\\test.pfx",
              "Password": "password1234"
            }
          }
        }
      },
      "token": "DO6&gkOK5%$fRD#eRt$",
    }
    

    该证书可以通过多种方式生成。 IIS 或 powershell 命令。此代码位于驱动器 c: 中,仅用于测试。

    那么你应该在 Program.main 上得到这样的令牌值:

    IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
                // Duplicate here any configuration sources you use.
                configurationBuilder.AddJsonFile("AppSettings.json");
                IConfiguration configuration = configurationBuilder.Build();
    
                string token = configuration["token"];
    

    有人说这个令牌不应该在配置文件中,但现在我不知道该放在哪里。您还应该对此进行调查。如果你不介意告诉我:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多