Windows'ta Npm çalıştırırken SSL sertifikası hatası nasıl düzeltilir?


88

Npm ile bir paket kurmaya çalıştığımda çalışmıyor. Uzun bir beklemeden sonra, sonunda bir 'tünelleme soketi kurulamadı, sutatusCode = 403' hatası alıyorum.

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

Ancak, web tarayıcımda (Google Chrome) aynı URL'ye göz attığımda sorunsuz yükleniyor (dipnota bakın). https://registry.npmjs.org/coffee-script

Ne yanlış gidiyor?


Bir https proxy kullansam da sorunun bu olmadığına eminim. Ortam değişkenini yapılandırdım https_proxy(npm kullanıcı kılavuzuna göre ). Ortam değişkeninin doğru olduğunu biliyorum çünkü Python paket yöneticisi piponu doğru şekilde takip ediyor.

Sorunun SSL sertifikalarıyla ilgili olduğuna inanıyorum, çünkü bu URL'yi ile indirirsem wgetsertifikalar hakkında açık bir hata alıyorum

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

Bunu nasıl düzeltebilirim? Güvenlikten ödün vermeden.


Kontrol Panelinin İnternet Seçeneklerinde 'npmCA' sertifikasını 'güvenilir kök sertifika yetkilisi' olarak yükleyene kadar web tarayıcımda da SSL sertifika hataları alıyordum (ekran görüntüsü görüntü açıklamasını buraya girin)


Düzenleme: https://npmjs.org/doc/config.html#strict-ssl başına güvenli olmayan bir çözüm denedim

npm set strict-ssl false

Yine de aynı hatayla zaman aşımına uğradı

$ 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

Bu, yaşadığım soruna benzer: stackoverflow.com/questions/11773509/…
nwinkler


1
"Npm seti sıkı-ssl false" çözüldü Girme bir sorun
MRD

Yanıtlar:


143

TL; DR - Sadece bunu çalıştırın ve güvenliğinizi devre dışı bırakmayın:

Mevcut sertifikaları değiştirin

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

# Check the 'cafile'
npm config get cafile

veya mevcut sertifikaları uzatın

Önceden tanımlanmış certs uzatmak için bu ortam değişkeni ayarlayın: NODE_EXTRA_CA_CERTShiç"<path to certificate file>"

Tüm hikaye

Windows altında kurumsal bir güvenlik duvarının arkasında npm, pip, maven vb. İle çalışmak zorunda kaldım - bu eğlenceli değil. Bu platformu mümkün olduğunca agnostik / farkında tutmaya çalışacağım.

HTTP_PROXY ve HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYproxy'nizin nerede olduğunu bilmek için birçok yazılım tarafından kullanılan ortam değişkenleridir. Windows altında, birçok yazılım, tamamen farklı bir şey olan, işletim sistemi tarafından belirtilen proxy'nizi de kullanır. Bu, Chrome'un (İnternet Seçeneklerinizde belirtilen proxy'yi kullanır) URL'ye bağlanmasında gayet iyi, ancak HTTPS_PROXY kullandıklarından (HTTP_PROXY - daha sonra bakın) npm, pip, maven vb. Normalde ortam değişkeni şunun gibi görünür:

http://proxy.example.com:3128

Ancak , vekilinize karşı kimliğinizin doğrulanmadığını gösteren bir 403 alıyorsunuz . Proxy üzerinde temel kimlik doğrulama ise, ortam değişkenini şu biçimde bir şeye ayarlamak isteyeceksiniz:

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

Korkunç NTLM

İsteğinizi reddeden hedef sunucu yerine proxy olduğunu söylemenin daha doğru yolu olan 407 HTTP durum kodu vardır (proxy kimlik doğrulaması gereklidir). Bu kod beni en uzun süre rahatsız etti, ta ki Google'da uzun süre kalana kadar, proxyimin NTLM kimlik doğrulaması kullandığını öğrendim . HTTP temel kimlik doğrulaması, kurumsal yöneticilerimin yüklediği proxy'yi karşılamak için yeterli değildi. Yerel makinemde (kimlik doğrulaması yapılmamış) Cntlm kullanmaya başvurdum , ardından yukarı akış proxy'si ile NTLM kimlik doğrulamasını işlemesini sağladım . Daha sonra NTLM yapamayan tüm programlara yerel makinemi proxy olarak kullanmalarını söylemek zorunda kaldım - ki bu genellikle ayarlamak kadar basit HTTP_PROXYve HTTPS_PROXY. Aksi takdirde, npm kullanımı için (@Agus'un önerdiği gibi):

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

"Virüsler nedeniyle tüm HTTPS trafiğinin şifresini çözmemiz gerekiyor"

