Bagaimana cara memperbaiki kesalahan sertifikat SSL saat menjalankan Npm di Windows?

88

Ketika saya mencoba menginstal paket dengan npm, itu tidak berhasil. Setelah menunggu lama, saya akhirnya mendapatkan error 'tunneling socket tidak dapat dibuat, 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)

Namun, ketika saya menjelajah ke URL yang sama di browser web saya (Google Chrome) itu memuat dengan baik (lihat catatan kaki). https://registry.npmjs.org/coffee-script

Apa yang salah?


Meskipun saya menggunakan proxy https, saya yakin ini bukan masalahnya. Saya telah mengkonfigurasi variabel lingkungan https_proxy(sesuai panduan pengguna npm ). Saya tahu variabel lingkungan benar, karena pengelola paket Python pipmengikutinya dengan benar.

Saya yakin masalahnya terkait dengan sertifikat SSL, karena jika saya mengunduh URL itu dengan wget, saya mendapatkan kesalahan eksplisit tentang sertifikat

$ 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/[email protected]':
  Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

Bagaimana cara memperbaikinya? Tanpa mengorbankan keamanan.


Saya biasanya mendapatkan kesalahan sertifikat SSL di browser web saya juga, sampai saya menginstal sertifikat 'npmCA' sebagai 'otoritas sertifikasi akar tepercaya' di Opsi Internet Panel Kontrol (tangkapan layar masukkan deskripsi gambar di sini)


Sunting: Saya mencoba solusi yang tidak aman per https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

Namun masih ada waktu dengan kesalahan yang sama

$ 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
Kolonel Panik
sumber
Ini mirip dengan masalah yang saya alami: stackoverflow.com/questions/11773509/…
nwinkler
1
Hai. Lihat juga github.com/isaacs/npm/issues/2728
Kolonel Panic
1
Memasukkan "npm set strict-ssl false" memecahkan masalah
MrD

Jawaban:

143

TL; DR - Jalankan saja ini dan jangan nonaktifkan keamanan Anda:

Ganti sertifikat yang ada

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

# Check the 'cafile'
npm config get cafile

atau perpanjang sertifikat yang ada

Setel variabel lingkungan ini untuk memperluas sertifikat yang ditentukan sebelumnya: NODE_EXTRA_CA_CERTSmenjadi"<path to certificate file>"

Cerita lengkap

Saya harus bekerja dengan npm, pip, maven dll. Di belakang firewall perusahaan di bawah Windows - ini tidak menyenangkan. Saya akan mencoba dan menjaga platform ini agar tetap agnostik / waspada jika memungkinkan.

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYadalah variabel lingkungan yang digunakan oleh banyak perangkat lunak untuk mengetahui di mana proxy Anda. Di bawah Windows, banyak perangkat lunak juga menggunakan proxy yang ditentukan OS Anda yang merupakan hal yang sama sekali berbeda. Itu berarti Anda dapat membuat Chrome (yang menggunakan proxy yang ditentukan dalam Opsi Internet Anda) menyambungkan ke URL dengan baik, tetapi npm, pip, maven dll. Tidak berfungsi karena mereka menggunakan HTTPS_PROXY (kecuali jika mereka menggunakan HTTP_PROXY - lihat nanti). Biasanya variabel lingkungan akan terlihat seperti ini:

http://proxy.example.com:3128

Tetapi Anda mendapatkan 403 yang menunjukkan bahwa Anda tidak diautentikasi terhadap proxy Anda. Jika ini adalah otentikasi dasar pada proxy, Anda akan ingin menyetel variabel lingkungan ke sesuatu dalam bentuk:

http://user:[email protected]:3128

NTLM yang ditakuti

Ada kode status HTTP 407 (diperlukan autentikasi proxy), yang merupakan cara yang lebih tepat untuk mengatakan bahwa itu adalah proxy daripada server tujuan yang menolak permintaan Anda. Kode itu mengganggu saya untuk waktu yang lama sampai setelah banyak waktu di Google, saya mengetahui proxy saya menggunakan otentikasi NTLM . Otentikasi dasar HTTP tidak cukup untuk memenuhi proxy apa pun yang dipasang oleh tuan perusahaan saya. Saya terpaksa menggunakan Cntlm di mesin lokal saya (tidak diautentikasi), lalu menangani otentikasi NTLM dengan proxy upstream. Kemudian saya harus memberi tahu semua program yang tidak dapat melakukan NTLM untuk menggunakan mesin lokal saya sebagai proxy - yang umumnya sesederhana pengaturan HTTP_PROXYdan HTTPS_PROXY. Jika tidak, untuk penggunaan npm (seperti yang disarankan @Agus):

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

"Kami perlu mendekripsi semua lalu lintas HTTPS karena virus"

