Cách sửa lỗi chứng chỉ SSL khi chạy Npm trên Windows?


88

Khi tôi cố gắng cài đặt một gói với npm, nó không hoạt động. Sau một thời gian dài chờ đợi, cuối cùng tôi nhận được lỗi 'không thể thiết lập ổ cắm đường hầm, 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)

Tuy nhiên, khi tôi duyệt đến cùng một URL đó trong trình duyệt web của mình (Google Chrome), nó tải tốt (xem chú thích). https://registry.npmjs.org/coffee-script

Có chuyện gì vậy?


Mặc dù tôi tình cờ sử dụng proxy https, nhưng tôi tin rằng đây không phải là vấn đề. Tôi đã định cấu hình biến môi trường https_proxy(theo hướng dẫn sử dụng npm ). Tôi biết biến môi trường là đúng, vì trình quản lý gói Python piptuân theo nó một cách chính xác.

Tôi tin rằng sự cố liên quan đến chứng chỉ SSL, vì nếu tôi tải xuống URL đó bằng wget, tôi sẽ gặp lỗi rõ ràng về chứng chỉ

$ 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.

Làm thế nào tôi có thể sửa lỗi này? Mà không ảnh hưởng đến bảo mật.


Tôi cũng từng gặp lỗi chứng chỉ SSL trong trình duyệt web của mình, cho đến khi tôi cài đặt chứng chỉ 'npmCA' làm 'cơ quan cấp chứng chỉ gốc đáng tin cậy' trong Tùy chọn Internet của Control Panel (ảnh chụp màn hình nhập mô tả hình ảnh ở đây)


Chỉnh sửa: Tôi đã thử một giải pháp không an toàn cho mỗi https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

Tuy nhiên, nó vẫn hết thời gian với cùng một lỗi

$ 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

Điều này tương tự những vấn đề tôi đang gặp: stackoverflow.com/questions/11773509/...
nwinkler


Nhập "bộ NPM nghiêm ngặt-ssl false" đã giải quyết một vấn đề
MrD

Câu trả lời:


142

TL; DR - Chỉ cần chạy cái này và không tắt bảo mật của bạn:

Thay thế các chứng chỉ hiện có

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

# Check the 'cafile'
npm config get cafile

hoặc mở rộng chứng chỉ hiện có

Đặt biến môi trường này để mở rộng chứng chỉ được xác định trước: NODE_EXTRA_CA_CERTSthành"<path to certificate file>"

Toàn truyện

Tôi đã phải làm việc với npm, pip, maven, v.v. đằng sau tường lửa của công ty trong Windows - điều đó không thú vị. Tôi sẽ cố gắng và giữ cho nền tảng này bất khả tri / nhận biết nếu có thể.

HTTP_PROXY và HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYlà các biến môi trường được nhiều phần mềm sử dụng để biết vị trí proxy của bạn. Trong Windows, nhiều phần mềm cũng sử dụng proxy được chỉ định trong hệ điều hành của bạn, điều này hoàn toàn khác. Điều đó có nghĩa là bạn có thể có Chrome (sử dụng proxy được chỉ định trong Tùy chọn Internet của bạn) kết nối với URL tốt, nhưng npm, pip, maven, v.v. không hoạt động vì chúng sử dụng HTTPS_PROXY (ngoại trừ khi chúng sử dụng HTTP_PROXY - xem sau). Thông thường, biến môi trường sẽ trông giống như sau:

http://proxy.example.com:3128

Nhưng bạn nhận được 403 cho thấy bạn không được xác thực dựa trên proxy của mình. Nếu đó là xác thực cơ bản trên proxy, bạn sẽ muốn đặt biến môi trường thành một cái gì đó có dạng:

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

NTLM đáng sợ

