我正在为TCP服务运行安全的websocket代理。这使用标准http.Server
设置,如:
var webserver = http.createServer(
{
key: fs.readFileSync(srv.ssl_key),
cert: fs.readFileSync(srv.ssl_cert),
},
function(request, response) {
response.writeHead(404);
response.end();
},
function(err) {
srv.log(err);
}
);
如您所见,我们已经在使用hilariously undocumented facilities:http.createServer()
的选项和错误处理程序参数。
LetsEncrypt certbot会定期重新生成SSL密钥和证书。发生这种情况时,我想将新密钥和证书注入Web服务器,而不必重新生成新的密钥和证书,也不需要重新初始化我的websocket。
还有哪些未记录的设施可以让我这样做?
答案 0 :(得分:0)
实际上,您不应该提供cert
和key
,而应使用SNICallback替代。
(HTTPS实际上只是HTTP和TLS的包装器,因此通常直接查看TLS文档以获取有关证书的任何内容)
例如:
function getCerts(servername, cb) {
cb(null, tls.createSecureContext({
key: '...' // privkey.pem
, cert: '...' // cert.pem + '\\r\\n' + chain.pem
}));
}
http.createServer({ SNICallback: getCerts });
重要的是要注意吞下错误并导致浏览器连接错误。如果您遇到错误情况,我强烈建议您console.error(err)
之前cb(err)
,因为无法捕获它或知道它是什么类型的错误。这是节点团队的故意决定。
这正是我对我编写的ssl证书管理员Greenlock.js和Greenlock for Express.js的处理方式,它将:
它通过ACME / Let's Encrypt自动发布证书,但是,如果您需要更自定义的解决方案,您可以覆盖默认存储插件以始终返回证书,然后它甚至永远不会访问ACME API。