nodejs - 证书链中的错误自签名证书

时间:2017-07-13 18:02:26

标签: javascript node.js authentication ssl https

我遇到客户端https请求的问题。

代码段可能如下所示:

var fs = require('fs');
var https = require('https');

var options = {
    hostname: 'someHostName.com',
    port: 443,
    path: '/path',
    method: 'GET',
    key: fs.readFileSync('key.key'),
    cert: fs.readFileSync('certificate.crt')
}

var requestGet = https.request(options, function(res){
    console.log('resObj', res);
}

我得到的是错误:证书链中的自签名证书。

当我使用邮递员时,我可以导入客户端证书和密钥并使用它没有任何问题。有没有解决方案?我还希望了解邮递员如何处理证书和工作。

7 个答案:

答案 0 :(得分:17)

您需要添加*作为环境变量。

答案 1 :(得分:6)

您可以编写命令 npm config set strict -ssl = false

答案 2 :(得分:3)

对于 Nodemailer:

添加

tls: {
  rejectUnauthorized: false
}

解决了我的问题。

整体代码看起来像这样:

nodemailer.createTransport({
    host: process.env.MAIL_SERVER,
    secure: false,
    port: 587,
    auth: {
      user: process.env.MAIL_USERNAME,
      pass: process.env.MAIL_PASSWORD
    },
    tls: {
      rejectUnauthorized: false
    }
  }

答案 3 :(得分:2)

关闭验证是非常危险的事情。验证证书要好得多。

您可以使用options对象的ca键将证书颁发机构证书放入请求中,如下所示:

let opts = {
    method: 'GET',
    hostname: "localhost",
    port: listener.address().port,
    path: '/',
    ca: await fs.promises.readFile("cacert.pem")
  };

https.request(opts, (response) => { }).end();

我将整个演示放在一起,以便您了解如何构建SSL测试。

here

答案 4 :(得分:2)

对于它的价值,花了一天半的时间来追踪它,结果证明错误是由IT公司必须禁用的我公司的防火墙设置引起的。互联网上的任何地方都无法解决此问题。

答案 5 :(得分:0)

您可以使用NODE_TLS_REJECT_UNAUTHORIZED = 0或

解决此问题
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;

它可以工作,但这是一个hack修复程序。

如果您使用的是Windows,则可以从命令行执行以下操作:

设置NODE_TLS_REJECT_UNAUTHORIZED = 0

然后

npm install [mypackage]

答案 6 :(得分:0)

节点应用程序需要将 CA 证书添加到现有的 CA (Mozilla) 证书中。

我们使用服务启动节点,并添加环境变量 NODE_EXTRA_CA_CERTS

[Service]
Restart=always
User=<...>
Group=<...>
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
Environment=NODE_EXTRA_CA_CERTS=/<...>/.ssl/extra_certs.pem
WorkingDirectory=/<...>

ExecStart=/usr/bin/node -r dotenv/config /<.....>/server.js dotenv_config_path=/<....>/.env

这样我们就可以使用相同的应用程序来调用使用流行 CA 或我们自己的自签名证书的服务,而且我们不必关闭 SSL 检查。

在 linux 中有一个简单的方法来获取证书,使用这个帖子:Use self signed certificate with cURL?

您使用以下方法创建证书:

$ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

然后将该 .pem 文件复制为 extra_cert.pem。您只能有一个 pem 文件,但您可以将多个 pem 文件附加到一个文件中。

我希望这对某人有所帮助,我花了一段时间才找到使这项工作正常工作的不同部分。