Wie verbinde ich einen Grpc-Client (NuGet> 2.33) (.NET Framework) mit einem Grpc.Asp.NetCore-Server (NuGet> 2.31) (.NET 5.0) unter Verwendung von HTTPS und meinem eigenen Zertifikat?
Ausnahmemeldung:
Grpc.Core.RpcException: 'Status (StatusCode = "Nicht verfügbar", Detail = "Verbindung zu allen Adressen konnte nicht hergestellt werden", DebugException = "Grpc.Core.Internal.CoreErrorDetailException: {" created ":" @ 1606657072.668000000 "," description " : "Unterkanal konnte nicht ausgewählt werden", "Datei": "T: \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filter \ client_channel \ client_channel.cc", "file_line": 4166, "referenced_errors": [ {"created": "@ 1606657072.668000000", "description": "Verbindung zu allen Adressen konnte nicht hergestellt werden", "file": "T: \ src \ github \ grpc \ workspace_csharp_ext_windows_x86 \ src \ core \ ext \ filter \ client_channel \ lb_policy \ pick_first \ pick_first.cc "," file_line ": 398," grpc_status ": 14}]}") '
Ich habe auf GitHub ein Beispiel erstellt, mit dem Sie diese Frage einfach optimieren, spielen und beantworten können, wenn Sie das Problem erfolgreich lösen können.
grpc_certifier_example
...
Ich habe herausgefunden, dass das Problem in meinen eigenen Zertifikaten liegt und ich kann keine eigene erstellen, die funktioniert, habe zahlreiche Kombinationen ausprobiert.
Ich habe dieses Beispiel verwendet, um meine Zertifikate zu generieren: Wie aktiviere ich serverseitiges SSL für gRPC?
und testete es an diesem Beispiel: https://github.com/angelagyang/GRPCProtobufExample
Antworten
Das Problem liegt im Zertifikat und dessen CN =. CN =% COMPUTERNAME% muss Server-DNS oder IP sein, in meinem Fall musste es localhost sein und der Server muss ein Zertifikat mit dem Schlüssel (pfx) haben. Das Hauptproblem besteht darin, dass die Ausnahme ohne relevante Erklärung ausgelöst wird.
Klient:
//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());
Server:
//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);
};
});
});
Erstellung von Zertifikaten:
@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