gpt4 book ai didi

ssl - 在 gRPC 客户端服务器通信中使用 SSL

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:58 65 4
gpt4 key购买 nike

我对 SSL/TLS 一无所知,我正尝试按照在线找到的说明在 gRPC 中使用 SSL/TLS channel 。这是服务器代码:

      std::string server_address("0.0.0.0:50051");
GreeterServiceImpl service;

grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp ={"a","b"};
grpc::SslServerCredentialsOptions ssl_opts;
ssl_opts.pem_root_certs="";
ssl_opts.pem_key_cert_pairs.push_back(pkcp);

std::shared_ptr<grpc::ServerCredentials> creds;
creds = grpc::SslServerCredentials(ssl_opts);

ServerBuilder builder;
builder.AddListeningPort(server_address, creds);
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());

服务器无法启动并因以下错误而终止。

E1115 13:00:55.657846941   17129 ssl_transport_security.c:636] Invalid cert chain file.
E1115 13:00:55.657936436 17129 security_connector.c:830] Handshaker factory creation failed with TSI_INVALID_ARGUMENT.
E1115 13:00:55.657954952 17129 server_secure_chttp2.c:344] {"created":"@1479243655.657946821","description":"Unable to create secure server with credentials of type Ssl.","file":"src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c","file_line":242,"security_status":1}
Server listening on 0.0.0.0:50051
Segmentation fault (core dumped)

我只想使用 SSL 进行服务器和客户端通信。看起来我在服务器中缺少正确的证书并且相信客户端需要类似的东西。由于我没有任何 SSL 背景知识,如果有人能给我指出有关如何创建这些证书并正确使用 gRPC 通信的示例,那就太好了。

最佳答案

证书的创建方式似乎有问题。我忘记了 StackOverflow 中展示了如何创建证书的帖子。使用该方法并插入 key 和证书以使其工作。

这是我创建 key (server.key) 和证书 (server.crt) 的方式。

    mypass="pass123"

echo Generate server key:
openssl genrsa -passout pass:$mypass -des3 -out server.key 4096

echo Generate server signing request:
openssl req -passin pass:$mypass -new -key server.key -out server.csr -subj "/C=US/ST=CA/L=SanFrancisco/O=Google/OU=youtube/CN=localhost"

echo Self-sign server certificate:
openssl x509 -req -passin pass:$mypass -days 365 -in server.csr -signkey server.key -set_serial 01 -out server.crt

echo Remove passphrase from server key:
openssl rsa -passin pass:$mypass -in server.key -out server.key

rm server.csr

注意这里使用了localhost。在创建客户端 channel 时应使用相同的方法。我修改了 grpc 代码库中的示例以使用这些。服务器如下所示。

    std::string server_address("0.0.0.0:50051");
GreeterServiceImpl service;

std::string servercert = read_keycert("server.crt");
std::string serverkey = read_keycert("server.key");

grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp;
pkcp.private_key = serverkey;
pkcp.cert_chain = servercert;

grpc::SslServerCredentialsOptions ssl_opts;
ssl_opts.pem_root_certs="";
ssl_opts.pem_key_cert_pairs.push_back(pkcp);

std::shared_ptr<grpc::ServerCredentials> creds;
creds = grpc::SslServerCredentials(ssl_opts);

ServerBuilder builder;
builder.AddListeningPort(server_address, creds);
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
server->Wait();

在客户端只需要证书。以下是它在我的案例中的使用方式。

    std::string cacert = read_keycert("server.crt");
grpc::SslCredentialsOptions ssl_opts;
ssl_opts.pem_root_certs=cacert;

auto ssl_creds = grpc::SslCredentials(ssl_opts);
GreeterClient greeter(grpc::CreateChannel("localhost:50051", ssl_creds));

key 和证书的生成和使用方式在每个用例中都不同。我认为如果两台服务器进行通信,那么它们可能会有所不同。没有把握。希望这有助于一些新手开始使用 gRPC C++ 中的安全 SSL/TLS。

关于ssl - 在 gRPC 客户端服务器通信中使用 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40623793/

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