unable to verify the first certificate 原因及解決方法

配圖源自 Freepik

原文鏈接

背景

此前,在項(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 installnpm install 走的是 HTTPS 協(xié)議,它的安全通過(guò)數(shù)字證書來(lái)保障。數(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)通過(guò) 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 - 通過(guò) https 向注冊(cè)表發(fā)出請(qǐng)求時(shí)是否進(jìn)行 SSL 密鑰驗(yàn)證,若校驗(yàn)失敗,npm 將無(wú)法連接到服務(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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容