2

我正在为 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);                                                                                       
    }                                                                                                       
);

正如你所看到的,我们已经在使用可笑的无证工具:选项和错误处理程序参数到http.createServer().

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

还有哪些无证设施可以让我这样做?

4

2 回答 2

1

使用 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 });

请务必注意,错误会被吞下并导致浏览器 tls 连接错误。如果您遇到错误情况,我强烈建议您console.error(err)在您之前,cb(err)因为没有办法捕捉它或知道它是什么类型的错误。这是节点团队有意做出的决定。

Greenlock将为您做到这一点

这正是我使用我编写的 ssl 证书管理器所做的,Greenlock.jsGreenlock for Express.js,它将:

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

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

于 2018-05-20T02:50:49.187 回答
0

你必须:

  1. 关闭当前的网络服务器webserver.close()
  2. 使用您的新密钥和证书创建一个新的网络服务器实例(上面有一个.setOptions()您可能认为可以用来更改keycert选项的方法,但没有办法让它在实例化后生成新的 TLS 凭据)
  3. 在 websocket 服务器上挂载新的 webserver ,你的新 webserver 实例websocketServer.mount(websocketOptions)在哪里websocketOptions.httpServer

这将运行良好且顺利,不会干扰正在运行的连接。

于 2017-11-27T16:59:41.107 回答