วิธีแก้ไขข้อผิดพลาดใบรับรอง SSL เมื่อเรียกใช้ Npm บน Windows


88

เมื่อฉันพยายามติดตั้งแพคเกจด้วย npm ไม่ได้ผล หลังจากรอมานานในที่สุดฉันก็ได้รับข้อผิดพลาด 'ไม่สามารถสร้างซ็อกเก็ตอุโมงค์ sutatusCode = 403'

$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
npm ERR!     at ClientRequest.onConnect (c:\Program Files\nodejs\node_modules\npm\node_modules\request\tunnel.js:148:19)
npm ERR!     at ClientRequest.g (events.js:193:14)
npm ERR!     at ClientRequest.EventEmitter.emit (events.js:123:20)
npm ERR!     at Socket.socketOnData (http.js:1393:11)
npm ERR!     at TCP.onread (net.js:403:27)

อย่างไรก็ตามเมื่อฉันเรียกดู URL เดียวกันนั้นในเว็บเบราว์เซอร์ (Google Chrome) มันโหลดได้ดี (ดูเชิงอรรถ) https://registry.npmjs.org/coffee-script

เกิดอะไรขึ้น?


แม้ว่าฉันจะใช้พร็อกซี https แต่ฉันมั่นใจว่านี่ไม่ใช่ปัญหา ฉันได้กำหนดค่าตัวแปรสภาพแวดล้อมแล้วhttps_proxy(ตามคู่มือผู้ใช้ npm ) ฉันรู้ว่าตัวแปรสภาพแวดล้อมถูกต้องเนื่องจากตัวจัดการแพ็คเกจ Python ทำpipตามอย่างถูกต้อง

ฉันเชื่อว่าปัญหาเกี่ยวข้องกับใบรับรอง SSL เนื่องจากหากฉันดาวน์โหลด URL นั้นด้วยwgetฉันจะได้รับข้อผิดพลาดที่ชัดเจนเกี่ยวกับใบรับรอง

$ wget https://registry.npmjs.org/coffee-script
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = c:/progra~1/wget/etc/wgetrc
--2012-12-17 12:14:07--  https://registry.npmjs.org/coffee-script
Resolving corpproxy... 10.254.215.35
Connecting to corpproxy|10.254.215.35|:8080... connected.
ERROR: cannot verify registry.npmjs.org's certificate, issued by `/C=US/ST=CA/L=Oakland/O=npm/OU=npm Certificate Authority/CN=npmCA/emailAddress=i@izs.me':
  Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

ฉันจะแก้ไขปัญหานี้ได้อย่างไร? โดยไม่สูญเสียความปลอดภัย


ฉันเคยได้รับข้อผิดพลาดใบรับรอง SSL ในเว็บเบราว์เซอร์ของฉันเช่นกันจนกระทั่งฉันติดตั้งใบรับรอง 'npmCA' เป็น 'ผู้ออกใบรับรองหลักที่เชื่อถือได้' ในตัวเลือกอินเทอร์เน็ตของแผงควบคุม (ภาพหน้าจอใส่คำอธิบายภาพที่นี่)


แก้ไข: ฉันลองวิธีแก้ปัญหาที่ไม่ปลอดภัยต่อhttps://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

แต่ก็ยังหมดเวลาด้วยข้อผิดพลาดเดิม

$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403

สิ่งนี้คล้ายกับปัญหาที่ฉันพบ: stackoverflow.com/questions/11773509/…
nwinkler

1
สวัสดี. ดูเพิ่มเติมที่github.com/isaacs/npm/issues/2728
Colonel Panic

1
การป้อน "npm set tight-ssl false" ช่วยแก้ปัญหาได้
MrD

คำตอบ:


143

TL; DR - เพียงแค่เรียกใช้สิ่งนี้และอย่าปิดการใช้งานความปลอดภัยของคุณ:

แทนที่ใบรับรองที่มีอยู่

# Windows/MacOS/Linux 
npm config set cafile "<path to your certificate file>"

# Check the 'cafile'
npm config get cafile

หรือ ขยายใบรับรองที่มีอยู่

ตั้งค่าตัวแปรสภาพแวดล้อมนี้เพื่อขยายใบรับรองที่กำหนดไว้ล่วงหน้า: NODE_EXTRA_CA_CERTSถึง"<path to certificate file>"

เต็มเรื่อง

ฉันต้องทำงานกับ npm, pip, maven ฯลฯ หลังไฟร์วอลล์ขององค์กรภายใต้ Windows - มันไม่สนุกเลย ฉันจะพยายามทำให้แพลตฟอร์มนี้ไม่เชื่อเรื่องพระเจ้า / รับรู้หากทำได้

