c++ - 为什么 gRPC C++ 客户端在没有显式服务器的 SSL 证书的情况下无法工作,就像示例中那样?

标签 c++ ssl grpc

我现在让 SSL 加密的服务器和客户端工作的唯一方法是明确地向客户端提供服务器的证书。如何让服务器在不直接在客户端代码中设置证书的情况下向客户端提供证书?

我正在使用 C++ gRPC。当我创建 gRPC 服务器时,我设置了它的自签名证书和私钥:

 grpc::SslServerCredentialsOptions sslServerOptions;
 grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp;
 pkcp.private_key = serverPrivateKey;
 pkcp.cert_chain  = serverCertChain;
 sslServerOptions.pem_key_cert_pairs.push_back( pkcp );
 sslServerOptions.pem_root_certs = “”;
 grpc::SslServerCredentials( sslServerOptions );

在客户端,如果我明确地将 pem_root_certs 设置为服务器的证书——它工作正常

grpc::SslCredentialsOptions sslChannelOptions;
sslChannelOptions.pem_root_certs  = serverCertChain;
sslChannelOptions.pem_cert_chain  = “”;
sslChannelOptions.pem_private_key = “”;
grpc::SslCredentials( sslChannelOptions );

但是如果我使用 GRPC 示例中的代码:

 grpc::SslCredentials( grpc::SslCredentialsOptions() );

我收到这个错误:

E0520 15:24:31.189310128   17046 ssl_transport_security.c:921] Handshake 
failed with fatal error SSL_ERROR_SSL: error:1000007d:SSL 
routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED.
Translate to Communication exception: Exception encountered while 
receiving response from localhost:10000, with status 14, message: Connect 
Failed
unknown file: Failure
C++ exception with description "Exception encountered while receiving 
response from localhost:10000, with status 14, message: Connect Failed" 
thrown in the test body.

这是我创建 SSL key 的方式:

    openssl req -new -key server.key -out server_selfsigned.csr 
    "/O=MyCompany/CN=localhost"

    openssl x509 -req -days 1825 -in server_selfsigned.csr -signkey 
    server.key -set_serial 02 -out server_selfsigned.pem

我的问题:为什么客户端在没有显式服务器证书的情况下无法工作?谢谢!

最佳答案

我不熟悉 C++,但是——仔细观察你的代码——我怀疑:

  • 您必须向客户端提供服务器的证书,以便客户端进行身份验证。
  • 示例 grpc::SslCredentialsOptions() 对应于 Go 的 grpc.WithInsecure()。如果正确,则此方法不使用 TLS。

我想你指的是这个: https://grpc.io/docs/guides/auth/#using-client-side-ssl-tls

关于c++ - 为什么 gRPC C++ 客户端在没有显式服务器的 SSL 证书的情况下无法工作,就像示例中那样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56223433/

相关文章:

c++ - 为什么在下面的例子中 int(a) 是一个表达式而 int(unsigned(a)) 是一个 type-id?

python : communication with c++ command line program not working when using <cstdio>

c++ - 项目编译时不能使用 gvim

rest - 无法为 Kafka Connect REST API 配置 SSL

rest - grpc 和 websocket 有什么区别?哪一种更适合双向流连接?

node.js - 使用 Google Vision Api 在 Azure 中托管的机器人 - gRPC 问题

c++ - 在计算 constexpr 时抛出异常会发生什么?

linux - 通过lftp从远程服务器复制文件

Java NIO SSL - SSLEngine session 重用

c++ - grpc编译错误protobuf 3.2.0(文件是用旧版本的protoc生成的)Ubuntu 16.04