Có mã trạng thái HTTP 407 (yêu cầu xác thực proxy), đây là cách nói đúng hơn đó là proxy chứ không phải máy chủ đích đang từ chối yêu cầu của bạn. Đoạn mã đó khiến tôi khó chịu trong thời gian dài nhất cho đến khi sau rất nhiều thời gian trên Google, tôi biết được proxy của mình đã sử dụng xác thực NTLM . Xác thực cơ bản HTTP không đủ để đáp ứng bất kỳ proxy nào mà các lãnh chúa công ty của tôi đã cài đặt. Tôi đã sử dụng Cntlm trên máy cục bộ của mình (chưa được xác thực), sau đó để nó xử lý xác thực NTLM với proxy ngược dòng. Sau đó, tôi phải yêu cầu tất cả các chương trình không thể thực hiện NTLM sử dụng máy cục bộ của tôi làm proxy - điều này thường đơn giản như cài đặt HTTP_PROXYHTTPS_PROXY. Nếu không, để sử dụng npm (như @Agus đề xuất):

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

"Chúng tôi cần giải mã tất cả lưu lượng HTTPS do vi rút"

Sau khi việc thiết lập này diễn ra rầm rộ (lùm xùm) trong khoảng một năm, các lãnh chúa của công ty đã quyết định thay đổi ủy quyền. Không chỉ vậy, nó sẽ không còn sử dụng NTLM nữa! Một thế giới mới dũng cảm để chắc chắn. Nhưng bởi vì những kẻ viết phần mềm độc hại đó hiện đang phân phối phần mềm độc hại qua HTTPS, nên cách duy nhất họ có thể bảo vệ những người dùng vô tội đáng thương của chúng ta là kiểm soát mọi kết nối để quét các mối đe dọa trước khi chúng đến được với chúng ta. Như bạn có thể tưởng tượng, tôi đã vượt qua với cảm giác an toàn.

Để cắt ngắn một câu chuyện dài, chứng chỉ tự ký cần được cài đặt vào npm để tránh SELF_SIGNED_CERT_IN_CHAIN:

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

Ngoài ra, NODE_EXTRA_CA_CERTSbiến môi trường có thể được đặt thành tệp chứng chỉ.

Tôi nghĩ đó là tất cả những gì tôi biết về cách làm cho npm hoạt động sau proxy / tường lửa. Mong ai đó tìm thấy nó hữu ích.

Chỉnh sửa : Một gợi ý thực sự phổ biến là tắt HTTPS cho sự cố này bằng cách sử dụng cài đặt hoặc đăng ký HTTP NODE_TLS_REJECT_UNAUTHORIZED. Đây không phải là những ý tưởng hay bởi vì bạn đang mở rộng bản thân trước các cuộc tấn công từ người trung gian hoặc chuyển hướng. Việc giả mạo nhanh chóng các bản ghi DNS của bạn trên máy đang thực hiện cài đặt gói và bạn sẽ thấy mình tin tưởng các gói từ bất kỳ đâu. Để làm cho HTTPS hoạt động có vẻ như rất nhiều công việc, nhưng nó rất được khuyến khích. Khi bạn là người chịu trách nhiệm cho phép mã không đáng tin cậy vào công ty, bạn sẽ hiểu tại sao.

Chỉnh sửa 2 : Hãy nhớ rằng cài đặt npm config set cafile <path>khiến npm chỉ sử dụng các chứng chỉ được cung cấp trong tệp đó, thay vì mở rộng các chứng chỉ hiện có với nó.

Nếu bạn muốn mở rộng chứng chỉ hiện có (ví dụ: với chứng chỉ của công ty), sử dụng biến môi trường NODE_EXTRA_CA_CERTSđể liên kết đến tệp là cách tốt nhất và có thể giúp bạn tiết kiệm rất nhiều rắc rối. Xem how-to-add-custom-certificate-Authority-ca-to-nodejs


9
Trên Windows, tôi phải sử dụng dấu gạch chéo về phía trước: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus

4
** Nếu không có dấu bằng= npm config set cafile "<path to your certificate file>"
Moti Winkler

3
Đây là một phản ứng tuyệt vời - tôi không thể tóm tắt đau đầu của riêng tôi tốt hơn liên quan đến ủy quyền + zscalar
Jpnh