Bu kurulum yaklaşık bir yıldır (beceriksizce) mırıldanmaya başladıktan sonra, şirketin üst düzey yöneticileri vekili değiştirmeye karar verdiler. Sadece bu da değil, artık NTLM kullanmayacak! Emin olmak için cesur yeni bir dünya. Ancak bu kötü amaçlı yazılım yazarları artık kötü amaçlı yazılımları HTTPS aracılığıyla teslim ettikleri için, biz zavallı masum kullanıcıları korumanın tek yolu ortadaki adamla her bağlantıyı daha bize ulaşmadan tehditleri taramaktı. Tahmin edebileceğiniz gibi, güvenlik duygusuyla aşılandım.

Uzun lafın kısası, kendinden imzalı sertifikanın aşağıdakilerden kaçınmak için npm'ye yüklenmesi gerekir SELF_SIGNED_CERT_IN_CHAIN:

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

Alternatif olarak, NODE_EXTRA_CA_CERTSortam değişkeni sertifika dosyasına ayarlanabilir.

Sanırım npm'nin bir proxy / güvenlik duvarı arkasında çalışması hakkında bildiğim her şey bu. Birisi onu faydalı bulsun.

Düzenleme : Bu sorun için HTTPS'yi bir HTTP kayıt defteri veya ayarı kullanarak kapatmak gerçekten yaygın bir öneridir NODE_TLS_REJECT_UNAUTHORIZED. Bunlar iyi fikirler değil çünkü kendinizi daha fazla ortadaki adam veya yeniden yönlendirme saldırılarına açıyorsunuz. Paket kurulumunu yapan makinede DNS kayıtlarınızın hızlı bir sahtekarlığı ve kendinizi her yerden paketlere güvenirken bulacaksınız. HTTPS'nin çalışmasını sağlamak çok iş gibi görünebilir, ancak şiddetle tavsiye edilir. Şirkete güvenilmeyen kodların girmesine izin vermekten sorumlu kişi olduğunuzda, nedenini anlayacaksınız.

Düzenleme 2 : Ayarın npm config set cafile <path>npm'nin mevcut olanları genişletmek yerine yalnızca o dosyada sağlanan sertifikaları kullanmasına neden olduğunu unutmayın .

Mevcut sertifikaları genişletmek istiyorsanız (örneğin bir şirket sertifikası ile) NODE_EXTRA_CA_CERTSdosyaya bağlanmak için ortam değişkenini kullanmak, gitmenin yoludur ve sizi çok fazla güçlükten kurtarabilir. Özel sertifika-otorite-ca-nodejs-ekleme-nasıl yapılır görün


9
Windows'ta, eğik çizgi kullanmak zorunda kaldım: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus

4
** Eşittir işaretsiz= npm config set cafile "<path to your certificate file>"
Moti Winkler

3
Bu harika bir yanıt - proxy + zscalar ile ilgili kendi baş ağrılarımı daha iyi özetleyemedim
Jpnh

7
"Tahmin edebileceğiniz gibi, ben güvenlik duygusuyla aşıldı" diye çok güldü. :)
Mario B

3
Sertifika dosyasını nasıl alırım?
Aditya

37

Bu sorun benim için deponun http sürümü kullanılarak düzeltildi:

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

54
Bu çok kötü bir çözüm!
KiT O

4
@HaBo Sanırım bunun güvensiz olduğunu kastediyor.
gabeio

3
@KiTO Bu kötü bir çözüm, kabul etti. Ama sadece bazı paketleri yüklemek istediğimde neden sertifika sorunları ile uğraşmak zorunda kalayım?
Ich

17
Bu cevap doğrudur. Başkalarının üstünde kendi sertifika zinciriyle kurumsal proxy karışıklığının arkasında olduğunuz bazı durumlar vardır ve bundan başka bir yol yoktur (sertifikaları devre dışı bırakmak dışında) (özellikle size yönetici hakları vermedikleri zaman). Bu, sistemden uygun ayarları düzgün şekilde yüklemeyen npm hatası gibi geliyor. Ancak çapraz uyumluluk uğruna, npm'yi düzeltmeyecekler, dolayısıyla bunun sonucu bu. Bunun kötü bir cevap olduğunu söyleyenler, neden bahsettiklerini bilmiyorlar.
kenorb

3
@kenorb bu yanlışsa, proxy'nizin attığı adımları izleyebilir ve bu kendinden imzalı sertifikaları cafile ile zincirinize ekleyebilirsiniz.
dardo

15
npm config set strict-ssl false

sorunu benim için çözdü. Bu durumda, hem acentem hem de yapay emanetçim, aws bulutu üzerinde özel bir alt ağın arkasında


Bu çözüm, bir güvenlik riski olan tüm kurulumlar için SSL'yi kapatacaktır. Npm kayıt defterini ayarlamak gerçek çözümdür npm config set registry registry.npmjs.org
Ali

7

Ben de aynı sorunu yaşıyorum, üstesinden geliyorum

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

Ek bilgi node-doc'ta


6

Birkaç gün önce bu benzer SSL sorunuyla karşılaştım. Sorun, npm'nizin https://registry.npmjs.org tarafından kullanılan sertifika için kök sertifika ayarlamamasıdır .

Çözümler:

  1. wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crtWget sorununu çözmek için kullanın
  2. npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtNpm programınız için kök sertifika ayarlamak için kullanın .

