[node.js] 회사 프록시 .pac 뒤에 npm 사용

npm을 통해 여러 패키지를 다운로드해야하지만 회사 프록시 구성은 .pac 파일입니다 (Windows에 있습니다)

나는 이미 시도했다

npm config set proxy http://mydomain\username:password@1.2.3.4:8181/proxy.pac
npm config set https-proxy http://mydomain\username:password@1.2.3.4:8181/proxy.pac

또는

npm config set proxy http://1.2.3.4:8181/proxy.pac
npm config set https-proxy http://1.2.3.4:8181/proxy.pac

하지만 작동하지 않습니다 …

어떠한 제안? 감사



답변

방금 프록시 서버 뒤에서 npm을 사용할 수없는 매우 비슷한 문제가 있습니다.

내 사용자 이름은 “domain \ username”형식입니다. 프록시 구성에 슬래시를 포함하면 슬래시가 나타납니다. 그래서 이것을 입력하십시오 :

npm config set proxy "http://domain\username:password@servername:port/"

다음이 실행 npm config get proxy반환이 :
HTTP : // 도메인 / 사용자 이름 : 암호 @ 서버 이름 : 포트 /

따라서 문제를 해결하기 위해 대신 백 슬래시를 URL로 인코딩 했으므로 다음과 같이 입력하십시오.

npm config set proxy "http://domain%5Cusername:password@servername:port/"

그리고 이것으로 프록시 액세스가 수정되었습니다.


답변

의 URL을 찾아보십시오 pac인터넷 익스플로러 랜 설정에서 파일 및 구성 URL에서 PAC 파일을 다운로드합니다. pac 파일은 FindProxyForURL다른 시나리오에서 다른 프록시 호스트를 반환 하는 함수라는 이름의 Javascript 파일입니다 .

해당 pac 파일에서 일반적인 웹 트래픽에 대한 것으로 생각되는 호스트를 찾아서 .npmrc에 연결하십시오. C:\Users\<username>\.npmrc

proxy=http://<username>:<pass>@proxyhost:<port>
https-proxy=http://<uname>:<pass>@proxyhost:<port>

회사 컴퓨터에서 도메인 및 사용자 이름으로 로그인 할 수 있지만 프록시에는 사용자 활성 디렉토리 도메인 이름이 필요하지 않으며 사용자 이름 및 비밀번호 만있을 수 있습니다 (Active Directory 로그인과 다를 수 있음).

특별한 비밀번호 문자를 피하는 것을 잊지 마십시오.


답변

.pac파일을 다운로드하십시오 . 아무 편집기에서나 열고를 찾으십시오 PROXY = "PROXY X.X.X.X:80;. 많은 프록시가있을 수 있으며 프록시를 복사 한 후 다음 터미널 명령을 실행하십시오.

npm config set proxy http://X.X.X.X:80
npm config set https-proxy http://X.X.X.X:80

이제 모든 패키지를 설치할 수 있습니다!


답변

이 방법 으로이 문제를 해결했습니다.

1) 나는이 명령을 실행 :

npm config set strict-ssl false

2) 그런 다음 https 대신 http로 실행되도록 npm을 설정하십시오.

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

3) 그런 다음 패키지를 설치하십시오.

npm install <package name>


답변

@Steve Roberts의 답변을 확장하십시오.

내 사용자 이름은 “domain \ username”형식입니다. 프록시 구성에 슬래시를 포함하면 슬래시가 나타납니다. 그래서 이것을 입력하십시오 :

npm config set proxy "http://domain\username:password@servername:port/"

또한 URL을 인코딩해야했습니다. domain\user 문자열 해야했지만 사용자 이름 안에 공백이 있으므로 +공백 URL 인코딩을 인코딩하기 위해 두 번 인코딩 할 수 있지만 %2B(더하기 부호의 URL 인코딩이지만 URL은 공백 인코딩은%20 )이므로 대신 다음을 수행해야했습니다.

