Windows에서 Npm을 실행할 때 SSL 인증서 오류를 수정하는 방법은 무엇입니까?


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)

그러나 웹 브라우저 (Google Chrome)에서 동일한 URL을 탐색하면 제대로로드됩니다 (각주 참조). https://registry.npmjs.org/coffee-script

무슨 일이야?


https 프록시를 사용하지만 이것이 문제가 아니라고 확신합니다. 환경 변수를 구성했습니다 https_proxy(npm 사용자 가이드에 따라 ). Python 패키지 관리자 pip가 올바르게 따르기 때문에 환경 변수가 정확하다는 것을 알고 있습니다 .

를 사용하여 해당 URL을 다운로드하면 인증서에 wget대한 명시적인 오류가 발생 하기 때문에 문제가 SSL 인증서와 관련이 있다고 생각합니다.

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

이 문제를 어떻게 해결할 수 있습니까? 보안을 손상시키지 않고.


제어판의 인터넷 옵션 (스크린 샷 여기에 이미지 설명 입력) 에서 '신뢰할 수있는 루트 인증 기관'으로 'npmCA'인증서를 설치할 때까지 웹 브라우저에서도 SSL 인증서 오류가 발생했습니다.


편집 : 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


"npm set strict-ssl false"를 입력하면 문제가 해결되었습니다
MrD

답변:


142

요약 -그냥 실행하고 보안을 비활성화하지 마십시오.

기존 인증서 교체

# 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>"

전체 이야기

Windows에서 회사 방화벽 뒤에서 npm, pip, maven 등으로 작업해야했습니다. 재미가 없습니다. 가능한 한이 플랫폼에 대해 독립적 / 인식을 유지하려고 노력할 것입니다.

HTTP_PROXY 및 HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXY는 프록시가 어디에 있는지 알기 위해 많은 소프트웨어에서 사용하는 환경 변수입니다. Windows에서 많은 소프트웨어는 완전히 다른 OS 지정 프록시를 사용합니다. 즉, 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_PROXYHTTPS_PROXY. 그렇지 않으면 npm 사용 (@Agus가 제안한대로) :

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

"바이러스 때문에 모든 HTTPS 트래픽을 해독해야합니다."

이 설정이 약 1 년 동안 (조잡하게) 흥얼 거리고 있던 후, 기업 지배자들은 프록시를 변경하기로 결정했습니다. 뿐만 아니라 더 이상 NTLM을 사용하지 않습니다! 확실한 신세계. 하지만 악성 소프트웨어 작성자는 이제 HTTPS를 통해 악성 코드를 전달하고 있었기 때문에 우리의 무고한 사용자를 보호 할 수있는 유일한 방법은 위협이 우리에게 도달하기 전에 검사하기 위해 모든 연결을 중간에 가로채는 것이 었습니다. 상상할 수 있듯이 나는 안전감에 압도되었습니다.

간단히 말해, 자체 서명 된 인증서를 npm에 설치하여 다음을 방지해야합니다 SELF_SIGNED_CERT_IN_CHAIN.

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

또는 NODE_EXTRA_CA_CERTS환경 변수를 인증서 파일로 설정할 수 있습니다.

npm이 프록시 / 방화벽 뒤에서 작동하도록하는 것에 대해 내가 아는 모든 것입니다. 누군가 유용하다고 생각하십시오.

편집 : HTTP 레지스트리 또는 설정을 사용하여이 문제에 대해 HTTPS를 해제하는 것은 정말 일반적인 제안 NODE_TLS_REJECT_UNAUTHORIZED입니다. 더 많은 중간자 또는 리디렉션 공격에 자신을 개방하고 있기 때문에 이는 좋은 아이디어가 아닙니다. 패키지 설치를 수행하는 컴퓨터에서 DNS 레코드를 빠르게 스푸핑하면 어디서나 패키지를 신뢰할 수 있습니다. HTTPS가 작동하도록 만드는 것은 많은 작업처럼 보일 수 있지만 적극 권장됩니다. 신뢰할 수없는 코드를 회사에 허용 할 책임이있는 사람이라면 그 이유를 이해할 수있을 것입니다.

편집 2 : 설정 npm config set cafile <path>하면 npm은 기존 인증서를 확장하는 대신 해당 파일에 제공된 인증서 만 사용합니다.

기존 인증서를 확장하려는 경우 (예 : 회사 인증서로) 환경 변수 NODE_EXTRA_CA_CERTS를 사용 하여 파일에 연결하는 것이 방법이며 많은 번거 로움을 줄일 수 있습니다. 사용자 정의 인증서 권한을 추가하는 방법 보기 ca-to-nodejs


9
"/dev/Firefox/mycert.cer C"NPM 설정 세트 cafile에서 : Windows에서, 나는 슬래시 사용했다
존 예수

4
** 등호 없음= npm config set cafile "<path to your certificate file>"
Moti Winkler 2016 년

3
이것은 대단한 응답입니다-프록시 + zscalar에 관한 내 두통을 더 잘 요약 할 수 없었습니다.
Jpnh

7
“상상할 수 있듯이 나는 안전감에 압도 당했다”는 이유로 너무나도 웃었다. :)
Mario B

