Создание grpc сервера с ssl шифрованием
Создаю сервер grpc:
grpc::ServerBuilder builder;
grpc::SslServerCredentialsOptions credential_options;
credential_options.force_client_auth = true;
const std::string private_key = read_file("server.key");
const std::string cert_chain = read_file("server.crt");
credential_options.pem_key_cert_pairs.push_back({private_key, cert_chain});
auto channel_credentials = grpc::SslServerCredentials( credential_options );
builder.AddListeningPort(StateService::instance().ipAddress(), channel_credentials);
builder.RegisterService(grpcLocalService_.get());
server_ = builder.BuildAndStart();
ключ и сертификат создаю скриптом:
mypass="pass123"
echo Generate server key:
openssl genrsa -passout pass:$mypass -des3 -out server.key 4096
echo Generate server signing request:
openssl req -passin pass:$mypass -new -key server.key -out server.csr -subj "/C=US/ST=CA/L=SanFrancisco/O=Google/OU=youtube/CN=localhost"
echo Self-sign server certificate:
openssl x509 -req -passin pass:$mypass -days 365 -in server.csr -signkey server.key -set_serial 01 -out server.crt
echo Remove passphrase from server key:
openssl rsa -passin pass:$mypass -in server.key -out server.key
rm server.csr
При запуске приложения получаю следующее:
E0813 19:24:39.571705892 21058 ssl_transport_security.c:628] Invalid cert chain file.
E0813 19:24:39.571727037 21058 security_connector.c:893] Handshaker factory creation failed with TSI_INVALID_ARGUMENT.
E0813 19:24:39.571736766 21058 server_secure_chttp2.c:96] {"created":"@1597321479.571730594","description":"Unable to create secure server with credentials of type Ssl.","file":"src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c","file_line":75,"security_status":1}
Я правильно понимаю в grpc::SslServerCredentialsOptions::PemKeyCertPair нужно передавать содержимое файлов .key и .crt, а не имя файлов? Если да то как их нужно считывать?
-----BEGIN CERTIFICATE-----
MIIFMDCCAxgCAQEwDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCVVMxCzAJBgNV
...// лишние строки убрал для краткости
BAgMAkNBMQ4wDAYDVQQHDAVUb21zazEOMAwGA1UECgwFRWxlc3kxDjAMBgNVBAsM
-----END CERTIFICATE-----
пропуская первую и последнюю строки или нет?
Но в любом случае ошибка все таже Handshaker factory creation failed with TSI_INVALID_ARGUMENT.
Ответы (1 шт):
В структуру grpc::SslServerCredentialOptions::PemKeyCertPair нужно передавать содержимое файлов ключа и сертификата полностью.
Как было указано в коментариях к вопросу нужно задать корневой сертификат
в credential_options.pem_root_certs. Сертификаты и ключи я генерировал скриптом взятым отсюда
@echo off
set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg
echo Generate CA key:
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
echo Generate CA certificate:
openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=MyRootCA"
echo Generate server key:
openssl genrsa -passout pass:1111 -des3 -out server.key 4096
echo Generate server signing request:
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=localhost"
echo Self-sign server certificate:
openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
echo Remove passphrase from server key:
openssl rsa -passin pass:1111 -in server.key -out server.key
echo Generate client key
openssl genrsa -passout pass:1111 -des3 -out client.key 4096
echo Generate client signing request:
openssl req -passin pass:1111 -new -key client.key -out client.csr -subj "/C=US/ST=CA/L=Cupertino/O=YourCompany/OU=YourApp/CN=%CLIENT-COMPUTERNAME%"
echo Self-sign client certificate:
openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
echo Remove passphrase from client key:
openssl rsa -passin pass:1111 -in client.key -out client.key