npm 명령

// option one 
// it works for some packages
npm config set http_proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser+name:password@x.x.x.x:port"

// option two
// it works best for me
// please notice that I actually used a space 
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://DOMAIN%5Cuser name:password@x.x.x.x:port"
npm config set proxy "http://DOMAIN%5Cuser name:password@x.x.x.x:port"

// option two (B) as of 2019-06-01
// no DOMAIN
// instead of URL encode it with '+', '%20 ' OR %2B (plus url encoded)
npm config set http_proxy "http://user name:password@x.x.x.x:port"
npm config set proxy "http://user name:password@x.x.x.x:port"

npm 구성 문제 해결

나는 npm config list위에서 설정 한 파싱 된 값을 얻기 위해를 , 이것이 이중 인코딩에 대해 알아 낸 방법입니다. 기묘한.

기본적으로 다음 요구 사항을 파악해야합니다.

  1. 입니다 DOMAIN 문자열은 인증에 필요한
  2. 특수 문자를 인코딩해야합니까?
    • 공백과 at (@) 표시는 특별히 까다 롭습니다.

문안 인사.

WINDOWS 환경 변수 (CMD 프롬프트)

최신 정보

위의 구성으로도 요청- 내부적으로 단순화 된 HTTP 클라이언트 를 사용 하여 물건을 다운로드 하는 일부 패키지 / 스크립트에 여전히 문제가 있음이 밝혀 졌습니다. 위의 추가 정보에서 설명한 것처럼 환경 변수를 지정할 수 있습니다. 명령 행에서 프록시를 설정하기 위해 를 있으며 요청은 해당 값을 준수합니다.

그런 다음 환경 변수를 설정하려고 여러 번 시도한 후 (그리고인정하기를 꺼려합니다) 마침내 다음 지침에 따라 성공했습니다.

rem notice that the value after the = has no quotations
rem    - I believe that if quotations are placed after it, they become
rem    part of the value, you do not want that
rem notice that there is no space before or after the = sign
rem     - if you leave a space before it, you will be declaring a variable
rem     name that includes such space, you do not want to do that
rem     - if you leave a space after it, you will be including the space
rem     as part of the value, you do not want that either
rem looks like there is no need to URL encode stuff in there
SET HTTP_PROXY=http://DOMAIN\user name:password@x.x.x.x:port
SET HTTPS_PROXY=http://DOMAIN\user name:password@x.x.x.x:port

cntlm

프록시 설정이 필요한 모든 도구에서 비밀번호를 업데이트하는 오버 헤드를 인식 할 때까지 위의 기술을 몇 주 동안 사용했습니다.

npm 외에도 다음을 사용합니다.

  • 나무 그늘
  • 방랑자
    • 가상 상자 (리눅스 실행)
    • apt-get [linux]
  • 자식
  • vscode
  • 괄호
  • 원자
  • tsd

cntlm 설정 단계

