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

Why gRPC C++ client doesn't work without explicit server's SSL certificate, like in samples?

本文关键字:一样 工作 客户端 C++ gRPC 情况下 为什么 证书 SSL 服务器      更新时间:2023-10-16

我现在唯一使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键的方式:

    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/wusing-client-side-side-ssl-tls