7
đã cười rất tươi vì "Như bạn có thể tưởng tượng, tôi đã vượt qua với cảm giác an toàn." :)
Mario B

3
Làm cách nào để lấy tệp chứng chỉ?
Aditya

36

Sự cố này đã được khắc phục cho tôi bằng cách sử dụng phiên bản kho lưu trữ http:

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

52
Đó là một giải pháp rất tồi!
KiT O

4
@HaBo Tôi đoán anh ấy có nghĩa là điều này không an toàn.
gabeio

3
@KiTO Đó là một giải pháp tồi, đã đồng ý. Nhưng tại sao tôi phải gặp rắc rối với các vấn đề chứng chỉ khi tôi chỉ muốn cài đặt một số gói?
Ích

17
Câu trả lời này là chính xác. Có một số trường hợp khi bạn đứng sau mớ hỗn độn proxy của công ty với chuỗi chứng chỉ của riêng mình ở trên những người khác và không có cách nào khác (ngoài việc vô hiệu hóa chứng chỉ) ngoài cách này (đặc biệt là khi họ không cấp cho bạn quyền quản trị). Điều này giống như lỗi npm không tải đúng cài đặt thích hợp từ hệ thống. Nhưng vì lợi ích tương thích chéo, họ sẽ không sửa chữa npm, vì vậy đây là kết quả của nó. Những người nói đó là một câu trả lời tồi, họ không biết họ đang nói về cái gì.
kenorb

3
@kenorb không chính xác, bạn có thể truy xuất lại các bước mà proxy của bạn thực hiện và thêm các chứng chỉ tự ký đó vào chuỗi của bạn bằng cafile.
dardo

15
npm config set strict-ssl false

đã giải quyết vấn đề cho tôi. Trong trường hợp này, cả đại lý và kho lưu ký giả của tôi đều nằm sau một mạng con riêng trên đám mây aws


7

Tôi đang gặp vấn đề tương tự, tôi đã khắc phục bằng cách sử dụng

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

Ngoài ra thông tin tại node-doc


6

Tôi đã tình cờ gặp sự cố SSL tương tự này vài ngày trước. Vấn đề là npm của bạn không đặt chứng chỉ gốc cho chứng chỉ được sử dụng bởi https://registry.npmjs.org .

Các giải pháp:

  1. Sử dụng wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crtđể khắc phục sự cố wget
  2. Sử dụng npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtđể đặt chứng chỉ gốc cho chương trình npm của bạn.

bạn có thể tải xuống chứng chỉ gốc từ: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Lưu ý: Các chương trình khác nhau có thể sử dụng các cách khác nhau để quản lý chứng chỉ gốc, vì vậy không nên kết hợp trình duyệt với các trình duyệt khác.

Phân tích:

hãy khắc phục sự cố của bạn wget https://registry.npmjs.org/coffee-scripttrước. đoạn mã của bạn nói:

        LỖI: không thể xác minh chứng chỉ của registry.npmjs.org,
        được cấp bởi / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       Tổ chức phát hành chứng chỉ/CN=npmCA/emailAddress=i@izs.me:
       Không thể xác minh cục bộ cơ quan phát hành.

Điều này có nghĩa là chương trình wget của bạn không thể xác minh https://registry.npmjs.orgchứng chỉ của. Có hai lý do có thể gây ra sự cố này:

  1. Chương trình wget của bạn không có chứng chỉ gốc của miền này. Chứng chỉ gốc thường đi kèm với hệ thống.
  2. Miền không đóng gói chứng chỉ gốc vào chứng chỉ của anh ấy.

Vì vậy, giải pháp rõ ràng là đặt chứng chỉ gốc cho https://registry.npmjs.org. Chúng ta có thể sử dụng openssl để đảm bảo rằng lý do dưới đây là vấn đề.

