是否可以在不重新启动服务器的情况下更新ssl cert?

时间:2019-07-23 17:29:55

标签: node.js ssl-certificate

我想在不重新启动的情况下在node.js http2服务器上更新ssl证书(以避免停机)。我也不想使用任何第三方模块来完成这项工作。仅纯nodejs。 有可能吗?

现在,当证书即将到期时,我只是重新启动了脚本。

const https = require('http2');
const server = https.createSecureServer({
  ca: fs.readFileSync('chain.pem'),
  cert: fs.readFileSync('cert.pem', 'utf8'),//fullchain
  key: fs.readFileSync('privkey.pem', 'utf8'),
  allowHTTP1: true,
},

我希望能够监视证书文件是否已更新(例如,使用fs.watch()),以及即时更新http2服务器中的证书...

2 个答案:

答案 0 :(得分:1)

是的,您只能使用sniCallBack()

const https = require('http2');
const server = https.createSecureServer({
  ca: fs.readFileSync('chain.pem'),
  cert: fs.readFileSync('cert.pem', 'utf8'),//fullchain
  key: fs.readFileSync('privkey.pem', 'utf8'),
  allowHTTP1: true,
  SNICallback: (servername, cb) => {
    // here you can even change up the `SecureContext`
    // based on `servername` if you want
    cb(null, server);
  }
},

这可能有点过时,所以请尝试一下,问我是否有任何问题,因为我发现here的解决方案源代码有些不同。

答案 1 :(得分:0)

正如Jake所提到的,setSecureContext()发挥了神奇作用。 似乎可以在不断开当前连接的情况下更新证书。 像这样:

setTimeout(function () {server.setSecureContext({
  ca: fs.readFileSync('chain.pem'),
  cert: fs.readFileSync('cert.pem', 'utf8'),//fullchain
  key: fs.readFileSync('privkey.pem', 'utf8')
})},86400000)