HTTP_PROXY และ HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYเป็นตัวแปรสภาพแวดล้อมที่ซอฟต์แวร์จำนวนมากใช้เพื่อให้ทราบว่าพร็อกซีของคุณอยู่ที่ใด ภายใต้ Windows ซอฟต์แวร์จำนวนมากยังใช้พร็อกซีที่ระบุระบบปฏิบัติการของคุณซึ่งเป็นสิ่งที่แตกต่างกันโดยสิ้นเชิง นั่นหมายความว่าคุณสามารถมี Chrome (ซึ่งใช้พร็อกซีที่ระบุไว้ในตัวเลือกอินเทอร์เน็ตของคุณ) เชื่อมต่อกับ URL ได้ดี แต่ npm, pip, maven ฯลฯ ไม่ทำงานเนื่องจากใช้ HTTPS_PROXY (ยกเว้นเมื่อใช้ HTTP_PROXY - ดูภายหลัง) โดยปกติตัวแปรสภาพแวดล้อมจะมีลักษณะดังนี้:

http://proxy.example.com:3128

แต่คุณได้รับ403ซึ่งแสดงว่าคุณไม่ได้รับการรับรองความถูกต้องจากพร็อกซีของคุณ หากเป็นการตรวจสอบสิทธิ์พื้นฐานบนพร็อกซีคุณจะต้องตั้งค่าตัวแปรสภาพแวดล้อมเป็นรูปแบบ:

http://user:pass@proxy.example.com:3128

NTLM หวั่น

มีรหัสสถานะ HTTP 407 (ต้องมีการตรวจสอบสิทธิ์พร็อกซี) ซึ่งเป็นวิธีที่ถูกต้องกว่าในการบอกว่าเป็นพร็อกซีแทนที่จะเป็นเซิร์ฟเวอร์ปลายทางที่ปฏิเสธคำขอของคุณ รหัสที่รบกวนฉันสำหรับเวลาที่ยาวที่สุดจนกว่าจะได้รับจำนวนมากของเวลาใน Google ผมได้เรียนรู้พร็อกซี่ของฉันที่ใช้ตรวจสอบความถูกต้องของ NTLM การตรวจสอบสิทธิ์พื้นฐาน HTTP ไม่เพียงพอที่จะตอบสนองพร็อกซีใด ๆ ก็ตามที่โอเวอร์ลอร์ดขององค์กรของฉันติดตั้งไว้ ฉันใช้Cntlmบนเครื่องท้องถิ่นของฉัน (ไม่ได้รับการรับรองความถูกต้อง) จากนั้นให้จัดการการรับรองความถูกต้อง NTLM ด้วยพร็อกซีต้นทาง จากนั้นฉันต้องบอกโปรแกรมทั้งหมดที่ไม่สามารถทำ NTLM เพื่อใช้เครื่องในพื้นที่ของฉันเป็นพร็อกซีซึ่งโดยทั่วไปแล้วจะง่ายเหมือนการตั้งค่าHTTP_PROXYและHTTPS_PROXY. มิฉะนั้นสำหรับการใช้ npm (ตามที่ @Agus แนะนำ):

npm config set proxy http://proxy.example.com:3128
npm config set https-proxy http://proxy.example.com:3128

"เราจำเป็นต้องถอดรหัสการรับส่งข้อมูล HTTPS ทั้งหมดเพราะไวรัส"

หลังจากการตั้งค่านี้ได้รับการคร่ำครวญไปพร้อม ๆ กัน (clunkily) เป็นเวลาประมาณหนึ่งปีหัวหน้าขององค์กรก็ตัดสินใจที่จะเปลี่ยนพร็อกซี ไม่เพียงแค่นั้น แต่จะไม่ใช้ NTLM อีกต่อไป! โลกใหม่ที่กล้าหาญที่จะมั่นใจ แต่เนื่องจากขณะนี้ผู้เขียนซอฟต์แวร์ที่เป็นอันตรายเหล่านั้นส่งมัลแวร์ผ่าน HTTPS วิธีเดียวที่พวกเขาสามารถปกป้องเราผู้ใช้ที่ไร้เดียงสาที่น่าสงสารคือการเชื่อมต่อทุกครั้งเพื่อสแกนหาภัยคุกคามก่อนที่พวกเขาจะมาถึงเรา อย่างที่คุณนึกออกฉันเอาชนะความรู้สึกปลอดภัยได้

