续订时如何让 Netty 服务器重新加载 TLS 证书?

Mat*_*ips 5 java ssl netty aleph

我有一个基于 Netty 的服务器,它使用 PEM 编码的证书文件,这些文件定期重新发布(通过 Let's Encrypt)。Netty 完全支持加载 PEM 加密材料,但是稍后重新颁发证书(.cer 文件)时,需要重新启动服务器才能看到它。

到目前为止,我一直通过添加自定义通道初始化处理程序来添加重新加载证书的逻辑并添加从中构建的适当 SSLHandler 来处理此问题。但是现在我想使用 Aleph,它需要一个用于 TLS 的 Netty SSLContext 对象。

随着 Let's Encrypt 及其相对短暂的证书越来越受欢迎,这似乎是一个热门和普遍的问题,我想正确解决它。这意味着创建 SSLContext 的 Netty 兼容方式,如果它们在磁盘上发生更改,它将重新加载其证书。

我想出的一些方法:

  1. 创建一个动态信任管理器/信任存储,然后将其插入 Netty SSLContextBuilder。可以使用这是一个起点https://jcalcote.wordpress.com/2010/06/22/managing-a-dynamic-java-trust-store/,并使用一些代码以编程方式加载密钥/证书从 PEM 获取 KeyStore(Netty 的 PEM -> KeyStore 逻辑在 SSLContext 类中不是公开的)。好处:也可以在 Netty 之外使用。缺点:复杂且不重用 Netty 的现有逻辑来加载 PEM 密钥和证书。

  2. 将此添加为 Netty 支持的选项。

任何人都可以指出我的解决方案,或提出构建解决方案的最佳方法吗?

Mat*_*ips 3

回答我自己的问题。

答案是:不要在这个级别上这样做。相反,让 Netty 堆栈外部的某些东西监视证书,当证书更改时,从管道中删除现有的 SSL 处理程序,并将其替换为具有从新证书创建的 SSLContext 的新处理程序。