그래서 cntlm을 설치 했습니다 . 설정 cntlm은 꽤 앞으로 진행됩니다 .Ini 파일 @C:\Program Files\Cntlm\cntlm.ini

  1. 개방 C:\Program Files\Cntlm\cntlm.ini(관리자 권한이 필요할 수 있음)
  2. 대한 모양 UsernameDomain선 (라인 8-9 나는 생각한다)
    • 사용자 이름을 추가하십시오
    • 도메인을 추가하십시오
  3. cmd 프롬프트에서 다음을 실행하십시오.

    cd C:\Program Files\Cntlm\
    cntlm -M
    cntlm -H  
    • 비밀번호를 묻는 메시지가 나타납니다.
     cygwin warning:
       MS-DOS style path detected: C:\Program Files\Cntlm\cntlm.ini
       Preferred POSIX equivalent is: /Cntlm/cntlm.ini
       CYGWIN environment variable option "nodosfilewarning" turns off this warning.
       Consult the user's guide for more details about POSIX paths:
         http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
     Password:
  4. 당신이 얻는 결과 cntlm -H는 다음과 같습니다.

    PassLM          561DF6AF15D5A5ADG
    PassNT          A1D651A5F15DFA5AD
    PassNTLMv2      A1D65F1A65D1ASD51  # Only for user 'user name', domain 'DOMAIN'
    • 당신이 PassNTLMv2이 때문에 추가 사용하는 것이 시스템 권장되어 #줄 앞에 PassLMPassNT하거나 사용하지 않는
  5. , 및 cntlm -H의 행을 바꾸어 ini 파일 의 출력을 붙여 넣거나 원래 행을 주석 처리하고 추가하십시오.PassLMPassNTPassNTMLv2
  6. Proxy서버를 추가하십시오 . 프록시 서버가 무엇인지 모르는 경우 … 수행 한 작업을 수행하십시오 . 에서 AutoConfigURL레지스트리 키를 찾아서 프록시 자동 구성 파일을 찾으십시오 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings. 해당 URL로 이동하여 JavaScript 인 코드를 살펴보십시오.
  7. 선택적으로 Listen ####회선 ####번호 를 변경하여 cntlm이 청취하는 포트를 변경할 수 있습니다 .

cntlm으로 NPM 설정

따라서 npm을 cntml 프록시로 지정하면 ip, 내가 사용한 localhostcntlm의 기본 포트를 사용할 수 3128있으므로 프록시 URL은 다음과 같습니다.

http://localhost:3128

적절한 명령으로 :

npm 구성 세트 프록시 http : // localhost : 3128

훨씬 간단합니다. 모든 URL을 동일한 URL로 설정하고 한 곳에서만 비밀번호를 업데이트합니다. 인생은 훨씬 간단하지 않습니다.

npm CA 인증서를 설정해야 함

npm 문서 캘리포니아에서

회사 프록시가 자체 자체 서명 된 인증서로 https 연결을 가로채는 경우이를 피해야합니다. npm config set strict-ssl false (아니요)

기본 단계

  1. 브라우저에서 인증서를 받으십시오 (Chromes가 잘 작동 함). Base-64로 인코딩 된 X.509 (.CER) 로 내보내기
  2. 줄 바꾸기를 \n
  3. .npmrc라인 추가 편집ca[]="-----BEGIN CERTIFICATE-----\nXXXX\nXXXX\n-----END CERTIFICATE-----"

이슈

때때로 npm 종류의 중단이 발생 했으므로 cntlm을 중지 하고 다시 시작합니다.


답변

나는 이것과 관련하여 몇 가지 문제를 겪었고 마침내 내가 한 일은 다음과 같습니다.

  1. “자동 인증”이 선택된 Fiddler 사용
  2. 피들러 커스텀 규칙에서

    if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";}
  3. 마지막으로 npm에서 프록시를 http : // localhost : 8888로 설정했습니다.

이것은 잘 작동했습니다.


답변

회사 방화벽으로 어려움을 겪고있는 사람과 SSL 문제 (로컬 발급자 인증서를 얻을 수 없음)와 관련하여 다음과 같은 몇 가지 단계를 수행 할 수 있습니다.

SSL 잊어 버려

SSL이 염려되지 않으면 프록시를 설정하고 레지스트리를 비보안 버전으로 변경하여 이전의 많은 컨트 리뷰 터의 조언을 따를 수 있습니다.

npm config set proxy http://username:password@proxyname:port
npm config set https-proxy http://username:password@proxyname:port
npm config set registry http://registry.npmjs.org/

