Создание 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 шт):

Автор решения: Rikitikitavi

В структуру 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
→ Ссылка