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?
Verstehen Sie, warum die Golang Client-Version die Verbindung mit meinem selbstsignierten Stammzertifikat akzeptiert? – dbn
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