![](/img/trans.png)
[英]How to force java server to accept only tls 1.2 and reject tls 1.0 and tls 1.1 connections
[英]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, TlsChannelCredentials
和TlsServerCredentials
提供了在大多數情況下配置 TLS 所必需的選項,因此很少需要特定於傳輸的 API。 由於TlsChannelCredentials
和TlsServerCredentials
是穩定的 API,並且可以與穩定的ManagedChannelBuilder
API 一起使用,因此它們應該優先於不穩定的特定於傳輸的 API。
TLS 配置很復雜並且依賴於實現, ManagedChannelBuilder
可以與 TLS 以外的東西一起使用。 因此, ManagedChannelBuilder
只有粗略的 TLS 配置(開/關)。 這在 1) 沒有客戶端證書和 2) 服務器證書由鏈接到客戶端信任庫中的根 CA 的 CA 簽署的常見 Web 瀏覽器 TLS 情況下運行良好。
但是,在NettyChannelBuilder
和OkHttpChannelBuilder
上有更具體的配置可用。 每個人如何配置 TLS 是不同的,因為實現方式不同。 第一個代碼片段中的sslContext
是一個 Netty 對象; 這顯然是OkHttpChannelBuilder
中的糟糕配置。
ManagedChannelBuilder
不應該擁有“所有選項”。 它應該具有跨傳輸實現存在的通用選項。 更具體的選項可用於特定的傳輸實現構建器,如NettyChannelBuilder
和OkHttpChannelBuilder
。
Eric Anderson提到我們可以使用TlsChannelCredentials
和TlsServerCredentials
從grpc-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.