HTTPSと独自の証明書を使用してGrpc(NuGet> 2.33)クライアント(.NET Framework)をGrpc.Asp.NetCore(NuGet> 2.31)サーバー(.NET 5.0)に接続するにはどうすればよいですか?
例外メッセージ:
Grpc.Core.RpcException: 'Status(StatusCode = "Unavailable"、Detail = "failed to connect to all addresss"、DebugException = "Grpc.Core.Internal.CoreErrorDetailException:{" created ":" @ 1606657072.668000000 "、" description " : "サブチャネルの選択に失敗しました"、 "ファイル": "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}]}") '
GitHubで例を作成しました。この例を使用すると、問題の解決に成功した場合に、簡単に調整したり、遊んだり、この質問に答えたりすることができます。
..。
問題は自分の証明書にあることがわかり、自分でその作品を作成することができず、さまざまな組み合わせを試しました。
この例を使用して証明書を生成しました:gRPCのサーバー側SSLを有効にする方法は?
この例でテストしました: https://github.com/angelagyang/GRPCProtobufExample
回答
問題は証明書とそのCN =にあります。CN =%COMPUTERNAME%はサーバーのDNSまたはIPである必要があります。私の場合、ローカルホストである必要があり、サーバーにはキー(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