ในการตัดเรื่องสั้นให้สั้นลงจำเป็นต้องติดตั้งใบรับรองที่ลงนามด้วยตนเองลงใน npm เพื่อหลีกเลี่ยงSELF_SIGNED_CERT_IN_CHAIN:

npm config set cafile "<path to certificate file>"

หรืออีกวิธีหนึ่งคือNODE_EXTRA_CA_CERTSสามารถตั้งค่าตัวแปรสภาพแวดล้อมเป็นไฟล์ใบรับรอง

ฉันคิดว่านั่นคือทุกสิ่งที่ฉันรู้เกี่ยวกับการทำให้ npm ทำงานหลังพร็อกซี / ไฟร์วอลล์ อาจมีคนพบว่ามีประโยชน์

แก้ไข : มันเป็นข้อเสนอแนะที่พบบ่อยมากที่จะปิด HTTPS สำหรับปัญหานี้อย่างใดอย่างหนึ่งโดยใช้ HTTP NODE_TLS_REJECT_UNAUTHORIZEDรีจิสทรีหรือการตั้งค่า สิ่งเหล่านี้ไม่ใช่ความคิดที่ดีเพราะคุณกำลังเปิดใจรับการโจมตีแบบ man-in-the-middle หรือการเปลี่ยนเส้นทาง การปลอมแปลงระเบียน DNS ของคุณอย่างรวดเร็วบนเครื่องที่ทำการติดตั้งแพ็กเกจและคุณจะพบว่าตัวเองเชื่อถือแพ็กเกจได้จากทุกที่ การทำให้ HTTPS ทำงานอาจดูเหมือนเป็นเรื่องยาก แต่ขอแนะนำอย่างยิ่ง เมื่อคุณเป็นผู้รับผิดชอบในการอนุญาตให้ใช้รหัสที่ไม่น่าเชื่อถือใน บริษัท คุณจะเข้าใจว่าทำไม

แก้ไข 2 : โปรดทราบว่าการตั้งค่าnpm config set cafile <path>ทำให้ npm ใช้ใบรับรองที่ให้ไว้ในไฟล์นั้นเท่านั้นแทนที่จะขยายใบรับรองที่มีอยู่ออกไป

หากคุณต้องการขยายใบรับรองที่มีอยู่ (เช่นใบรับรองของ บริษัท ) โดยใช้ตัวแปรสภาพแวดล้อมNODE_EXTRA_CA_CERTSเพื่อเชื่อมโยงไปยังไฟล์เป็นวิธีที่จะไปและสามารถช่วยคุณประหยัดความยุ่งยากได้มาก ดูhow-to-add-custom-certificate-authority-ca-to-nodejs


9
ใน Windows ฉันต้องใช้เครื่องหมายทับ: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus

4
** ไม่มีเครื่องหมายเท่ากับ= npm config set cafile "<path to your certificate file>"
Moti Winkler

3
นี่เป็นคำตอบที่ยอดเยี่ยม - ฉันไม่สามารถสรุปอาการปวดหัวของตัวเองได้ดีกว่าเกี่ยวกับ proxy + zscalar
Jpnh

7
หัวเราะอย่างหนักเพราะ "อย่างที่คุณนึกออกฉันเอาชนะด้วยความรู้สึกปลอดภัย" :)
Mario B

3
ฉันจะรับไฟล์ใบรับรองได้อย่างไร
Aditya

37

ปัญหานี้ได้รับการแก้ไขสำหรับฉันโดยใช้ที่เก็บเวอร์ชัน http:

npm config set registry http://registry.npmjs.org/

54
นั่นเป็นทางออกที่แย่มาก!
KiT O

4
@HaBo ฉันเดาว่าเขาหมายความว่ามันไม่ปลอดภัย
gabeio

3
@KiTO มันเป็นทางออกที่ไม่ดีเห็นด้วย แต่ทำไมฉันต้องยุ่งกับปัญหาใบรับรองเมื่อฉันต้องการติดตั้งแพ็คเกจบางอย่าง
Ich

17
คำตอบนี้ถูกต้อง มีบางกรณีที่คุณอยู่เบื้องหลังความยุ่งเหยิงของพร็อกซีขององค์กรที่มีห่วงโซ่ใบรับรองของตัวเองอยู่เหนือผู้อื่นและไม่มีวิธีอื่นใด (นอกเหนือจากการปิดใช้งานใบรับรองเลย) ไปกว่านี้ (โดยเฉพาะอย่างยิ่งเมื่อพวกเขาไม่ให้สิทธิ์ผู้ดูแลระบบแก่คุณ) ฟังดูเหมือนบั๊ก npm ซึ่งโหลดการตั้งค่าที่เหมาะสมจากระบบไม่ถูกต้อง แต่เพื่อความเข้ากันได้ข้ามกันพวกเขาจะไม่แก้ไข npm ดังนั้นนี่คือผลลัพธ์ของมัน คนที่บอกว่ามันเป็นคำตอบที่ไม่ดีพวกเขาไม่รู้ว่ากำลังพูดถึงอะไร
kenorb

