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

kDo*_*yle 11 javascript authentication ssl https node.js

我遇到客户端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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ger 27

您需要添加NODE_TLS_REJECT_UNAUTHORIZED='0'为环境变量.

  • 我不敢相信我终于找到了可以阻止这个错误的东西。我什么都试过了。2019 年 1 月 31 日工作, (4认同)
  • 萨阿阿安克克斯SSSS (3认同)

Muk*_*yap 27

您可以NODE_TLS_REJECT_UNAUTHORIZED=0在终端中使用或在 JS 文件中插入以下行来解决此问题。

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
Run Code Online (Sandbox Code Playgroud)

请注意,这是一种黑客行为,不应在生产中使用。

如果您使用的是 Windows,则在命令提示符下运行以下命令:

set NODE_TLS_REJECT_UNAUTHORIZED=0 
Run Code Online (Sandbox Code Playgroud)

之后,npm install <my-package>将工作。

  • 应该是 `process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';` (3认同)
  • 这有效(数字),没有执行字符串版本,我在 Windows 上运行 node.js。 (2认同)

小智 10

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


小智 9

您只需在代码的开头添加这一行:

process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'
Run Code Online (Sandbox Code Playgroud)

一切都解决了,但无论如何都不值得推荐,我正在研究解决方案 https://letsencrypt.org/

  • 它有效,但我认为它只是我们的应用程序启动和运行的临时解决方案。它会发出以下警告警告:将 NODE_TLS_REJECT_UNAUTHORIZED 环境变量设置为“0”会通过禁用证书验证来使 TLS 连接和 HTTPS 请求不安全。 (2认同)

kis*_*ore 7

做:

如果出于独立目的运行节点脚本,最好使用它,

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
Run Code Online (Sandbox Code Playgroud)

不:

而不是更改所有默认请求流程。

npm config set strict-ssl=false
Run Code Online (Sandbox Code Playgroud)

即,不要更改您的节点配置,否则它将通过将其设置为默认配置来应用于您的所有请求。所以只在必要的地方使用它。


Dee*_*ain 6

对于 Nodemailer:

添加

tls: {
  rejectUnauthorized: false
}
Run Code Online (Sandbox Code Playgroud)

解决了我的问题。

整体代码看起来像这样:

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
    }
  }
Run Code Online (Sandbox Code Playgroud)


car*_*rlo 6

节点应用程序需要将 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
Run Code Online (Sandbox Code Playgroud)

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

在Linux中,有一种简单的方法来获取证书,请使用这篇文章: Use selfsignedcertificatewithcURL?

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

$ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是最好的选择,并且不会影响安全性! (2认同)

nic*_*ier 5

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

您可以ca使用options对象的键将“证书颁发机构”证书提取到请求中,如下所示:

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

https.request(opts, (response) => { }).end();
Run Code Online (Sandbox Code Playgroud)

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

这是在这里