여기서 빠른 “gotcha”, 프록시 자격 증명은 보안 및 보안되지 않은 요청에 대해 동일합니다 ( https-proxy 구성 의 경우 프로토콜을 http : // 로 유지 한 방법에 주목 ). 이것은 당신에게 동일 할 수도 있고 그렇지 않을 수도 있습니다.

SSL을 유지하고 싶습니다

SSL을 유지하고을 사용하지 않으려면 strict-ssl=false더 많은 작업이 필요합니다. 나를 위해 회사 방화벽을 사용하고 자체 서명 된 인증서를 사용하고 있으므로 오류가 발생 unable to get local issuer certificate합니다. 나와 같은 보트에 있다면 cafile=npm 구성 파일에서 옵션 을 설정해야 합니다. 먼저 자체 서명 된 인증서에 대한 정보를 보유한 PEM 파일을 작성해야합니다. 방법을 모르는 경우 타사 소프트웨어를 사용하지 않는 Windows 환경에 대한 지침은 다음과 같습니다.

자체 서명 인증서를 사용하고 있으므로 어떤 인증서를 신뢰해야하는지 명시 적으로 표시해야합니다. 예를 들어 Chrome을 사용하여 www.google.com으로 이동하여 인증서를 얻을 수있었습니다.

Chrome에서 검사-> 보안-> 인증서보기로 이동하십시오. SSL 연결을 허용하는 모든 인증서가 표시됩니다. 이러한 인증서가 자체 서명 된 방식을 확인하십시오. 희미한 부분은 내 회사이며 인증 기관이 아닙니다. 전체 인증서 경로를 P7B 파일로 내보내거나 인증서를 CER 파일 (base64 인코딩)로 개별적으로 내보낼 수 있습니다. 전체 경로를 P7B로 내보내는 것은 인증서 관리자에서이 파일을 열고 개별 CER 파일로 내 보내야하기 때문에 크게 도움이되지 않습니다. Windows에서 P7B 파일을 두 번 클릭하면 Certificate Manager 응용 프로그램이 열립니다.

여기에 이미지 설명을 입력하십시오

CER (Base 64)로 내보내기는 실제로 다음 형식의 텍스트 파일입니다.

-----BEGIN CERTIFICATE-----
MIIGqzCCBZOgAwIBAgITIwAAABWhFPjwukYhTAADAAAAFTANBgkqhkiG9w0BAQUF
ADBFMRMwEQYKCZImiZPyLGQBGRYDY29tMRYwFAYKCZImiZPyLGQBGRYGaXJ2aW5n
b0pvCkNmjWzaNNUg2hYET+pP5nP75aRu+kPRl9UnlQ....rest of certificate...
-----END CERTIFICATE-----

PEM 파일을 만들려면 이러한 인증서를 서로의 단일 파일로 쌓고 확장자를 .pem으로 변경하면됩니다. 메모장을 사용 하여이 작업을 수행했습니다.

인증서 경로에서 인증서를 역순으로 쌓습니다. 위의 * .google.com으로 시작한 다음 Websense를 그 아래에 붙여 넣은 다음 CA 1 발행 등을 수행합니다. 이렇게하면 인증서가 위에서 아래로 구문 분석되어 적절한 루트 CA를 검색합니다. 루트 CA를 포함하는 것만으로는 작동하지 않지만 모든 인증서를 포함 할 필요는 없습니다. 위의 경로에서 Websense 인증서 (CA 1, 정책 CA, 루트 CA) 앞에 오는 인증서 만 포함하면됩니다.

이러한 자체 서명 된 인증서가 PEM 파일에 저장되면 npm에 이러한 인증서를 신뢰할 수있는 CA로 사용하도록 지시 할 준비가되었습니다. 구성 파일을 설정하기 만하면됩니다.

npm config set cafile "C:\yourcerts.pem"

이제 프록시 (http 및 https)를 설정하고 레지스트리를로 설정 https://registry.npmjs.org하면 strict-ssl설정 을 방해하지 않고 자체 서명 된 인증서를 사용하여 회사 방화벽 뒤에 패키지를 설치할 수 있습니다 .