Setelah pengaturan ini bersenandung (kikuk) selama sekitar satu tahun, tuan perusahaan memutuskan untuk mengubah proxy. Tidak hanya itu, tetapi tidak lagi menggunakan NTLM! Dunia baru yang berani pasti. Tetapi karena para penulis perangkat lunak berbahaya itu sekarang mengirimkan malware melalui HTTPS, satu-satunya cara mereka dapat melindungi kami, pengguna yang tidak bersalah dan malang, adalah dengan mengarahkan setiap koneksi untuk memindai ancaman bahkan sebelum mereka mencapai kami. Seperti yang bisa Anda bayangkan, saya diliputi perasaan aman.

Singkat cerita, sertifikat yang ditandatangani sendiri perlu dipasang ke npm untuk menghindari SELF_SIGNED_CERT_IN_CHAIN:

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

Atau, file NODE_EXTRA_CA_CERTS variabel lingkungan dapat disetel ke file sertifikat.

Saya pikir itu semua yang saya tahu tentang mendapatkan npm untuk bekerja di belakang proxy / firewall. Semoga seseorang merasa berguna.

Sunting : Ini adalah saran yang sangat umum untuk mematikan HTTPS untuk masalah ini baik dengan menggunakan registri atau pengaturan HTTP NODE_TLS_REJECT_UNAUTHORIZED. Ini bukan ide yang bagus karena Anda membuka diri terhadap serangan man-in-the-middle atau pengalihan lebih lanjut. Sebuah spoof cepat dari catatan DNS Anda di mesin yang melakukan instalasi paket dan Anda akan mempercayai paket dari mana saja. Mungkin terlihat banyak pekerjaan untuk membuat HTTPS berfungsi, tetapi ini sangat disarankan. Jika Anda adalah orang yang bertanggung jawab untuk mengizinkan kode tidak tepercaya masuk ke perusahaan, Anda akan mengerti alasannya.

Edit 2 : Ingatlah pengaturan itunpm config set cafile <path> menyebabkan npm hanya menggunakan sertifikat yang disediakan dalam file itu, alih-alih memperluas yang sudah ada dengannya.

Jika Anda ingin memperluas sertifikat yang ada (misalnya dengan sertifikat perusahaan) menggunakan variabel lingkungan NODE_EXTRA_CA_CERTSuntuk ditautkan ke file adalah cara yang harus dilakukan dan dapat menghemat banyak kerumitan. Lihat cara-menambahkan-custom-certificate-authority-ca-to-nodejs

Alex Taylor
sumber
9
Di Windows, saya harus menggunakan garis miring: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus
4
** Tanpa tanda yang sama= npm config set cafile "<path to your certificate file>"
Moti Winkler
3
Ini adalah tanggapan yang luar biasa - Saya tidak bisa meringkas sakit kepala saya sendiri lebih baik tentang proxy + zscalar
Jpnh
7
tertawa terbahak-bahak karena "Seperti yang bisa Anda bayangkan, saya diliputi perasaan aman." :)
Mario B
3
Bagaimana cara mendapatkan file sertifikat?
Aditya
37

Masalah ini telah diperbaiki untuk saya dengan menggunakan repositori versi http:

npm config set registry http://registry.npmjs.org/
Ehsan
sumber
54
Itu solusi yang sangat buruk!
KiT O
4
@HaBo Saya kira maksudnya ini tidak aman.
gabeio
3
@KiItu solusi yang buruk, setuju. Tetapi mengapa saya harus mengacaukan masalah sertifikat ketika saya hanya ingin menginstal beberapa paket?
Ich
17
Jawaban ini benar. Ada beberapa kasus ketika Anda berada di belakang kekacauan proxy perusahaan dengan rantai sertifikat sendiri di atas yang lain dan tidak ada cara lain (selain menonaktifkan sertifikat sama sekali) selain ini (terutama ketika mereka tidak memberi Anda hak admin). Ini terdengar seperti bug npm yang tidak memuat pengaturan yang benar dari sistem. Tetapi demi kompatibilitas silang, mereka tidak akan memperbaiki npm, jadi ini adalah hasil dari itu. Orang yang mengatakan itu jawaban yang buruk, mereka tidak tahu apa yang mereka bicarakan.
kenorb
3
@kenorb itu salah, Anda dapat menelusuri kembali langkah-langkah yang diambil proxy Anda dan menambahkan sertifikat yang ditandatangani sendiri itu ke rantai Anda dengan cafile.
dardo
15
npm config set strict-ssl false

memecahkan masalah untuk saya. Dalam hal ini agen dan penyimpanan artefak saya berada di belakang subnet pribadi di cloud aws

Anupam Mahapatra
sumber
Solusi ini akan menonaktifkan ssl untuk semua penginstalan yang merupakan risiko keamanan. Mengatur registri npm adalah solusi sebenarnya npm config set registry registry.npmjs.org
Ali
7

Saya mengalami masalah yang sama, saya mengatasi penggunaan

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

Info tambahan di node-doc

Agus
sumber
6

Saya kebetulan mengalami masalah SSL serupa ini beberapa hari yang lalu. Masalahnya adalah npm Anda tidak menyetel sertifikat root untuk sertifikat yang digunakan oleh https://registry.npmjs.org .

Solusi:

  1. Menggunakan wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt untuk memperbaiki masalah wget
  2. Gunakan npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtuntuk menyetel sertifikat root untuk program npm Anda.

