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