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

我有以下代码来构建和启动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();
    }

}

最佳答案

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


模仿DelegatingSslContext制作自己的SslContext。当您想要其他证书时,将交换到另一个SslContext(尤其是在newEngine期间)。
使用KeyManagerFactory,其密钥材料会随时间变化。我不知道这种工厂的预先存在的实现,因此您可能需要实现一个将KeyManagerFactorySpi委派给的KeyManagerFactory。然后,您可以随时间交换KeyManagerFactory


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

10-08 06:35