在此示例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参数?
答案 0 :(得分:1)
TLS配置很复杂并且取决于实现,ManagedChannelBuilder
可以用于TLS之外的其他内容。因此,ManagedChannelBuilder
仅具有TLS的粗略配置(开/关)。这在普通Web浏览器TLS情况下工作良好1)没有客户端证书和2)服务器证书由链接到客户端信任存储中的根CA的CA签名。
但是,NettyChannelBuilder
和OkHttpChannelBuilder
上提供了更具体的配置。如何配置TLS对每个都不同,因为实现方式不同。第一个代码段中的sslContext
是一个Netty对象;显然OkHttpChannelBuilder
中的配置很差。
ManagedChannelBuilder
不应该有"所有选项。"它应该具有跨传输实现存在的共同选项。特定传输实施构建器(如NettyChannelBuilder
和OkHttpChannelBuilder
。