【问题标题】:NodeJS unable to read default CAs in ubuntuNodeJS 无法读取 ubuntu 中的默认 CA
【发布时间】:2014-01-06 15:07:00
【问题描述】:

在我们的测试环境中,我们正在使用我们公司签署的 SSL 连接到另一台服务器。每次建立连接时nodejs都会抛出 UNABLE_TO_VERIFY_LEAF_SIGNATURE。 我通过设置 rejectUnauthorized: false 找到了解决方法,但这不适用于我们的案例。

证书被添加到 /etc/ssl/certs 并使用环境变量 SSL_CERT_DIR 测试为 /etc/ssl anb /etc/ssl/certs,但没有结果。

此外,最好不要在我们的文件中的某处添加证书并将其添加到每个请求中。

【问题讨论】:

  • 运行node的用户是否有权限访问certs目录?它通常总是简单的事情..
  • 当运行 NodeJS 的用户是 ROOT 并且拥有所需的所有权限时会发生此事件。
  • 中间 CA 证书也添加到 /etc/ssl/certs。实际上我不确定 NodeJS 从正确的目录中读取证书。

标签: node.js ssl certificate ca


【解决方案1】:

这是因为 node 没有使用你系统的 CA 配置;它包括its own built-in list of acceptable CAs

如果您希望节点 SSL 客户端接受自定义 CA,您必须通过 ca option 中的 CA 证书。

// do something like this when your app starts up:
fs.readFile('/path/to/ca.pem', function(err, cert) {
    if (err) ...
    else certBuffer = cert;
});

// then when you make requests...
https.request({
    hostname: 'example.com',
    port: 443,
    path: '/',
    method: 'GET',
    ca: certBuffer
}, ...);

【讨论】:

    【解决方案2】:

    如果你不想依赖 node.js 的内置列表,而是使用你的 debian/ubuntu 的列表:

    var CAs = fs.readFileSync('/etc/ssl/certs/ca-certificates.crt').toString().split(/(?=-----BEGIN CERTIFICATE-----)/);
    
    // then when you make requests...
    https.request({ ..., ca: CAs}, ...);
    

    【讨论】:

      【解决方案3】:

      您还可以使用从节点 v7.3.0 开始的 NODE_EXTRA_CA_CERTS 环境变量以 PEM 文件格式添加证书的路径

      https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file

      这样做的好处是不需要任何代码更改,只需更改node 进程的环境即可。希望这会有所帮助!

      编辑:

      还可以查看 --use-openssl-ca https://nodejs.org/api/cli.html#cli_use_openssl_ca_use_bundled_ca

      这就是我最终用来解决问题的方法。我将 .crt 文件复制到 /usr/local/share/ca-certificates 然后运行 ​​sudo update-ca-certificates 然后使用 --use-openssl-ca 运行节点,现在节点可以正确找到我的证书。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 2020-05-23
        • 2021-07-31
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        相关资源
        最近更新 更多