3
인증서 파일은 어떻게 얻습니까?
Aditya

36

이 문제는 저장소의 http 버전을 사용하여 해결되었습니다.

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

52
그것은 매우 나쁜 해결책입니다!
KiT O

4
@HaBo 나는 그가 이것이 안전하지 않다는 것을 의미한다고 생각합니다.
gabeio 2014-04-14

3
@KiTO 그것은 나쁜 해결책입니다. 하지만 패키지를 설치하고 싶을 때 인증서 문제를 해결해야하는 이유는 무엇입니까?
Ich

17
정답입니다. 자신의 인증서 체인과 함께 회사 프록시가 엉망이 된 경우가 있으며 (인증서를 전혀 비활성화하는 것 외에) 다른 방법이 없습니다 (특히 관리자 권한을 제공하지 않는 경우). 이것은 시스템에서 적절한 설정을 제대로로드하지 않는 npm 버그처럼 들립니다. 그러나 상호 호환성을 위해 npm을 수정하지 않으므로 이것이 그 결과입니다. 나쁜 대답이라고 말하는 사람들은 그들이 무슨 말을하는지 전혀 모릅니다.
kenorb

3
@kenorb가 잘못되었습니다. 프록시가 수행하는 단계를 다시 추적하고 cafile을 사용하여 자체 서명 된 인증서를 체인에 추가 할 수 있습니다.
dardo

15
npm config set strict-ssl false

나를 위해 문제를 해결했습니다. 이 경우 내 에이전트와 아티팩트 보관소는 모두 AWS Cloud의 프라이빗 서브넷 뒤에 있습니다.


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.crtwget 문제 해결에 사용
  2. npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtnpm 프로그램에 대한 루트 인증서를 설정하는 데 사용 합니다.

다음에서 루트 인증서를 다운로드 할 수 있습니다. 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)
    depth = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    오류 확인 : num = 20 : 로컬 발급자 인증서를 가져올 수 없습니다.
    반환 확인 : 0
    ---
    인증서 체인
     0 s : / C = US / ST = 캘리포니아 / L = 샌프란시스코 / 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 루트 CA
    ---

이 줄 verify error:num=20:unable to get local issuer certificatehttps://registry.npmjs.org루트 인증서를 압축하지 않도록합니다. 그래서 우리는 DigiCert High Assurance EV Root CA루트 인증서를 구글 합니다.


텍스트 기본 파일 (예 : Jenkins 빌드) 만 제공 할 수있는 경우이 인증서를 pem으로 변환 할 수 있습니다. openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

나는 같은 문제가 있었다. 파헤쳐 본 후 많은 사후 / 사전 설치 스크립트가 다양한 종속성을 설치하려고 시도하고 때로는 특정 저장소가 사용된다는 것을 깨달았습니다. 더 나은 방법은 나를 위해 일한 nodejs의 https 모듈에 대한 인증서 검사를 비활성화하는 것입니다.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

이 질문에서


2
이미 언급했듯이 이것은 SSL 문제를 해결 하는 것이 아니라 통과를 통해서만 가능합니다. 이를 해결하는 적절한 방법은 적절한 서명 인증서를 신뢰하도록 각 패키지 (git, npm, node)를 적절하게 구성하는 것입니다. 당신이 couurse의 coporate 대리인 뒤에 있다면.
Aaron C

0

문제는 프록시에 있습니다. 설치 패키지의 위치 제공자가 자체 인증서를 만들고 승인 된 기관에서 확인 된 인증서를 구입하지 않기 때문에 프록시는 대상 호스트에 대한 액세스를 허용하지 않습니다. Chrome 브라우저를 사용할 때 프록시를 우회한다고 가정합니다. 그래서 검사가 없습니다.

이 문제에 대한 몇 가지 해결책이 있습니다. 그러나 모두 패키지 공급자를 신뢰한다는 것을 의미합니다.

가능한 해결책:

  1. 다른 답변에서 언급했듯이 http://프록시를 우회 할 수있는 액세스를 만들 수 있습니다 . 중간에있는 사람이 다운로드에 맬웨어를 주입 할 수 있기 때문에 약간 위험합니다.
  2. wget당신이 플래그를 사용하도록 제안합니다 --no-check-certificate. 그러면 요청에 프록시 지시문이 추가됩니다. 프록시는 지시문을 이해하면 서버 인증서가 기관에 의해 확인되었는지 확인하지 않고 요청을 전달합니다. wget 플래그와 동일한 작업을 수행하는 npm이있는 구성이있을 수 있습니다.
  3. CA npm을 허용하도록 프록시를 구성합니다. 당신의 대리인을 모르기 때문에 힌트를 드릴 수 없습니다.


0

프록시 서버를 제어 할 수 있거나 IT 관리자를 설득 할 수있는 경우 SSL 검사에서 registry.npmjs.org를 명시 적으로 제외 할 수 있습니다. 이렇게하면 프록시 서버 사용자가 strict-ssl 검사를 비활성화하거나 새 루트 CA를 설치하지 않아도됩니다.


-1

이것이 npm을 피하고 창 기계에서 실을 사용하기 위해 할 수있는 일입니다.

yarn config set "strict-ssl" false
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.