3
@kenorb ไม่ถูกต้องคุณสามารถย้อนกลับขั้นตอนที่พร็อกซีของคุณใช้และเพิ่มใบรับรองที่ลงนามด้วยตนเองเหล่านั้นลงในเครือของคุณด้วยคาเฟ่
dardo

15
npm config set strict-ssl false

แก้ไขปัญหาให้ฉัน ในกรณีนี้ทั้งตัวแทนและศูนย์รับฝากสิ่งประดิษฐ์ของฉันอยู่หลังซับเน็ตส่วนตัวบนคลาวด์ aws


โซลูชันนี้จะปิดการใช้งาน ssl สำหรับการติดตั้งทั้งหมดซึ่งมีความเสี่ยงด้านความปลอดภัย การตั้งค่ารีจิสทรี npm เป็นโซลูชันจริง npm config set Registry Registry.npmjs.org
Ali

7

ฉันมีปัญหาเดียวกันฉันเอาชนะการใช้

npm config set proxy http://my-proxy.com:1080
npm config set https-proxy http://my-proxy.com:1080

ข้อมูลเพิ่มเติมที่node-doc


6

ฉันบังเอิญพบปัญหา SSL ที่คล้ายกันนี้เมื่อสองสามวันก่อน ปัญหาคือ NPM ของคุณไม่ได้ตั้งใบรับรองหลักสำหรับใบรับรองที่ใช้โดยhttps://registry.npmjs.org

แนวทางแก้ไข:

  1. ใช้wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crtเพื่อแก้ไขปัญหา wget
  2. ใช้npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtเพื่อตั้งค่าใบรับรองหลักสำหรับโปรแกรม npm ของคุณ

คุณสามารถดาวน์โหลดใบรับรองหลักจาก: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

หมายเหตุ:โปรแกรมที่แตกต่างกันอาจใช้วิธีการจัดการใบรับรองหลักที่แตกต่างกันดังนั้นอย่าผสมเบราว์เซอร์กับผู้อื่น

การวิเคราะห์:

มาแก้ไขปัญหาของคุณwget https://registry.npmjs.org/coffee-scriptก่อน ตัวอย่างข้อมูลของคุณระบุว่า:

        ข้อผิดพลาด: ไม่สามารถตรวจสอบใบรับรองของ Registry.npmjs.org
        ออกโดย / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       ผู้ออกใบรับรอง/CN=npmCA/emailAddress=i@izs.me:
       ไม่สามารถตรวจสอบสิทธิ์ของผู้ออกหลักทรัพย์ในพื้นที่ได้

ซึ่งหมายความว่าโปรแกรม wget ของคุณไม่สามารถตรวจสอบhttps://registry.npmjs.orgใบรับรองของ มีสาเหตุสองประการที่อาจทำให้เกิดปัญหานี้:

  1. โปรแกรม wget ของคุณไม่มีใบรับรองหลักของโดเมนนี้ ใบรับรองหลักมักจะมาพร้อมกับระบบ
  2. โดเมนไม่ได้บรรจุใบรับรองหลักไว้ในใบรับรองของเขา

ดังนั้นโซลูชันจึงตั้งค่าใบรับรองหลักอย่างชัดเจนสำหรับhttps://registry.npmjs.org. เราสามารถใช้ openssl เพื่อให้แน่ใจว่าสาเหตุที่ร้องคือปัญหา

ลองใช้openssl s_client -host registry.npmjs.org -port 443บรรทัดคำสั่งและเราจะได้รับข้อความนี้ (หลายบรรทัดแรก):

    เชื่อมต่อแล้ว (00000003)
    ความลึก = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    ตรวจสอบข้อผิดพลาด: num = 20: ไม่สามารถรับใบรับรองผู้ออกในพื้นที่
    ตรวจสอบผลตอบแทน: 0
    ---
    ห่วงโซ่ใบรับรอง
     0 วินาที: / C = US / ST = California / L = San Francisco / O = Fastly, Inc./CN=a.sni.fastly.net
       i: / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
     1 วินาที: / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
       i: / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance EV Root CA
    ---

