Почему клиент gRPC C ++ не работает без явного SSL-сертификата сервера, как в примерах? - PullRequest
0 голосов
/ 20 мая 2019

Единственный способ для меня сейчас заставить сервер и клиент, зашифрованный по протоколу 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

Мой вопрос: почему клиент не работает без явного сертификата сервера?Спасибо!

1 Ответ

0 голосов
/ 21 мая 2019

Я незнаком с C ++, но, глядя на ваш код, я подозреваю, что:

  • Вы должны предоставить клиенту сертификат сервера, чтобы он мог аутентифицироваться.
  • образец grpc::SslCredentialsOptions() соответствует Го grpc.WithInsecure(). Если правильный, этот подход не использует TLS.

Я думаю, что вы имеете в виду это: https://grpc.io/docs/guides/auth/#using-client-side-ssl-tls

...