Hãy thử openssl s_client -host registry.npmjs.org -port 443trên dòng lệnh và chúng tôi sẽ nhận được thông báo này (một vài dòng đầu tiên):

    ĐÃ KẾT NỐI (00000003)
    deep = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    xác minh lỗi: num = 20: không thể lấy chứng chỉ tổ chức phát hành địa phương
    xác minh trả lại: 0
    ---
    Chuỗi chứng chỉ
     0 s: / 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 s: / 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
    ---

Dòng này verify error:num=20:unable to get local issuer certificateđảm bảo rằng https://registry.npmjs.orgkhông đóng gói chứng chỉ gốc. Vì vậy, chúng tôi Google DigiCert High Assurance EV Root CAroot Chứng chỉ.


Nếu bạn chỉ có thể cung cấp tệp cơ sở văn bản (như đối với các bản dựng Jenkins), thì chứng chỉ này có thể được chuyển đổi thành pem: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

Tôi đã gặp vấn đề tương tự. Sau khi đào sâu, tôi nhận ra rằng nhiều tập lệnh đăng / cài đặt trước sẽ cố gắng cài đặt các phụ thuộc khác nhau và một số lần sử dụng các kho lưu trữ cụ thể. Một cách tốt hơn là tắt kiểm tra chứng chỉ cho mô-đun https cho nodejs đã hoạt động với tôi.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

Từ câu hỏi này


2
Như đã đề cập, điều này sẽ không khắc phục được vấn đề SSL, nó sẽ chỉ vượt qua nó. Cách thích hợp để giải quyết vấn đề này là định cấu hình đúng từng gói (git, npm, node) để tin cậy chứng chỉ ký thích hợp. Nếu bạn đứng sau một ủy quyền công ty, của couurse.
Aaron C

0

Vấn đề nằm ở proxy của bạn. Vì nhà cung cấp vị trí của gói cài đặt của bạn tạo chứng chỉ của riêng họ và không mua chứng chỉ đã được xác minh từ cơ quan được chấp nhận, nên proxy của bạn không cho phép truy cập vào máy chủ được nhắm mục tiêu. Tôi cho rằng bạn bỏ qua proxy khi sử dụng Trình duyệt Chrome. Vì vậy, không có kiểm tra.

Có một số giải pháp cho vấn đề này. Nhưng tất cả đều ngụ ý rằng bạn tin tưởng nhà cung cấp gói.

Phương pháp khả thi:

  1. Như đã đề cập trong các câu trả lời khác, bạn có thể thực hiện một http://quyền truy cập có thể bỏ qua proxy của bạn. Điều đó hơi nguy hiểm, vì người đàn ông ở giữa có thể đưa phần mềm độc hại vào bản tải xuống của bạn.
  2. Đề wgetxuất bạn sử dụng một lá cờ --no-check-certificate. Điều này sẽ thêm một chỉ thị proxy vào yêu cầu của bạn. Proxy, nếu nó hiểu chỉ thị, sẽ không kiểm tra xem chứng chỉ máy chủ có được xác minh bởi một cơ quan có thẩm quyền và chuyển yêu cầu hay không. Có lẽ có một cấu hình với npm hoạt động giống như cờ wget.
  3. Bạn định cấu hình proxy của mình để chấp nhận CA npm. Tôi không biết proxy của bạn, vì vậy tôi không thể đưa ra gợi ý cho bạn.

0

đặt thuộc tính dưới đây:

"npm config set nghiêm ngặt-ssl false"


0

Nếu bạn có quyền kiểm soát máy chủ proxy hoặc có thể thuyết phục quản trị viên CNTT của mình, bạn có thể cố gắng loại trừ rõ ràng registry.npmjs.org khỏi kiểm tra SSL. Điều này sẽ tránh cho người dùng máy chủ proxy phải tắt tính năng kiểm tra ssl nghiêm ngặt hoặc cài đặt CA gốc mới.


-1

Đây là những gì bạn có thể làm để tránh npm và sử dụng sợi trong máy cửa sổ.

yarn config set "strict-ssl" false
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.