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

How can I get a Netty server to reload a TLS certificate when it is renewed?

我有一个基于 Netty 的服务器,它使用定期重新颁发的 PEM 编码证书文件(由 Let's Encrypt)。 Netty完全支持加载PEM crypto material,但是后面重新颁发证书(.cer文件)时,需要重启服务器才能看到。

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

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

我想出的一些方法:

  1. 创建动态信任 manager/trust 存储,然后将其插入 Netty SSLContextBuilder。可以使用这是一个起点 https://jcalcote.wordpress.com/2010/06/22/managing-a-dynamic-java-trust-store/, and take some of the code to load the key/cert from Programmatically Obtain KeyStore from PEM(Netty 的 PEM -> KeyStore 逻辑不是 public 在 SSLContext class 中)。好处:也可以在 Netty 之外工作。缺点:复杂且不重用 Netty 的现有逻辑来加载 PEM 密钥和证书。

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

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

回答我自己的问题。

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