为什么 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。它需要的唯一参数是 "usePlaintext" 可以关闭 TLS。

注意:我已经在机器上安装了OpenSSL,按照https://grpc.io/docs/guides/auth.html

的推荐

此页面声明:

If the issuing certificate authority is not known to the client then a properly configured SslContext or SSLSocketFactory should be provided to the NettyChannelBuilder or OkHttpChannelBuilder, respectively.

因此,也许您只能在客户端知道发出 ca 时使用 ManagedChannelBuilder...但我不确定这意味着什么。也许这意味着 cacert 在 jvm 的密钥库中?

为什么我不必在 Managed 频道构建器上指定 TLS 参数?

更新:自 grpc-java v1.37.0 以来,TlsChannelCredentialsTlsServerCredentials 提供了在大多数情况下配置 TLS 所必需的选项,这样传输-具体 API 是必要的。由于 TlsChannelCredentialsTlsServerCredentials 是稳定的 APIs 并且可以与稳定的 ManagedChannelBuilder API 一起使用,因此它们应该优于不稳定的传输特定 APIs.


TLS 配置很复杂并且依赖于实现,ManagedChannelBuilder 可以与 TLS 以外的东西一起使用。因此,ManagedChannelBuilder 只有粗略的 TLS 配置 (on/off)。这在 1) 没有客户端证书和 2) 服务器证书由链接到客户端信任库中的根 CA 的 CA 签名的常见 Web 浏览器 TLS 情况下运行良好。

但是,NettyChannelBuilderOkHttpChannelBuilder 上有更具体的配置可用。如何配置 TLS 因实现不同而各不相同。第一个代码片段中的 sslContext 是一个 Netty 对象;在 OkHttpChannelBuilder.

中显然配置不佳

ManagedChannelBuilder 不应具有“所有选项”。它应该具有跨传输实现存在的通用选项。 NettyChannelBuilderOkHttpChannelBuilder.

等特定传输实施构建器提供了更具体的选项