如何使用 java 中的 ssl 使用 java 密钥库而不是证书和密钥文件实例化 grpc 服务器?

How to instantiate a grpc server using ssl in java using java keystore instead of certficate and key file?

我看过有关如何为客户端执行此操作的示例,但 ServerBuilder class 似乎在配置 ssl 时只获取证书和密钥文件。无论如何我都看不到设置 sslContext 或通道。只有一个 useTransportSecurity(File certChain, File privateKey) 方法需要 certChain 和私钥。我可以通过编程方式从密钥库中提取那些吗?目前我实例化服务器如下:

server = ServerBuilder.forPort(port). useTransportSecurity(certFile, keyFile).addService(this).build().start();

应用程序的其他部分正在使用 jks trust/keystores,我们不希望将密钥存储在两个位置。

正如您已经发现的那样,默认 ServerBuilder 是有限的。我建议使用 NettyServerBuilder,它能够处理不同类型的输入,例如 KeyStore、KeyManager 等。

将以下依赖项添加到您的项目中:

<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty</artifactId>
</dependency>
SslContextBuilder sslContextBuilder = SslContextBuilder.forServer(keyManager).trustManager(trustManager);
SslContext sslContext = GrpcSslContexts.configure(sslContextBuilder).build();

Server server = NettyServerBuilder.forPort(8443)
        .addService(new HelloServiceImpl())
        .sslContext(sslContext)
        .build()
        .start();

KeyManager/TrustManager可以用工厂构建类:

  • KeyManagerFactory
  • TrustManagerFactory

另请参阅此处了解其他配置:DZone - Secure Your gRPC Services With SSL/TLS