【问题标题】:nodejs - error self signed certificate in certificate chainnodejs - 证书链中的错误自签名证书
【发布时间】:2017-12-18 16:07:18
【问题描述】:

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

sn-p 可以如下所示:

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);
}

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

当我使用 Postman 时,我可以导入客户端证书和密钥并毫无问题地使用它。有什么解决办法吗??我还想了解邮递员如何处理证书和工作。

【问题讨论】:

    标签: javascript node.js authentication ssl https


    【解决方案1】:

    做:

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

    process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
    

    不要:

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

    npm config set strict-ssl=false
    

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

    【讨论】:

      【解决方案2】:

      你可以写命令npm config set strict-ssl false

      【讨论】:

        【解决方案3】:

        选项 1:禁用警告(对开发人员有用)

        根据您的问题,我猜您正在开发中这样做,因为您正在使用自签名证书进行 SSL 通信。

        如果是这种情况,请在运行节点的任何位置添加为环境变量

        export NODE_TLS_REJECT_UNAUTHORIZED='0'
        node app.js
        

        或直接运行节点

        NODE_TLS_REJECT_UNAUTHORIZED='0' node app.js
        

        这指示 Node 允许不受信任的证书(不受信任 = 未经证书颁发机构验证)

        如果您不想设置环境变量或需要为多个应用程序执行此操作,npm 有一个 strict-ssl 配置,您设置为 false

        npm config set strict-ssl=false
        

        选项 2:加载 CA 证书,如 postman(用于使用 TLS 进行测试)

        如果您已经拥有像 @kDoyle 提到的海报那样的 CA 证书,那么您可以在每个请求中进行配置(感谢 @nic ferrier)。

         let opts = {
            method: 'GET',
            hostname: "localhost",
            port: listener.address().port,
            path: '/',
            ca: fs.readFileSync("cacert.pem")
          };
        
          https.request(opts, (response) => { }).end();
        

        选项 3:使用来自可信来源的适当 SSL 证书(对生产有用)

        letsencrypt.org 是免费的,易于设置,并且可以自动轮换密钥。 https://letsencrypt.org/docs/

        【讨论】:

        • 如果我理解正确,在服务器中设置 env_var 只会禁用验证过程,这是我不想做的事情。我只需要做邮递员所做的事情,即以某种方式导入证书。
        • 是你这里给的值:cert: fs.readFileSync('certificate.crt')证书的绝对位置?
        • 还有两件事您必须考虑,CN 需要与您尝试使用的域相同,2 您的 openssl 包需要是 1.0.2+ 或者您可以使用免费 CA letsencrypt.org
        • 我不敢相信我终于找到了阻止这个错误的方法。我什么都试过了。 19 年 1 月 31 日工作,
        • THAAAAAAANKKKSSSSS
        【解决方案4】:

        节点应用程序需要将 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 文件附加到一个文件中。

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

        【讨论】:

        • 这是最好的选择,而且不会影响安全性!
        【解决方案5】:

        对于 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
            }
          }
        

        【讨论】:

        • 这正是我想要的。谢谢
        【解决方案6】:

        不管怎样,在花了一天半的时间试图追踪这个错误之后,结果发现错误是由我公司防火墙上的一个设置引起的,IT 必须禁用该设置。互联网上没有任何地方可以解决此问题。

        【讨论】:

        • 您的 IT 必须禁用的东西是什么?
        【解决方案7】:

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

        process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
        

        请注意,这是一种 hack,不应在生产中使用。

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

        set NODE_TLS_REJECT_UNAUTHORIZED=0 
        

        之后,npm install &lt;my-package&gt; 将起作用。

        【讨论】:

        • 应该是process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
        • 这个工作(数字),没有做字符串版本,我在windows上运行node.js。
        • 两者都有效,第一个(数字)对我有用。 (centos)
        • 在 Windows 上使用 SelfSigned 证书进行 ftp 并使用 ftp npm 模块时出现错误。解决方案有什么不同吗?
        【解决方案8】:

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

        process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'
        

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

        【讨论】:

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

        关闭验证是一件非常危险的事情。更好地验证证书。

        您可以使用选项对象的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

        【讨论】:

          猜你喜欢
          • 2018-03-26
          • 1970-01-01
          • 2012-08-24
          • 2015-09-08
          • 1970-01-01
          • 1970-01-01
          • 2022-06-16
          • 2019-01-23
          • 2019-12-16
          相关资源
          最近更新 更多