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 addresses", 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}]}") '
GitHub 에서 문제를 해결하는 데 성공하면이 질문을 쉽게 조정하고, 놀며, 대답 할 수 있는 예제를 만들었습니다 .
...
나는 문제가 내 인증서에 있다는 것을 알았고 내 자신의 작품을 만들 수 없으며 수많은 조합을 시도했습니다.
이 예제를 사용하여 인증서를 생성 했습니다. gRPC에 대해 서버 측 SSL을 활성화하는 방법은 무엇입니까?
이 예제에서 테스트했습니다. https://github.com/angelagyang/GRPCProtobufExample
답변
문제는 인증서와 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