2017-03-22 7 views
0

Ich versuche, einen GRPC-Server zu schreiben, der sowohl mit einem C++ - als auch einem Golang-Client kommuniziert. Da dies alles intern in unserem System ist, wird es ein selbstsigniertes Zertifikat geben, das das Serverzertifikat signiert, und der Server wird die Clientzertifikate signieren.Verbindungsfehler zwischen C++ - GRPC-Client und Golang-Server

Ich kann vom Golang-Client eine Verbindung zum Server herstellen. Der C++ - Client verbindet sich jedoch nicht, und ich sehe eine Reihe von Fehlern von der SSL-Ebene. Was mache ich falsch in meiner Konfiguration des C++ Grpc-Clients?

(Meine Zertifikate verwenden alle einen 2048bit RSA-Schlüssel für jetzt) ​​

Hier sind die Client-Codes, die ich dachte, waren gleichwertig (Fehler elided Abwicklung):

Golang:

import (
    "crypto/tls" 
    "io/ioutil" 
    "google.golang.org/grpc" 
    "google.golang.org/grpc/credentials" 
) 

func getConnection(hostPort string) (*grpc.ClientConn, error) { 
    var config tls.Config 
    cert, _ := tls.LoadX509KeyPair("client.crt", "client.key") 
    config.Certificates = append(config.Certificates, cert) 
    b, _ := ioutil.ReadFile("root.crt") 
    config.RootCAs.AppendCertsFromPEM(b) 

    options := grpc.WithTransportCredentials(credentials.NewTLS(config)) 
    return grpc.Dial(hostPort, options) 
} 

C++:

#include <fstream> 
#include <string> 
#include <grpc++/grpc++.h> 

std::shared_ptr<grpc::Channel> get_connection(const std::string& host_port) { 
    auto contents = [](const std::string& filename) -> std::string { 
     std::ifstream fh(filename); 
     std::stringstream buffer; 
     buffer << fh.rdbuf(); 
     fh.close(); 
     return buffer.str(); 
    }; 

    auto ssl_options = grpc::SslCredentialsOptions(); 
    ssl_options.pem_cert_chain = contents("client.crt"); 
    ssl_options.pem_private_key = contents("client.key"); 
    ssl_options.pem_root_certs = contents("root.crt"); 
    auto creds = grpc::SslCredentials(ssl_options); 
    auto channel = grpc::CreateChannel(hostport, creds); 
} 

Meine Fehlermeldungen:

C++ Fehler-Client-Nachrichten

D0322 14:42:12.882767371 11701 env_linux.c:77]    Warning: insecure environment read function 'getenv' used 
getting job record 
E0322 14:42:12.930157873 11701 ssl_transport_security.c:945] Handshake failed with fatal error SSL_ERROR_SSL: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed. 
E0322 14:42:12.930231627 11701 handshake.c:128]   Security handshake failed: {"created":"@1490218932.930210185","description":"Handshake failed","file":"src/core/lib/security/transport/handshake.c","file_line":264,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"} 
E0322 14:42:12.964082644 11701 ssl_transport_security.c:945] Handshake failed with fatal error SSL_ERROR_SSL: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed. 
E0322 14:42:12.964134746 11701 handshake.c:128]   Security handshake failed: {"created":"@1490218932.964114213","description":"Handshake failed","file":"src/core/lib/security/transport/handshake.c","file_line":264,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"} 
std::string JobServerClient::getJobRecord(const string&) const: GRPC connection error 14 [] 

Golang Client-Fehlermeldungen

2017/03/22 17:42:12 grpc: Server.Serve failed to create ServerTransport: connection error: desc = "transport: EOF" 
2017/03/22 17:42:12 grpc: Server.Serve failed to create ServerTransport: connection error: desc = "transport: EOF" 

Welche zusätzlichen Debuggen kann ich feststellen, tun, wo die C++ Client schief gehen?

Antwort

1

Die Fehlermeldung wird dadurch verursacht, dass das vorgestellte Zertifikat auf dem System, auf dem der C++ - Code ausgeführt wird, nicht vertrauenswürdig ist.

Wenn Sie ein selbstsigniertes Zertifikat verwenden, müssen Sie entweder den Stammsignierungsschlüssel zu den CA-Zertifikaten auf diesem System hinzufügen oder Ihren C++ - Code zum Lesen und Erkennen dieses Stammsignierungsschlüssels konfigurieren.

Wenn Sie weitere Informationen zu den Schlüsseln in Ihrem Code angeben (ich nehme an, dass root.crt Ihr root-Signaturschlüssel ist), kann Ihnen jemand möglicherweise spezifischere Hilfe geben.

+0

Verstehen Sie, warum die Golang Client-Version die Verbindung mit meinem selbstsignierten Stammzertifikat akzeptiert? – dbn

+0

Es sieht aus, dass Go-Client auch ein Problem mit der Verbindung hat, Sie müssen die Fehler überprüfen, wenn Sie das Zertifikat laden, und ca, Sie überprüfen keinen möglichen Fehler in beiden Codes – Motakjuq