Chciałebym zasztfrowac komunikację gRPC
wygenerowałem klucze zgodnie ze skryptem https://stackoverflow.com/questions/37714558/how-to-enable-server-side-ssl-for-grpc#37739265
nazwa serwera PC-MB (poprawiłem w certyfikacie CN=PC-MB).
Po stronie serwera:
bool use_tls{true};
std::shared_ptr<grpc::ServerCredentials> credentials;
if(use_tls)
{
grpc::SslServerCredentialsOptions ssl_opts;
ssl_opts.pem_root_certs = "";
std::string test_server1_key= R"(-----BEGIN PRIVATE KEY-----
TUTAJ zawartosc server.key
-----END PRIVATE KEY-----)";
std::string test_server1_cert = R"(-----BEGIN CERTIFICATE-----
TUTAJ zawartosc server.crt
-----END CERTIFICATE-----)";
grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key,
test_server1_cert};
ssl_opts.pem_key_cert_pairs.push_back(pkcp);
credentials = grpc::SslServerCredentials(ssl_opts);
}
else
credentials = grpc::InsecureServerCredentials();
builder.AddListeningPort(server_address, credentials);
wydaje się że serwer działa poprawnie bo na konsoli już nie zgłasza błędów (jak nie było certyfikatu i klucza to wypisywał błędy)
test serwera za pomocą openssl
$ openssl s_client -connect PC-MB:50001 -brief
Can't use SSL_get_servername
depth=0 C = US, ST = CA, L = Cupertino, O = YourCompany, OU = YourApp, CN = PC-MB
verify error:num=20:unable to get local issuer certificate
depth=0 C = US, ST = CA, L = Cupertino, O = YourCompany, OU = YourApp, CN = PC-MB
verify error:num=21:unable to verify the first certificate
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: C = US, ST = CA, L = Cupertino, O = YourCompany, OU = YourApp, CN = PC-MB
Hash used: SHA256
Signature type: RSA-PSS
Verification error: unable to verify the first certificate
Server Temp Key: ECDH, prime256v1, 256 bits
100000000A000000:error:0A000126:SSL routines:ssl3_read_n:unexpected eof while reading:ssl/record/rec_layer_s3.c:303:
zakładam ze to jest ok bo sam wygenerowałem certyfikaty
po stronie klienta
bool use_tls{true};
std::shared_ptr<grpc::ChannelCredentials> credentials;
if (use_tls)
{
grpc::SslCredentialsOptions ssl_opts;
ssl_opts.pem_private_key = R"(-----BEGIN PRIVATE KEY-----
TUTAJ client.key
-----END PRIVATE KEY-----)";
ssl_opts.pem_cert_chain=R"(-----BEGIN CERTIFICATE-----
TUTAJ client.crt
-----END CERTIFICATE-----)";
credentials = grpc::SslCredentials(ssl_opts);
}
else
{
credentials = grpc::InsecureChannelCredentials();
}
channel = grpc::CreateChannel(TARGET_STR, credentials);
jak TARGET_STR="localhost:50001"
E1121 12:56:49.954000000 22132 C:/M/B/src/grpc-1.59.0/src/core/tsi/ssl_transport_security.cc:1432] Handshake failed with fatal error SSL_ERROR_SSL: error:0A000086:SSL routines::certificate verify failed.
jak TARGET_STR="PC-MB:50001"
to nie ma błędów na konsoli
ale ClientReader::read(...)
zwraca zawsze false
i nic nie mogę odczytać :(