【问题标题】:How to enable ssl in grpc with java using keystore如何使用密钥库在 grpc 中使用 java 启用 ssl
【发布时间】:2020-09-22 10:58:45
【问题描述】:

使用 java 的 gRPC 新手,我无法找到在使用 truststore 和 clientstore 时启用 ssl 的方法。我已经能够通过指向单个证书但不使用信任库来启用 ssl。任何线索都会非常有帮助。

【问题讨论】:

    标签: java spring grpc grpc-java


    【解决方案1】:

    您只需要将 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();
    

    【讨论】:

    • 如何在服务器中设置频道。我使用 ServerBuilder 构建服务器,但没有看到设置通道的方法。服务器 = ServerBuilder.forPort(端口)。 useTransportSecurity(certFile, keyFile).addService(this).build().start();
    • 频道是使用自己的构建器构建的(例如,ManagedChannelBuilder 或特定于传输的构建器)。服务器应用程序构建服务器,而客户端应用程序构建通道,您无需从服务器“设置”通道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2012-08-05
    • 2019-11-25
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多