c++ - C++ GRPC客户端与golang服务器连接错误

标签 c++ ssl go grpc

我正在尝试编写一个与 C++ 和 golang 客户端通信的 GRPC 服务器。由于这都是我们系统内部的,因此会有一个自签名证书签署服务器证书,服务器将签署客户端证书。

我能够从 golang 客户端连接到服务器。但是,C++ 客户端没有连接,我从 ssl 层看到了一堆错误。我在配置 C++ grpc 客户端时做错了什么?

(我的证书目前都使用2048位的RSA key )

以下是我认为等效的客户端代码(省略了错误处理):

戈兰:

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);
}

我的错误信息:

C++ 客户端错误消息

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 客户端错误消息

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"

我可以做哪些额外的调试来确定 C++ 客户端在哪里出错?

最佳答案

错误消息是由于所提供的证书在运行 C++ 代码的系统上不受信任而导致的。

如果您使用的是自签名证书,则需要将您的根签名 key 添加到该系统上的 ca 证书,或者配置您的 C++ 代码以读取和识别该根签名 key 。

如果您在代码中提供有关 key 的更多信息(我假设 root.crt 是您的根签名 key ),有人可能会为您提供更具体的帮助。

关于c++ - C++ GRPC客户端与golang服务器连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42963332/

相关文章:

c++ - 在 C++ 中使用一个模板解决循环依赖

ruby-on-rails - 带有 Nginx 和 SSL 握手的 Websockets

r - SSL是否适合发送安全内容?

git - 无法下载依赖项

oracle - 使用 Oracle 使用 INSERT 查询返回值

c++ - 知道用户是否选择了子菜单项 MFC

C++ 动态/静态数组作为函数的参数

C++如何抛弃函数的虚拟性并调用基函数,而不是被覆盖

ssl - Certbot 从 Nginx 将 HTTP 重定向到 HTTPS 不起作用

rest - 试图将字符串转换为实例变量