有人可以告诉我在刷新/更新服务器证书时如何重新加载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
。
我将警告说,我很容易错过使方法无效的事情。