簡體   English   中英

為什么 ManagedChannelBuilder 沒有用於與服務器建立 TLS 連接的 TLS 參數?

[英]Why does ManagedChannelBuilder not have TLS parameters for making TLS connections to the server?

在此示例中https://github.com/grpc/grpc-java/blob/master/interop-testing/src/test/java/io/grpc/testing/integration/TlsTest.java您會看到 TLS 客戶端連接具有各種 TLS 參數,例如

        .negotiationType(NegotiationType.TLS)
        .sslContext(sslContext)

但到目前為止,我的應用程序一直使用https://github.com/grpc/grpc-java/blob/master/core/src/main/java/io/grpc/ManagedChannelBuilder.java ,默認情況下似乎支持 TLS。 它采用的唯一參數是可以關閉 TLS 的“usePlaintext”。

注意:我已經按照https://grpc.io/docs/guides/auth.html的建議在機器上安裝了 OpenSSL

該頁面確實聲明:

如果客戶端不知道頒發證書頒發機構,則應分別向 NettyChannelBuilder 或 OkHttpChannelBuilder 提供正確配置的 SslContext 或 SSLSocketFactory。

因此,也許您只能在客戶端知道發出 ca 的情況下使用ManagedChannelBuilder ......但我不確定這意味着什么。 也許這意味着 cacert 在 jvm 的密鑰庫中?

為什么我不必在Managed通道構建器上指定 TLS 參數?

更新:由於 grpc-java v1.37.0, TlsChannelCredentialsTlsServerCredentials提供了在大多數情況下配置 TLS 所必需的選項,因此很少需要特定於傳輸的 API。 由於TlsChannelCredentialsTlsServerCredentials是穩定的 API,並且可以與穩定的ManagedChannelBuilder API 一起使用,因此它們應該優先於不穩定的特定於傳輸的 API。


TLS 配置很復雜並且依賴於實現, ManagedChannelBuilder可以與 TLS 以外的東西一起使用。 因此, ManagedChannelBuilder只有粗略的 TLS 配置(開/關)。 這在 1) 沒有客戶端證書和 2) 服務器證書由鏈接到客戶端信任庫中的根 CA 的 CA 簽署的常見 Web 瀏覽器 TLS 情況下運行良好。

但是,在NettyChannelBuilderOkHttpChannelBuilder上有更具體的配置可用。 每個人如何配置 TLS 是不同的,因為實現方式不同。 第一個代碼片段中的sslContext是一個 Netty 對象; 這顯然是OkHttpChannelBuilder中的糟糕配置。

ManagedChannelBuilder不應該擁有“所有選項”。 它應該具有跨傳輸實現存在的通用選項。 更具體的選項可用於特定的傳輸實現構建器,如NettyChannelBuilderOkHttpChannelBuilder

Eric Anderson提到我們可以使用TlsChannelCredentialsTlsServerCredentialsgrpc-java v1.37.0 ,我們可以為gRPC客戶端執行此操作:

    private ServiceGrpc.ServiceBlockingStub client() {
        ChannelCredentials credentials = TlsChannelCredentials.newBuilder()           
                //You can use your own certificate here .trustManager(new File("cert.pem"))
                .trustManager(InsecureTrustManagerFactory.INSTANCE.getTrustManagers()) 
                .build();
        ManagedChannel channel = Grpc.newChannelBuilderForAddress("localhost", 443, credentials)
                                     .build();
        return ServiceGrpc.newBlockingStub(channel);
    }

希望它可以幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM