【未解决】FetchError: request to https://registry.npm.taobao.org/ failed, reason:certificate has expired

错误描述

今天创建了一个使用Ant Design Pro 的项目,

引用Umi UI

yarn add @umijs/preset-ui -D

然后就是运行程序打开图标,试着理由umi插入页面,

但是报了如下错误,并且程序自动终止了

网上搜索之后都是说  因为淘宝镜像问题

试着解决

尝试一

所以我根据找到的资料在cmd都去尝试了一遍

首先是查看nvm、npm、yarn的信息

npm config list

发现淘宝镜像没有问题,同时我还特地重新配了一遍

npm cach

<think>我们正在解决的是在Node.js中使用node-fetch请求时出现的证书过期错误(CERT_HAS_EXPIRED)。这个错误通常是因为请求的服务器证书已经过期,或者本地系统时间不正确,或者使用了过时的根证书。同时,我们也注意到用户之前提到了npm镜像的证书过期问题(引用[1][2][4]),这可能是由于镜像站点的SSL证书过期导致的。因此,我们可以从多个角度来解决。###解决方案步骤: ####1. **检查系统时间**证书验证依赖于正确的系统时间。如果系统时间不正确(比如设置到了未来或过去),会导致证书验证失败。-**Windows**:在控制面板中调整日期和时间设置。-**Linux/macOS**:使用`date`命令检查,并通过`sudodate -s "YYYY-MM-DDHH:MM:SS"`调整。 ####2. **更新根证书**操作系统的根证书存储可能过时,更新系统或手动更新根证书。-**Windows**:通过WindowsUpdate更新。- **Linux (Ubuntu/Debian)**:运行`sudo aptupdate &&sudo aptinstall --reinstallca-certificates`。-**macOS**:确保系统更新到最新版本。####3.**临时跳过SSL验证(不推荐,仅用于测试)**在开发环境中,如果确定请求的服务器是可信的,可以临时跳过SSL验证。在node-fetch中可以通过设置`agent`选项来实现:```javascriptconst fetch= require('node-fetch');const https= require('https');constagent =new https.Agent({rejectUnauthorized:false //跳过证书验证});fetch('https://example.com', {agent }).then(res=> res.text()).then(body =>console.log(body)).catch(err=> console.error(err));```**注意**:在生产环境中不要使用,因为它会降低安全性。 ####4. **更换请求的URL(如果是因为镜像站点证书过期)**如果是请求的特定URL(如npm镜像)证书过期,可以尝试更换URL。例如,引用[4]中提到了其他镜像地址:-腾讯: `http://mirrors.cloud.tencent.com/npm/`-华为:`https://mirrors.huaweicloud.com/repository/npm/`-中科大镜像:`https://registry.npmjs.org/`在node-fetch中,直接更换请求的URL即可。####5.**更新node-fetch到最新版本**旧版本的node-fetch可能存在一些已知问题,更新到最新版本可能修复:```bashnpmupdate node-fetch``` ####6. **使用其他HTTP库(如axios)并配置跳过SSL验证(临时)**如果问题仍然存在,可以尝试使用其他HTTP库,比如axios,并配置跳过SSL验证(同样,仅用于测试):```javascriptconst axios= require('axios');axios.get('https://example.com',{httpsAgent: new(require('https')).Agent({rejectUnauthorized:false })}).then(response=> console.log(response.data)).catch(error=> console.error(error));``` ###根本原因分析-**证书过期**:服务器端的SSL证书已经过期(如引用[1][2]中提到的淘宝npm镜像证书过期)。- **系统时间错误**:本地计算机的时间设置不正确。 -**根证书过时**:操作系统没有更新最新的根证书,无法验证新的证书链。 -**中间证书问题**:服务器可能缺少中间证书,导致证书链不完整。###生产环境建议- **不要跳过SSL验证**:跳过验证会使通信容易受到中间人攻击。 -**及时更新系统**:确保操作系统和根证书更新到最新。- **监控证书有效期**:如果是自己的服务器,要监控证书有效期并及时续期。 ###相关问题1.如何检查一个网站的SSL证书是否过期?2.如何在Node.js中更新根证书? 3.如何为Node.js应用配置自定义CA证书?4.除了node-fetch,还有哪些Node.js的HTTP客户端库推荐? [^1]:解决Node.js中npm ERR! errno CERT_HAS_EXPIRED问题[^2]:请求失败,原因:证书已过期[^4]:其他npm镜像地址</think>### 解决 Node.js node-fetch 的 CERT_HAS_EXPIRED 错误 当使用 `node-fetch` 发起 HTTPS 请求时遇到 `CERT_HAS_EXPIRED` 错误,表示目标服务器的 SSL 证书已过期。以下是逐步解决方案: --- #### 🔧 1. 验证目标服务器证书状态 ```bash openssl s_client -connect api.example.com:443 | openssl x509 -noout -dates ``` 检查输出中的 `notAfter` 日期确认证书是否过期。若过期需联系服务商更新证书[^1]。 --- #### 🔧 2. 临时禁用证书验证(仅开发环境) 在 `node-fetch` 请求中添加 `agent` 配置: ```javascript const https = require('https'); const fetch = require('node-fetch'); const agent = new https.Agent({ rejectUnauthorized: false // 跳过证书验证 }); await fetch('https://api.example.com', { agent }); ``` ⚠️ **警告**:生产环境禁用此选项会降低安全性[^3]。 --- #### 🔧 3. 更新根证书存储 证书问题可能由本地过期的根证书引起: - **Windows**:运行 `certutil -generateSSTFromWU roots.sst` 更新证书 - **Linux/macOS**: ```bash sudo apt update && sudo apt install --reinstall ca-certificates # Debian/Ubuntu brew update && brew reinstall ca-certificates # macOS ``` --- #### 🔧 4. 使用可靠镜像源(适用于 npm 请求) 当请求 npm 注册表时,切换至有效镜像: ```javascript // 在请求前设置注册表镜像 process.env.npm_config_registry = 'https://registry.npmmirror.com'; // 阿里云镜像 // 或使用其他镜像: // 腾讯云: http://mirrors.cloud.tencent.com/npm/ // 华为云: https://mirrors.huaweicloud.com/repository/npm/ ``` --- #### 🔧 5. 修复系统时间 证书验证依赖准确时间,检查并修正系统时间: ```bash # Linux/macOS sudo ntpdate pool.ntp.org # Windows # 通过控制面板 > 日期和时间 > 同步时间 ``` --- #### 🔧 6. 自定义证书信任链 创建自定义 HTTPS Agent: ```javascript const https = require('https'); const fs = require('fs'); const agent = new https.Agent({ ca: fs.readFileSync('./custom-root-ca.pem') // 自定义根证书 }); await fetch('https://api.example.com', { agent }); ``` --- ### 根本原因分析 1. **证书过期**:服务器 SSL 证书超过有效期(常见于测试环境或镜像源) 2. **根证书失效**:本地根证书存储未更新 3. **时间不同步**:系统时间偏差导致证书验证失败 4. **中间证书缺失**:服务器未配置完整证书链[^1][^2] --- ### 生产环境建议 1. **优先联系服务商**:要求更新有效证书(如阿里云镜像源已修复证书问题) 2. **使用证书监控**:部署 [Certbot](https://certbot.eff.org/) 或 [Let's Monitor](https://letsmonitor.org/) 3. **配置备用源**: ```javascript // 在应用中实现源切换逻辑 const mirrors = [ 'https://registry.npmjs.org', 'https://registry.npmmirror.com' ]; ``` --- ### 📚 相关问题 1. 如何检查网站 SSL 证书的有效期? 2. 使用自签名证书开发时如何避免 CERT_HAS_EXPIRED? 3. node-fetch 和 axios 处理证书错误有何区别? 4. 如何为 Node.js 应用配置自定义 CA 证书? > 附:主流 npm 镜像状态监控 > - 阿里云镜像状态:https://status.npm.taobao.org/ > - 腾讯云镜像状态:https://mirrors.cloud.tencent.com/status [^1]: npm ERR! errno CERT_HAS_EXPIRED [^2]: FetchError: request to https://registry.npm.taobao.org/create-vue failed [^3]: 禁用 SSL 验证配置方法 [^4]: 其他 npm 镜像地址解决方案
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nobody.sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值