繁体   English   中英

如何在 Node.js 应用程序中自动重新加载更新的 SSL 证书

[英]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"
更新#1

请注意,我们正在运行的命令在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM