【问题标题】:How to connect Grpc (NuGet >2.33) client (.NET Framework) with Grpc.Asp.NetCore (NuGet >2.31) server (.NET 5.0) using HTTPS and my own certificate?如何使用 HTTPS 和我自己的证书将 Grpc (NuGet >2.33) 客户端 (.NET Framework) 与 Grpc.Asp.NetCore (NuGet >2.31) 服务器 (.NET 5.0) 连接起来?
【发布时间】:2021-03-11 10:10:03
【问题描述】:

异常信息:

Grpc.Core.RpcException: 'Status(StatusCode="Unavailable", Detail="无法连接到所有地址", DebugException="Grpc.Core.Internal.CoreErrorDetailException: {"created":"@1606657072.668000000", "description":"无法选择子频道","file":"T:\src\github\grpc\workspace_csharp_ext_windows_x86\src\core\ext\filters\client_channel\client_channel.cc","file_line":4166,"referenced_errors ":[{"created":"@1606657072.668000000","description":"连接所有地址失败","file":"T:\src\github\grpc\workspace_csharp_ext_windows_x86\src\core\ext\filters\ client_channel\lb_policy\pick_first\pick_first.cc","file_line":398,"grpc_status":14}]}")'

我创建了一个example on GitHub,如果你成功解决了这个问题,你可以轻松地调整、使用它并回答这个问题。

grpc_certifier_example

...

我发现问题出在我自己的证书上,我无法创建自己的作品,尝试了多种组合。

我已使用此示例生成我的证书:How to enable server side SSL for gRPC?

并在此示例中对其进行了测试:https://github.com/angelagyang/GRPCProtobufExample

【问题讨论】:

  • 不,没有适用于这种情况的答案。
  • 您是否打算使用客户端身份验证 (mTLS)? (您的问题标题仅提及一个证书)
  • 对于初学者,我需要任何使用 HTTPS 的解决方案,首先是最简单的解决方案,然后在此基础上进行构建。我需要这个例子才能成功使用 HTTPS。
  • 我的目标是拥有一个可以连接到我的服务的应用程序。我不希望通过用户干预来计算该秘密,因为它需要在任何用户干预之前和在任何 PC 上工作,而无需在该设备之前安装任何东西,而且我还希望能够使用我自己的不受信任的证书CA,我不需要那个。是一种软件更新服务,类似于click-once的软件更新解决方案...

标签: c# .net grpc .net-5 .net-framework-4.8


【解决方案1】:

问题出在证书及其 CN= 上。 CN=%COMPUTERNAME% 必须是服务器 DNS 或 IP,在我的情况下,它必须是 localhost 并且服务器需要具有带有密钥 (pfx) 的证书。 主要问题是它抛出了没有相关解释的异常。

客户:

                //THIS IS YOUR CLIENT'S CERTIFICATE AND IT'S KEY
                var keyCertPair = new KeyCertificatePair(File.ReadAllText($"{rootDir}/samplecert.pem.txt"), File.ReadAllText($"{rootDir}/samplecert.key.txt"));
                //GetRootCertificates() GETS THE CA CERTIFICATE, NOT THE CLIENT CERTIFICATE NOR SERVER CERTIFICATE
                var channelCreds = new SslCredentials(GetRootCertificates(), keyCertPair);
                //YOU DON'T EVEN NEED TO PROVIDE KeyCertificatePair, IT WORKS WITH JUST A CA ROOT
                var channelCreds = new SslCredentials(GetRootCertificates());

服务器:

                //LoadSSLCertificate() GETS THE SERVER CERTIFICATE
                var sslCertificate = LoadSSLCertificate(); 
                o.ListenAnyIP(5001, listenOptions =>
                {
                    listenOptions.UseHttps(sslCertificate, httpsOptions =>
                    {
                        httpsOptions.SslProtocols = SslProtocols.Tls12;
                        httpsOptions.ClientCertificateMode = ClientCertificateMode.NoCertificate;
                        httpsOptions.ClientCertificateValidation = (certificate, chain, errors) =>
                        {
                            return true;
                            //return certificate.Thumbprint.Equals(_clientThumbprint, StringComparison.OrdinalIgnoreCase);
                        };
                    });
                });

证书创建:

@echo off
REM set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg   

echo Generate CA key:
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096

echo Generate CA certificate:
openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj  "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=MyRootCA"

echo Generate server key:
openssl genrsa -passout pass:1111 -des3 -out server.key 4096

echo Generate server signing request:
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj  "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=%COMPUTERNAME%"

echo Self-sign server certificate:
openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

echo Remove passphrase from server key:
openssl rsa -passin pass:1111 -in server.key -out server.key

echo Generate client key
openssl genrsa -passout pass:1111 -des3 -out client.key 4096

echo Generate client signing request:
openssl req -passin pass:1111 -new -key client.key -out client.csr -subj  "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=%CLIENT-COMPUTERNAME%"

echo Self-sign client certificate:
openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt

echo Remove passphrase from client key:
openssl rsa -passin pass:1111 -in client.key -out client.key

echo Create server.pfx file:
openssl pkcs12 -export -passout pass:1111 -out server.pfx -inkey server.key -in server.crt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2020-07-08
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多