为什么ManagedChannelBuilder没有用于与服务器建立TLS连接的TLS参数?

时间:2018-01-20 07:25:10

标签: java ssl grpc

在此示例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。

注意:我已按照https://grpc.io/docs/guides/auth.html

的建议在机器上安装了OpenSSL

此页面说明:

  

如果客户端不知道颁发证书颁发机构,则应分别向NettyChannelBuilder或OkHttpChannelBuilder提供正确配置的SslContext或SSLSocketFactory。

所以也许你只能在客户知道发行ca时才使用ManagedChannelBuilder ......但我不确定这意味着什么。也许这意味着cacert在jvm的密钥库上?

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

1 个答案:

答案 0 :(得分:1)

TLS配置很复杂并且取决于实现,ManagedChannelBuilder可以用于TLS之外的其他内容。因此,ManagedChannelBuilder仅具有TLS的粗略配置(开/关)。这在普通Web浏览器TLS情况下工作良好1)没有客户端证书和2)服务器证书由链接到客户端信任存储中的根CA的CA签名。

但是,NettyChannelBuilderOkHttpChannelBuilder上提供了更具体的配置。如何配置TLS对每个都不同,因为实现方式不同。第一个代码段中的sslContext是一个Netty对象;显然OkHttpChannelBuilder中的配置很差。

ManagedChannelBuilder不应该有"所有选项。"它应该具有跨传输实现存在的共同选项。特定传输实施构建器(如NettyChannelBuilderOkHttpChannelBuilder

)提供了更具体的选项