如何将新的SSL证书和密钥注入正在运行的Node http.Server?

时间:2017-11-20 23:39:32

标签: node.js ssl websocket httpserver node-https

我正在为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 facilitieshttp.createServer()的选项和错误处理程序参数。

LetsEncrypt certbot会定期重新生成SSL密钥和证书。发生这种情况时,我想将新密钥和证书注入Web服务器,而不必重新生成新的密钥和证书,也不需要重新初始化我的websocket。

还有哪些未记录的设施可以让我这样做?

1 个答案:

答案 0 :(得分:0)

使用SNICallback

实际上,您不应该提供certkey,而应使用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),因为无法捕获它或知道它是什么类型的错误。这是节点团队的故意决定。

Greenlock将为您执行此操作

这正是我对我编写的ssl证书管理员Greenlock.jsGreenlock for Express.js的处理方式,它将:

  • 自动配置SSL
  • 动态为您允许的任何域
  • 自动续订过期证书
  • 热门新版证书
  • 存储插件可以处理自定义逻辑,因为它在发布或续订之前运行

它通过ACME / Let's Encrypt自动发布证书,但是,如果您需要更自定义的解决方案,您可以覆盖默认存储插件以始终返回证书,然后它甚至永远不会访问ACME API。