重新为gRPC重新加载Netty Server的SSL上下文

时间:2018-07-18 22:01:20

标签: ssl certificate netty grpc grpc-java

有人可以告诉我如何刷新/更新服务器证书而不重新启动gRPC服务器时如何重新加载SSLContext吗?

我有此代码来构建和启动gRPC服务器。 每当我创建新的SSL上下文时更改证书时,都会调用方法certificateRefreshed(),但是除非重新启动grpc服务器,否则此方法将不起作用。

public class ServerWithTls {
    Server server;
    SslContext sslContext;

    public ServerWithTls() {
        this.sslContext = getSslContext();

        NettyServerBuilder serverBuilder = NettyServerBuilder
            .forPort(settings.port())
            .executor(executorService)
            .addService(myService);
            .sslContext(this.sslContext);

        server = serverBuilder.build();
        server.start();
    }

    public io.netty.handler.ssl.SslContext getSslContext() {
        // returns ssl context based on cert and key
    }

    // gets notified when a server cert changes
    public void certificateRefreshed() {
        // create a new SSL context when cert changes
        this.sslContext = getSslContext();
    }

}

1 个答案:

答案 0 :(得分:0)

我不确定是否有更简单的替代方法,但是我看到了两种可能的方法。

  1. 制作自己的SslContext,模仿DelegatingSslContext。当您想要其他证书时,您将交换到另一个SslContext(尤其是在newEngine期间)。

  2. 使用KeyManagerFactory,其密钥材料会随时间变化。我不知道这种工厂的现有实现,因此您可能需要实现一个委托给KeyManagerFactory的{​​{3}}。然后,您可以随时更换KeyManagerFactory

我会警告说,我很容易错过使方法无效的事情。