บรรทัดนี้ verify error:num=20:unable to get local issuer certificateตรวจสอบให้แน่ใจhttps://registry.npmjs.orgว่าไม่ได้บรรจุใบรับรองหลัก ดังนั้นเราจึงเป็นDigiCert High Assurance EV Root CAใบรับรองหลักของ Google


หากคุณสามารถให้เฉพาะไฟล์ฐานข้อความ (เช่น Jenkins builds) ใบรับรองนี้สามารถแปลงเป็น pem: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

ฉันมีปัญหาเดียวกัน หลังจากการขุดบางครั้งฉันก็รู้ว่าสคริปต์หลังการติดตั้ง / ก่อนการติดตั้งจำนวนมากจะพยายามติดตั้งการอ้างอิงต่างๆและบางครั้งก็มีการใช้ที่เก็บข้อมูลเฉพาะ วิธีที่ดีกว่าคือปิดการใช้งานการตรวจสอบใบรับรองสำหรับโมดูล https สำหรับ nodejs ที่เหมาะกับฉัน

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

จากคำถามนี้


2
ดังที่ได้กล่าวไปแล้วสิ่งนี้จะไม่สามารถแก้ไขปัญหา SSL ได้ แต่จะผ่านไปเท่านั้น วิธีที่เหมาะสมในการจัดการกับปัญหานี้คือการกำหนดค่าแต่ละแพ็คเกจ (git, npm, node) อย่างเหมาะสมเพื่อให้เชื่อถือใบรับรองการลงนามที่เหมาะสม หากคุณอยู่หลังพร็อกซี coporate ของ couurse
Aaron C

0

ปัญหาอยู่ที่พร็อกซีของคุณ เนื่องจากผู้ให้บริการตำแหน่งของแพ็คเกจการติดตั้งของคุณสร้างใบรับรองของตนเองและไม่ได้ซื้อใบรับรองที่ได้รับการยืนยันจากหน่วยงานที่ได้รับการยอมรับพร็อกซีของคุณจึงไม่อนุญาตให้เข้าถึงโฮสต์เป้าหมาย ฉันถือว่าคุณข้ามพร็อกซีเมื่อใช้เบราว์เซอร์ Chrome ดังนั้นจึงไม่มีการตรวจสอบ

มีวิธีแก้ปัญหาบางอย่างสำหรับปัญหานี้ แต่ทั้งหมดหมายความว่าคุณไว้วางใจผู้ให้บริการแพ็กเกจ

การแก้ปัญหาที่เป็นไปได้:

  1. ดังที่กล่าวไว้ในคำตอบอื่น ๆ คุณสามารถhttp://เข้าถึงได้ซึ่งอาจข้ามพร็อกซีของคุณ มันค่อนข้างอันตรายเพราะคนที่อยู่ตรงกลางสามารถฉีดมัลแวร์เข้าไปในการดาวน์โหลดของคุณได้
  2. แนะนำให้คุณใช้ธงwget --no-check-certificateสิ่งนี้จะเพิ่มคำสั่งพร็อกซีให้กับคำขอของคุณ พร็อกซีถ้าเข้าใจคำสั่งจะไม่ตรวจสอบว่าใบรับรองเซิร์ฟเวอร์ได้รับการตรวจสอบโดยผู้มีอำนาจและส่งคำขอหรือไม่ บางทีอาจมีการกำหนดค่ากับ npm ที่เหมือนกับแฟล็ก wget
  3. คุณกำหนดค่าพร็อกซีของคุณให้ยอมรับ CA npm ฉันไม่ทราบพร็อกซีของคุณดังนั้นฉันจึงไม่สามารถให้คำใบ้กับคุณได้


0

นี่คือสิ่งที่คุณสามารถทำได้เพื่อหลีกเลี่ยง npm และใช้เส้นด้ายในเครื่องทำหน้าต่าง

yarn config set "strict-ssl" false

0

หากคุณมีอำนาจควบคุมพร็อกซีเซิร์ฟเวอร์หรือสามารถโน้มน้าวผู้ดูแลระบบไอทีของคุณได้คุณสามารถพยายามยกเว้น Registry.npmjs.org อย่างชัดเจนจากการตรวจสอบ SSL สิ่งนี้ควรหลีกเลี่ยงไม่ให้ผู้ใช้พร็อกซีเซิร์ฟเวอร์ต้องปิดการใช้งานการตรวจสอบ ssl ที่เข้มงวดหรือติดตั้ง root CA ใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.