2016-11-16 6 views
2

Я ничего не знаю о SSL/TLS и пытаюсь использовать канал SSL/TLS в gRPC, следуя инструкциям, найденным в Интернете. Вот код сервера:Использовать SSL в связи с сервером gRPC

std::string server_address("0.0.0.0:50051"); 
    GreeterServiceImpl service; 

    grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp ={"a","b"}; 
    grpc::SslServerCredentialsOptions ssl_opts; 
    ssl_opts.pem_root_certs=""; 
    ssl_opts.pem_key_cert_pairs.push_back(pkcp); 

    std::shared_ptr<grpc::ServerCredentials> creds; 
    creds = grpc::SslServerCredentials(ssl_opts); 

    ServerBuilder builder; 
    builder.AddListeningPort(server_address, creds); 
    builder.RegisterService(&service); 
    std::unique_ptr<Server> server(builder.BuildAndStart()); 

Сервер не запускается и завершается со следующей ошибкой.

E1115 13:00:55.657846941 17129 ssl_transport_security.c:636] Invalid cert chain file. 
E1115 13:00:55.657936436 17129 security_connector.c:830] Handshaker factory creation failed with TSI_INVALID_ARGUMENT. 
E1115 13:00:55.657954952 17129 server_secure_chttp2.c:344] {"created":"@1479243655.657946821","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":242,"security_status":1} 
Server listening on 0.0.0.0:50051 
Segmentation fault (core dumped) 

Все, что я хочу сделать, это просто использовать SSL для связи с сервером и клиентом. Похоже, я пропускаю надлежащие сертификаты на сервере и считаю, что подобные вещи нужны клиенту. Поскольку у меня нет никакого фона в SSL, было бы здорово, если бы кто-нибудь мог указать мне примеры того, как создавать эти сертификаты и правильно использовать для связи gRPC.

ответ

1

Похоже, что проблема связана с созданием сертификатов. Я забыл сообщение в StackOverflow, в котором показано, как создавать сертификаты. Используется этот метод и подключен ключ и сертификаты, чтобы он работал.

Вот как я создал ключ (server.key) и сертификаты (server.crt).

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 

Обратите внимание на использование localhost здесь. То же самое следует использовать во время создания клиентского канала. Я изменил пример из базы данных grpc, чтобы использовать их. Сервер, который выглядел ниже.

std::string server_address("0.0.0.0:50051"); 
GreeterServiceImpl service; 

std::string servercert = read_keycert("server.crt"); 
std::string serverkey = read_keycert("server.key"); 

grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp; 
pkcp.private_key = serverkey; 
pkcp.cert_chain = servercert; 

grpc::SslServerCredentialsOptions ssl_opts; 
ssl_opts.pem_root_certs=""; 
ssl_opts.pem_key_cert_pairs.push_back(pkcp); 

std::shared_ptr<grpc::ServerCredentials> creds; 
creds = grpc::SslServerCredentials(ssl_opts); 

ServerBuilder builder; 
builder.AddListeningPort(server_address, creds); 
builder.RegisterService(&service); 
std::unique_ptr<Server> server(builder.BuildAndStart()); 
server->Wait(); 

В клиенте требуется только сертификат. Вот как он используется в моем случае.

std::string cacert = read_keycert("server.crt"); 
grpc::SslCredentialsOptions ssl_opts; 
ssl_opts.pem_root_certs=cacert; 

auto ssl_creds = grpc::SslCredentials(ssl_opts); 
GreeterClient greeter(grpc::CreateChannel("localhost:50051", ssl_creds)); 

Способ генерации и использования ключей и сертификатов в разных вариантах использования различен. Я думаю, что если два сервера свяжутся, то они могут быть разными. Не уверен. Надеюсь, это поможет новичку начать с безопасного SSL/TLS в gRPC C++.

Смежные вопросы