[英]How to automatically reload updated SSL certificates in Node.js Application
我创建了 nodejs 应用程序,并且正在使用Lets Encrypt
SSL 证书。 以下是我的代码
var express = require(‘express’);
var https = require(‘https’);
var fs = require(‘fs’);
var option = {
key: fs.readFileSync(‘/etc/letsencrypt/live/$DOMAIN/privkey.pem’),
cert: fs.readFileSync(‘/etc/letsencrypt/live/$DOMAIN/fullchain.pem’)
};
const app = express();
app.use((req, res) =>
{
res.end(‘Hello World’);
});
https.createServer(option, app).listen(8000);
我已使用 pm2 使用以下命令启动此应用程序
sudo pm2 start app.js --watch
我正在使用以下 cronjob 更新 SSL 证书
0 8 * * * sudo certbot renew
每当 certbot 更新 SSL 证书时,我想自动重新加载 SSL 证书。 我怎样才能做到这一点?
您可以在每次续订后使用标志--post-hook
重新启动您的应用程序。
certbot renew --post-hook "pm2 restart app_name"
请注意,我们正在运行的命令在 crontab 中,并且必须使用完整路径引用任何全局程序。 您可以使用which
命令查找该命令的可执行文件路径。
您可以在不重新启动服务器的情况下重新加载新证书。
根据问题Reload certificate files of https.createServer() without restarting node server #15115 ,特别是来自 mscdex 的评论:
FWIW,您已经可以使用 SNICallback() 执行此操作:
const https = require('https'); const tls = require('tls'); const fs = require('fs'); var ctx = tls.createSecureContext({ key: fs.readFileSync(config.sslKeyPath), cert: fs.readFileSync(config.sslCrtPath) }); https.createServer({ SNICallback: (servername, cb) => { // here you can even change up the `SecureContext` // based on `servername` if you want cb(null, ctx); } });
有了这个,你所要做的就是重新分配 ctx ,然后它将用于任何未来的请求。
使用上面的示例,您只需在SNICallback
fs.readFileSync
它们附加到ctx
object。 但是,当你知道它们刚刚改变时,你只想这样做。 您可以查看 javascript 中的文件以进行更改。 您可以为此使用fs.watch()
或npm中的某些内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.