簡體   English   中英

Node.js 請求 CERT_HAS_EXPIRED

[英]Node.js request CERT_HAS_EXPIRED

我正在使用 Mikeal 的請求 ( https://github.com/mikeal/request ) 向服務器發出 https 請求。 但是,我不斷收到 CERT_HAS_EXPIRED 授權錯誤。

request({
        url: 'https://www.domain.com/api/endpoint',
        strictSSL: false
    }, function(error, response, body) {
        if(!error && response.statusCode == 200) {
            res.json(JSON.parse(body));
        } else {
           res.json(response.statusCode, {'error': 'error'})
        }
});

我已經嘗試將 strictSSL 設置為 true 和 false,兩者都是 output 相同的 CERT_HAS_EXPIRED 錯誤。 是什么導致了這個問題,有沒有辦法在 nodejs 中修復它?

解決此問題的最佳方法:

更新證書。 這可以使用Greenlock免費完成,它通過 Let's Encrypt™ v2 頒發證書

一個不太不安全的方式來解決這個問題:

'use strict';

var request = require('request');
var agentOptions;
var agent;

agentOptions = {
  host: 'www.example.com'
, port: '443'
, path: '/'
, rejectUnauthorized: false
};

agent = new https.Agent(agentOptions);

request({
  url: "https://www.example.com/api/endpoint"
, method: 'GET'
, agent: agent
}, function (err, resp, body) {
  // ...
});

通過使用帶有rejectUnauthorizedagent ,您至少可以將安全漏洞限制在處理該站點的請求上,而不是讓您的整個節點進程完全、完全不安全。

其他選項

如果您使用的是自簽名證書,則應添加此選項:

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

對於受信任的對等連接,您還可以添加以下 2 個選項:

agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;

壞主意

不幸的是process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 甚至被記錄在案。 它應該只用於調試,並且永遠不應該將其放入在野外運行的代碼中。 幾乎每個在https上運行的庫都有一種傳遞代理選項的方法。 那些不應該被修復的。

在文件頂部添加:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

危險這會在整個 node.js 環境中禁用 HTTPS / SSL / TLS 檢查。 請參閱下面使用 https 代理的解決方案。

如果今天有人在使用舊版本的 nodejs 時遇到此問題,這可能是由於Lets's encrypt 30th sept. 此答案中已提到2021 ROOT CA 到期

證書硬編碼在節點源代碼中,新的 ISRG Root X1 證書僅添加在此提交中。

可以更新他們的節點版本,使用node --use-openssl-ca標志(假設 openssl 證書是最新的),使用其他答案中提到的 http 代理解決方案(我沒有測試),或設置process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0作為一種快速而骯臟的解決方法。

這里有一個更簡潔的方式來實現 CoolAJ86 提出的“不那么不安全”的方法

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});

我認為strictSSL: false應該(即使在 2013 年也應該有效)有效。 簡而言之,是三種可能的方式:

  1. (很明顯)讓你的 CA 更新證書,然后把它放到你的服務器上!
  2. 更改request對象的默認設置:

    const myRequest = require('request').defaults({strictSSL: false})

    許多內部使用node-request模塊也允許注入request ,因此您可以讓它們使用您修改過的實例。
  3. (不推薦)通過設置環境變量重寫所有證書檢查所有HTTP(S)代理連接NODE_TLS_REJECT_UNAUTHORIZED=0為Node.js的過程。

嘗試臨時修改request.js,並在rejectUnauthorized = true 處硬編碼,但最好將證書擴展為長期解決方案。

更新 Nodejs 將強制刷新請求的緩存。

當別無他法時,這對我有用。

今天早上在我的 macbook pro 上調試時,我在使用 Heroku 和本地進行生產時遇到了這個問題。

經過一個小時的調試,這在本地和生產中自行解決。 我不確定是什么修復了它,所以這有點煩人。 當我認為我做了某事時它發生了,但是恢復我假設的修復並沒有把問題帶回來:(

有趣的是,我的數據庫服務 MongoDb 從今天早上開始就出現服務器問題,所以很有可能與它有關。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM