【发布时间】:2020-09-22 10:58:45
【问题描述】:
使用 java 的 gRPC 新手,我无法找到在使用 truststore 和 clientstore 时启用 ssl 的方法。我已经能够通过指向单个证书但不使用信任库来启用 ssl。任何线索都会非常有帮助。
【问题讨论】:
标签: java spring grpc grpc-java
使用 java 的 gRPC 新手,我无法找到在使用 truststore 和 clientstore 时启用 ssl 的方法。我已经能够通过指向单个证书但不使用信任库来启用 ssl。任何线索都会非常有帮助。
【问题讨论】:
标签: java spring grpc grpc-java
您只需要将 CA 证书 (truststore) 的 KeyStore 转换为 TrustManagerFactory 并将客户端证书/密钥 (clientstore) 的 KeyStore 转换为 KeyManagerFactory。
前者可以用
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm();
tmf.init(truststore);
后者可以用
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientstore, password);
然后,如果您使用的是 Netty 传输,您可以构建 SslContext 与
SslContext sslContext = GrpcSslContexts.forClient().trustManager(tmf).keyManager(kmf).build();
查看其SslContextBuilderJavadoc。
最后,构建 gRPC 通道
NettyChannelBuilder.forAddress(host, port).sslContext(sslContext).build();
如果您使用的是 Okhttp 传输,则需要构建 SSLSocketFactory 与
SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());
SSLSocketFactory sslSocketFactory = context. getSocketFactory()
并使用构建 gRPC 通道
OkHttpChannelBuilder.forAddress(host, port).sslSocketFactory(sslSocketFactory).build();
【讨论】:
ManagedChannelBuilder 或特定于传输的构建器)。服务器应用程序构建服务器,而客户端应用程序构建通道,您无需从服务器“设置”通道。