Anda dapat mengunduh sertifikat root dari: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Memperhatikan: Program yang berbeda mungkin menggunakan cara berbeda dalam mengelola sertifikat root, jadi jangan gabungkan browser dengan yang lain.

Analisis:

mari kita perbaiki wget https://registry.npmjs.org/coffee-scriptmasalahmu dulu. cuplikan Anda mengatakan:

        EROR: tidak dapat memverifikasi sertifikat registry.npmjs.org,
        dikeluarkan oleh / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       Otoritas Sertifikat/CN=npmCA/[email protected]:
       Tidak dapat memverifikasi otoritas penerbit secara lokal.

Ini berarti program wget Anda tidak dapat memverifikasi https://registry.npmjs.orgsertifikat. Ada dua alasan yang dapat menyebabkan masalah ini:

  1. Program wget Anda tidak memiliki sertifikat root domain ini. Sertifikat root biasanya dikirimkan bersama sistem.
  2. Domain tidak mengemas sertifikat root ke dalam sertifikatnya.

Jadi solusinya secara eksplisit menetapkan sertifikat root untuk https://registry.npmjs.org. Kita dapat menggunakan openssl untuk memastikan bahwa alasan di bawah ini adalah masalahnya.

Coba openssl s_client -host registry.npmjs.org -port 443pada baris perintah dan kita akan mendapatkan pesan ini (beberapa baris pertama):

    TERHUBUNG (00000003)
    kedalaman = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    verifikasi kesalahan: num = 20: tidak bisa mendapatkan sertifikat penerbit lokal
    verifikasi kembali: 0
    ---
    Rantai sertifikat
     0 detik: / C = AS / 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 dtk: / 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
    ---

Baris ini verify error:num=20:unable to get local issuer certificatememastikan bahwa https://registry.npmjs.orgtidak mengemas sertifikat root. Jadi kami Google DigiCert High Assurance EV Root CAroot Certificate.

tidak ada0day
sumber
Jika Anda hanya dapat menyediakan file basis teks (seperti untuk build Jenkins), sertifikat ini dapat diubah menjadi pem: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas
4

Saya mengalami masalah yang sama. Setelah beberapa penggalian, saya menyadari bahwa banyak skrip pasca / pra-instal akan mencoba menginstal berbagai dependensi dan beberapa kali repositori tertentu digunakan. Cara yang lebih baik adalah menonaktifkan pemeriksaan sertifikat untuk modul https untuk nodejs yang berfungsi untuk saya.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

Dari pertanyaan ini

haroon
sumber
2
Seperti yang sudah disebutkan, ini tidak akan memperbaiki masalah SSL, ini hanya akan melewatkannya. Cara yang tepat untuk mengatasinya adalah dengan mengkonfigurasi setiap paket (git, npm, node) dengan benar untuk mempercayai sertifikat penandatanganan yang tepat. Jika Anda berada di belakang proxy perusahaan, dari couurse.
Aaron C
0

Masalahnya terletak pada proxy Anda. Karena penyedia lokasi paket pemasangan Anda membuat sertifikatnya sendiri dan tidak membeli sertifikat terverifikasi dari otoritas yang diterima, proxy Anda tidak mengizinkan akses ke host yang ditargetkan. Saya berasumsi bahwa Anda melewati proxy saat menggunakan Browser Chrome. Jadi tidak ada pengecekan.

Ada beberapa solusi untuk masalah ini. Tetapi semua menyiratkan bahwa Anda mempercayai penyedia paket.

Solusi yang memungkinkan:

  1. Seperti yang disebutkan dalam jawaban lain, Anda dapat membuat http://akses yang mungkin melewati proxy Anda. Itu agak berbahaya, karena orang di tengah dapat menyuntikkan malware ke unduhan Anda.
  2. Itu wgetmenyarankan Anda untuk menggunakan sebuah bendera --no-check-certificate. Ini akan menambahkan arahan proxy ke permintaan Anda. Proksi, jika memahami arahan, tidak memeriksa apakah sertifikat server diverifikasi oleh otoritas dan meneruskan permintaan. Mungkin ada konfigurasi dengan npm yang melakukan hal yang sama dengan flag wget.
  3. Anda mengkonfigurasi proxy Anda untuk menerima CA npm. Saya tidak tahu proxy Anda, jadi saya tidak bisa memberi Anda petunjuk.
Peter Paul Kiefer
sumber
0

setel properti di bawah ini:

"npm config set strict-ssl false"

Rohit Maurya
sumber
0

Inilah yang dapat Anda lakukan untuk menghindari npm dan menggunakan mesin benang di jendela.

yarn config set "strict-ssl" false
Ram Kumar Thapa
sumber
0

Jika Anda memiliki kendali atas server proxy atau dapat meyakinkan admin TI Anda, Anda dapat mencoba mengecualikan registry.npmjs.org secara eksplisit dari pemeriksaan SSL. Ini akan menghindari pengguna server proxy dari keharusan menonaktifkan pemeriksaan strict-ssl atau menginstal CA root baru.

pencuri
sumber