背景
此前私植,在項(xiàng)目中安裝依賴時(shí)鼻吮,遇到了如下報(bào)錯(cuò):
yarn install v1.22.19
[1/4] ?? Resolving packages...
[2/4] ?? Fetching packages...
error An unexpected error occurred: "https://r2.cnpmjs.org/form-data/-/form-data-3.0.1.tgz: unable to verify the first certificate".
info If you think this is a bug, please open a bug report with the information provided in "/Users/frankie/Web/ifanr/yuegonghui/activity-collection/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
yarn-error.log
如下
Arguments:
/Users/frankie/Library/Application Support/fnm/node-versions/v16.15.0/installation/bin/node /usr/local/bin/yarn
PATH:
/Users/frankie/Library/Caches/fnm_multishells/57063_1669556334889/bin:/Users/frankie/.yarn/bin:/usr/local/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/frankie/Library/Caches/fnm_multishells/57063_1669556334889/bin:/Users/frankie/.yarn/bin:/usr/local/sbin:/opt/homebrew/bin:/opt/homebrew/bin
Yarn version:
1.22.19
Node version:
16.15.0
Platform:
darwin arm64
Trace:
Error: unable to verify the first certificate
at TLSSocket.onConnectSecure (node:_tls_wrap:1532:34)
at TLSSocket.emit (node:events:527:28)
at TLSSocket._finishInit (node:_tls_wrap:946:8)
at TLSWrap.ssl.onhandshakedone (node:_tls_wrap:727:12)
npm manifest:
...
yarn manifest:
No manifest
Lockfile:
...
報(bào)錯(cuò)信息為:unable to verify the first certificate
垂攘,與證書有關(guān)揭保。由于 yarn install
或 npm install
走的是 HTTPS 協(xié)議谆棺,它的安全通過數(shù)字證書來保障疚沐。數(shù)字證書由專門機(jī)構(gòu)頒發(fā)暂氯,通常是付費(fèi)的。自簽證書亮蛔,就是自己扮演數(shù)字證書機(jī)構(gòu)給自己頒發(fā)的證書痴施。
由于自 2014 年 2 月 27 日起,npm 不再支持「自簽證書 Self-Signed Certificate」。?? npm Blog
加上辣吃,也就是 https://r2.cnpmjs.org/form-data/-/form-data-3.0.1.tgz
所在域名的證書是不被信任的动遭。這點(diǎn)通過 Firefox 瀏覽器就能發(fā)現(xiàn):
其中 npm 與證書相關(guān)的配置有兩項(xiàng)
-
ca - 用于指定信任的證書頒發(fā)機(jī)構(gòu)(Certificate Authority)。默認(rèn)為
null
神得,表示僅允許「已知且可信的」證書頒發(fā)機(jī)構(gòu)所頒發(fā)的證書厘惦。 -
strict-ssl - 通過 https 向注冊表發(fā)出請(qǐng)求時(shí)是否進(jìn)行 SSL 密鑰驗(yàn)證,若校驗(yàn)失敗循头,npm 將無法連接到服務(wù)器并報(bào)錯(cuò)绵估。默認(rèn)為
true
。
解決方法
方法一
在確定「安全」的情況下卡骂,可以臨時(shí)關(guān)閉 strict-ssl
選項(xiàng):
$ yarn config set strict-ssl false
$ npm config set strict-ssl false
當(dāng)
strict-ssl
設(shè)置為false
時(shí)国裳,npm 將不會(huì)對(duì)服務(wù)器的 SSL 證書進(jìn)行校驗(yàn),并且即使證書是由不可信的認(rèn)證機(jī)構(gòu)頒發(fā)的也不會(huì)報(bào)錯(cuò)全跨。這可能會(huì)導(dǎo)致安全風(fēng)險(xiǎn)缝左,因?yàn)槟愕木W(wǎng)絡(luò)流量可能被劫持或篡改,而你并不會(huì)意識(shí)到這一點(diǎn)浓若。因此渺杉,應(yīng)該盡量避免使用strict-ssl
設(shè)置為false
。如果你確實(shí)需要使用
strict-ssl
設(shè)置為false
挪钓,例如你所連接的服務(wù)器使用的是自簽名的 SSL 證書是越,應(yīng)該只在短時(shí)間內(nèi)使用,并在操作完成后盡快將strict-ssl
設(shè)置回true
碌上。
方法二(推薦)
找出所有相關(guān)的 npm 包倚评,并選擇可信的鏡像源后重裝。
如果你處于具有攔截 HTTPS 代理的環(huán)境中馏予,它可能會(huì)破壞 npm天梧,與運(yùn)維人員聯(lián)系解決。
The end.