gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:52 25 4
gpt4 key购买 nike

我正在尝试编写一个与 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com