2015-09-26 140 views
3

在CPP中使用TLS的gRPC服務器的任何示例?CPP中的gRPC提供TLS支持

我想構建一個gRPC應用程序。如果客戶端想通過TLS而不是TCP連接,服務器應該提供TLS支持。

這是我的服務器

void RunServer() { 
    std::string server_address("0.0.0.0:50051"); 
    GreeterServiceImpl service; 
    ServerBuilder builder; 
    std::shared_ptr<ServerCredentials> creds; 

    if(enable_ssl) 
    { 
      grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp ={"a","b"}; 
      grpc::SslServerCredentialsOptions ssl_opts; 
      ssl_opts.pem_root_certs=""; 
      ssl_opts.pem_key_cert_pairs.push_back(pkcp); 
      creds = grpc::SslServerCredentials(ssl_opts); 
    } 
    else 
      creds=grpc::InsecureServerCredentials(); 
    // Listen on the given address without any authentication mechanism. 
    builder.AddListeningPort(server_address, creds); 
    // Register "service" as the instance through which we'll communicate with 
    // clients. In this case it corresponds to an *synchronous* service. 
    builder.RegisterService(&service); 
    // Finally assemble the server. 
    std::unique_ptr<Server> server(builder.BuildAndStart()); 

錯誤: 未定義參考GRPC :: SslServerCredetials(GRPC :: ssl_opts) 我已經包括了所有必要的文件..

+2

發現他很有可能意味着加密的東西不是線程本地存儲。 –

+0

你!不是關於線程庫,而是關於TLS可以使用的方式。 –

回答

1

你的代碼看起來正確。如果您要從examples/cpp/helloworld進行適配,則需要在Makefile中將-lgrpc++_unsecure更改爲-lgrpc++

對於其他人的利益,使用TLS/SSL代碼的例子可以在https://github.com/grpc/grpc/blob/master/test/cpp/interop/server_helper.cc#L50

+0

lib/libgrpc.so.0.11.0.0:未定義對'EVP_DigestVerifyInit'的引用 lib/libgrpc.so.0.11.0.0:未定義對'SSL_get0_next_proto_negotiated'的引用 /lib/libgrpc.so.0.11.0.0:未定義對' SSL_get_servername' lib/libgrpc.so.0.11.0.0:未定義對'SSL_set_SSL_CTX'的引用 lib/libgrpc.so.0.11.0.0:未定義對'EVP_DigestVerifyFinal'的引用 等等。獲取這些未定義的引用,不知道爲什麼。 –