![](/img/trans.png)
[英]CERT_HAS_EXPIRED: node.js and https request using create-react-app
[英]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) {
// ...
});
通過使用帶有rejectUnauthorized
的agent
,您至少可以將安全漏洞限制在處理該站點的請求上,而不是讓您的整個節點進程完全、完全不安全。
如果您使用的是自簽名證書,則應添加此選項:
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 年也應該有效)有效。 簡而言之,是三種可能的方式:
request
對象的默認設置:const myRequest = require('request').defaults({strictSSL: false})
node-request
模塊也允許注入request
,因此您可以讓它們使用您修改過的實例。NODE_TLS_REJECT_UNAUTHORIZED=0
為Node.js的過程。嘗試臨時修改request.js,並在rejectUnauthorized = true 處硬編碼,但最好將證書擴展為長期解決方案。
更新 Nodejs 將強制刷新請求的緩存。
當別無他法時,這對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.