有人可以告诉我如何刷新/更新服务器证书而不重新启动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();
}
}
答案 0 :(得分:0)
我不确定是否有更简单的替代方法,但是我看到了两种可能的方法。
制作自己的SslContext
,模仿DelegatingSslContext。当您想要其他证书时,您将交换到另一个SslContext
(尤其是在newEngine
期间)。
使用KeyManagerFactory
,其密钥材料会随时间变化。我不知道这种工厂的现有实现,因此您可能需要实现一个委托给KeyManagerFactory
的{{3}}。然后,您可以随时更换KeyManagerFactory
。
我会警告说,我很容易错过使方法无效的事情。