8

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

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

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

4

3 回答 3

6

这是因为 node 不使用你系统的 CA 配置;它包括自己的内置可接受 CA 列表

如果您希望节点 SSL 客户端接受自定义 CA,则必须在ca选项中传递 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
}, ...);
于 2013-12-18T15:35:03.480 回答
3

如果你不想依赖 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}, ...);
于 2015-06-25T20:07:36.740 回答
1

您还可以使用从节点 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 运行节点,现在节点正确地找到了我的证书。

于 2017-06-06T15:34:58.190 回答