ProgramingTip

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

bestdevel 2020. 10. 18. 18:52
반응형

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


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

요약 -그냥 실행하고 보안을 시행하지 않습니다.

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

#Check the 'cafile'
npm config get cafile

전체 이야기

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가 작동하도록 만드는 것은 많은 작업처럼 보일 수 있지만 적극 권장됩니다. 신뢰할 수없는 코드를 회사에 허용 할 책임이있는 사람이라면 그 이유를 이해할 수있을 것입니다.


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

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

나는 같은 문제를 겪고 있습니다.

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

node-doc의 추가 정보


며칠 전에 이와 유사한 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루트 인증서를 구글 합니다.


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

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

이 질문에서


npm config set strict-ssl false

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


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

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

가능한 해결책:

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

참고 URL : https://stackoverflow.com/questions/13913941/how-to-fix-ssl-certificate-error-when-running-npm-on-windows

반응형