kök sertifikayı şuradan indirebilirsiniz: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Not: Farklı programlar, kök sertifikayı yönetmek için farklı yöntemler kullanabilir, bu nedenle tarayıcının diğerleriyle karıştırmayın.

Analiz:

senin düzeltelim wget https://registry.npmjs.org/coffee-scriptilk sorunu. pasajınız şöyle diyor:

        HATA: Registry.npmjs.org sertifikası doğrulanamıyor,
        / C = ABD / ST = CA / L = Oakland / O = npm / OU = npm tarafından verilir 
       Sertifika Yetkilisi/CN=npmCA/emailAddress=i@izs.me:
       Sertifikayı veren kuruluşun yetkisi yerel olarak doğrulanamıyor.

Bu, wget programınızın https://registry.npmjs.orgsertifikasını doğrulayamayacağı anlamına gelir . Bu soruna neden olabilecek iki neden vardır:

  1. Wget programınız bu etki alanının kök sertifikasına sahip değil. Kök sertifika genellikle sistemle birlikte gönderilir.
  2. Etki alanı, kök sertifikasını sertifikasına paketlemiyor.

Dolayısıyla çözüm, için açıkça kök sertifika ayarlanmıştır https://registry.npmjs.org. Bunun nedeninin sorun olduğundan emin olmak için openssl'yi kullanabiliriz.

openssl s_client -host registry.npmjs.org -port 443Komut satırını deneyin ve bu mesajı alacağız (ilk birkaç satır):

    BAĞLI (00000003)
    derinlik = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    doğrulama hatası: num = 20: yerel yayıncı sertifikası alınamıyor
    dönüşü doğrula: 0
    ---
    Sertifika zinciri
     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
    ---

Bu satır verify error:num=20:unable to get local issuer certificate, bunun https://registry.npmjs.orgkök sertifikayı paketlememesini sağlar. Yani biz Google DigiCert High Assurance EV Root CAkök Sertifikası.


Yalnızca metin temel dosyasını sağlayabiliyorsanız (Jenkins sürümleri gibi), bu sertifika pem'e dönüştürülebilir: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

Ben de aynı sorunu yaşıyordum. Biraz araştırma yaptıktan sonra, birçok yükleme sonrası / ön yükleme komut dosyasının çeşitli bağımlılıkları yüklemeye çalışacağını ve bazı zamanlarda belirli depoların kullanıldığını fark ettim. Daha iyi bir yol, benim için çalışan nodej'ler için https modülü için sertifika kontrolünü devre dışı bırakmaktır.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

Bu sorudan


2
Daha önce bahsedildiği gibi, bu olmaz düzeltmek SSL sorunu, sadece bunu geçecek. Bunu ele almanın uygun yolu, her paketi (git, npm, düğüm) doğru imzalama sertifikasına güvenecek şekilde yapılandırmaktır. Eğer bir şirket vekilinin arkasındaysanız, couurse.
Aaron C

0

Sorun vekilinizde yatıyor. Yükleme paketinizin konum sağlayıcısı kendi sertifikasını oluşturduğundan ve kabul edilen bir yetkiliden doğrulanmış bir sertifika satın almadığından, proxy'niz hedeflenen ana bilgisayara erişime izin vermez. Chrome Tarayıcıyı kullanırken proxy'yi atladığınızı varsayıyorum. Yani kontrol yok.

Bu sorunun bazı çözümleri var. Ancak hepsi paket sağlayıcısına güvendiğinizi ima ediyor.

Muhtemel çözümler:

  1. Diğer cevaplarda da belirtildiği gibi bir http:// , proxy'nizi atlayabilecek erişim sağlayabilirsiniz. Bu biraz tehlikeli, çünkü ortadaki adam indirmelerinize kötü amaçlı yazılım enjekte edebilir.
  2. wgetEğer bir bayrak kullanmak önerir --no-check-certificate. Bu, isteğinize bir proxy yönergesi ekleyecektir. Proxy, yönergeyi anlarsa, sunucu sertifikasının bir yetkili tarafından doğrulanıp doğrulanmadığını kontrol etmez ve isteği iletir. Belki npm ile wget bayrağıyla aynı şeyi yapan bir yapılandırma vardır.
  3. Proxy'nizi CA npm kabul edecek şekilde yapılandırırsınız. Vekilinizi bilmiyorum, bu yüzden size bir ipucu veremem.


0

Pencere makinesinde npm'yi önlemek ve ipliği kullanmak için yapabileceğiniz şey budur.

yarn config set "strict-ssl" false

0

Proxy sunucusu üzerinde kontrolünüz varsa veya BT yöneticilerinizi ikna edebiliyorsanız, kayıt defteri.npmjs.org'u SSL denetiminden açıkça hariç tutmayı deneyebilirsiniz. Bu, proxy sunucusu kullanıcılarının katı-ssl denetimini devre dışı bırakmasını veya yeni bir kök CA kurmasını önlemelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.