在节点JS中为WebSocket(ws)使用自签名CA证书

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在节点JS中为WebSocket(ws)使用自签名CA证书相关的知识,希望对你有一定的参考价值。

我需要使用Node JS中的ws客户端连接到单独的WebSocket服务器。

自从我在计算机上的受信任的根证书颁发机构商店中安装了自签名根CA以来,我就可以使用Chrome中的示例程序进行连接。

[我知道Node JS使用根CA的硬编码列表(愚蠢),但是我希望可以通过某种方式导入自己的CA。

我尝试过:

        export NODE_EXTRA_CA_CERTS=C:\\Users\\IT1\\Documents\\security\\rootCA.pem
  • 使用许多论坛帖子中建议的ssl-root-cas库,但我认为它可能不适用于此处,因为它不会更改我正在使用的ws客户端的https。 (我想,我现在在吐口水)
  • 使用可用于WebSocket构造函数的ca,cert和key选项。
        // Using just ca
        var test = new WebSocket(uri, 
            ca: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.pem")
        );

        // Using cert and key
        var test = new WebSocket(uri, 
            cert: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.crt"),
            key: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.key")
        );

        // Using ca, cert and key
        var test = new WebSocket(uri, 
            ca: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.pem"),
            cert: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.crt"),
            key: fs.readFileSync("C:\\Users\\IT1\\Documents\\security\\rootCA.key")
        );

而且不重要,我总是收到以下错误消息:

events.js:200
      throw er; // Unhandled 'error' event
      ^

Error: unable to verify the first certificate
    at TLSSocket.onConnectSecure (_tls_wrap.js:1321:34)
    at TLSSocket.emit (events.js:223:5)
    at TLSSocket._finishInit (_tls_wrap.js:794:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:608:12)
Emitted 'error' event on WebSocket instance at:
    at ClientRequest.<anonymous> (C:\Users\IT1\source\repos\WebSocketTest\WebSocketTest\node_modules\ws\lib\websocket.js:554:15)
    at ClientRequest.emit (events.js:223:5)
    at TLSSocket.socketErrorListener (_http_client.js:406:9)
    at TLSSocket.emit (events.js:223:5)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:81:21) 
  code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'

而且,我不能使用rejectUnauthorized: true。我需要对它进行授权,因此请不要提出建议。

[请帮忙,我真的很想抓这个。

答案

经过近一两天的努力,我决定在OpenSSL中验证证书。事实证明,该证书使用了不同的加密算法(SHA 256与DES3或类似的加密算法)。它在浏览器中运行良好的原因是因为我之前已经为该域安装了其他证书。

故事的道德:

  1. 总是尝试在代码中使用SSL证书之前,先使用OpenSSL测试它们。与NodeJS,Java或任何运行时环境相比,OpenSSL始终会提供有关为何您的证书不起作用的更多信息。
  2. 在测试根证书之前,从受信任的根存储中删除域的所有证书。
  3. 我正在网上关注有关在Windows中生成自签名根CA的教程,而我发现的教程并没有提供关于我在做什么的大量信息,更多的是“这就是您的做法”。这是我出问题的地方,因为我正在遵循一些教程并结合了信息以找到解决方案。这意味着我使用一个教程生成了一个根证书和私钥,然后使用了另一个教程对其他证书进行了签名(指定了不同的算法,但没有说明算法必须与根CA和签名证书相匹配)。
  4. 有助于深入了解SSL和根证书的工作原理,然后再研究制作自签名根CA。不是从技术角度,而是从为什么有根CA,如何在现实世界中使用它们以及如何将其作为开发人员应用到您的角度。 I found this article extremely helpful.

以上是关于在节点JS中为WebSocket(ws)使用自签名CA证书的主要内容,如果未能解决你的问题,请参考以下文章

Node wss Websocket 在桌面上工作,而不是在移动设备上

在 SSL WebSocket 连接 (wss) 中拦截请求

节点 websocket-server -- ETIMEDOUT 错误

使用node.js和“ws”-package(API:bitfinex)了解基本的websocket API

错误:节点 js 应用程序中证书链中的自签名证书

C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接