Використання npm за корпоративним проксі .pac


158

Мені потрібно завантажити декілька пакетів через 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

але це не працює ...

будь-яка пропозиція? Дякую



8
Я не думаю, що це питання є дублікатом, сценарії Pac можуть містити декілька проксі-адрес залежно від цільової ip / хост-адреси, в той час як dube адресує лише 1 проксі-адресу - З огляду
Ferrybig

1
Не одна відповідь вказує, як використовувати сценарії Pac, які можуть містити кілька проксі-адрес залежно від цільової ip / хост-адреси. Будь-хто може допомогти, будь ласка.
Partha Sarathi Ghosh

2
Для мене це допомогло відкрити proxy.pacфайл, щоб отримати проксі-адресу від нього. (У моєму випадку мені просто довелося переключити порт на 8080).
кочівник

@ParthaSarathiGhosh Ви маєте рацію, жодна з відповідей насправді не пояснила, як використовувати сценарії PAC, тому я додав ще одну відповідь, яка стосується цього: stackoverflow.com/a/61811444 . Пізно на кілька років, але краще пізно, ніж ніколи?
користувач1031921

Відповіді:


204

У мене щойно була дуже схожа проблема, коли я не міг змусити npm працювати за нашим проксі-сервером.

Моє ім'я користувача має форму "домен \ ім'я користувача" - включаючи косу рису в конфігурації проксі, це призвело до появи косої риски вперед. Тож вступаючи до цього:

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

після запуску цього npm config get proxyповертає це: http: // домен / ім'я користувача: пароль @ ім'я сервера: port /

Тому, щоб вирішити проблему, я замість URL-кодування кодував зворотний проріз, тому ввів це:

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

і з цим було зафіксовано доступ до проксі.


5
через те, що ти не вистачає% 5C .key частина C .... дивись, я розставив це для тебе
sinisterrook

1
Я просто оновив деякі речі, і мій проксі знову перестав працювати. Виявилося, що в налаштуваннях "проксі" файлу .npmrc (як згадував нижче @Ovidiu Buligan) він містив% 5C для зворотної косої риси, але "https-proxy" просто містив "\". Змінивши це також на% 5C виправили проблему. Я припускаю, що це також можна оновити, запустивши npm config set http_proxy " домен% 5Cusername: пароль @ ім'я сервера: порт /"
Стів Робертс

1
Я намагаюся налаштувати npm за проксі, але є спосіб зробити "пінг" за допомогою npm-конфігурації. Тому що, якщо моя конфіденція помиляється, мій користувач буде заблокований у моєму корпоративному домені.
Рікардо

3
Що для мене спрацювало, це спочатку ОБРОБИТИ прокляті змінні середовища. Використовуйте набір HTTP_PROXY = і встановіть HTTPS_PROXY =
Sydwell,

4
Додавання strict-ssl=falseдо .npmrcконфігураційного файла, вирішеного для мене за корпоративним проксі - див. Відповіді від @ ovidiu-buligan та @ karthikeyan-a
Олександр Макфарлайн

64

Шукайте URL-адресу pacфайлу в налаштуваннях інтернет-провідника і скачайте файл pac з налаштованої URL-адреси. Файл pac - це лише файл javascript з функцією, FindProxyForURLяка називається, що повертає різні хости-проксі в різних сценаріях.

Спробуйте знайти хост у файлі Pac, який, на вашу думку, є загальним веб-трафіком, і підключіть його до .npmrc C:\Users\<username>\.npmrc

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

Незважаючи на те, що ви можете увійти зі своїм доменом та іменем користувача на своїй корпоративній машині, цілком можливо, що доменне ім’я активного каталогу користувача не потрібно для проксі , а лише ім'я користувача та пароль (які можуть відрізнятися від вашого входу в Active Directory)

Не забудьте познайомитися з уникнутими спеціальними символами пароля.


Дякую. я перейшов до .npmrc та змінив налаштування. це спрацювало
arn-arn

54

Завантажте свій .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
Для частини https-proxy я повинен був зробити "... встановити https-proxy = http: // ..." замість "... встановити https-proxy http: // ..." для цього робота. Тільки мої $ 02.
Нік

Завдяки налаштуванню https-proxy на http: // це єдине, що працювало; після того, як я скидаю змінні середовища http_proxy та https_proxy з bash!
Алекс Пуннен

Для https-proxy я не зміг встановити "set https-proxy https: /.../", мені довелося встановити "set https-proxy http: // ..." (інформація про проксі від https -> http)
Марс

те ж саме стосується і git,git config --global http.proxy http://X.X.X.X:80 git config --global https.proxy http://X.X.X.X:80
Кодове ім'я Джек

38

Я вирішив цю проблему таким чином:

1) Я виконую цю команду:

npm config set strict-ssl false

2) Потім встановіть npm для запуску з http, а не https:

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

3) Потім встановіть свій пакет

npm install <package name>


2
Тільки для того, щоб зазначити, що встановлення npm- строгого ssl на false не є проблемою безпеки. Подумайте натомість правильно налаштувати ca[]властивість у npm.
Аарон С

26

Щоб розгорнути відповідь на @Steve Roberts

Моє ім'я користувача має форму "домен \ ім'я користувача" - включаючи косу рису в конфігурації проксі, це призвело до появи косої риски вперед. Тож вступаючи до цього:

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

Я також повинен був кодувати URL-адресу моєї domain\userрядка, проте у мене є простір всередині мого імені користувача, тому я ставлю a +для кодування просторової 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 config

Я використовував значення npm config listдля отримання проаналізованих значень, які я встановив вище, і саме так я дізнався про подвійне кодування. Дивно.

По суті, ви повинні визначити такі вимоги:

  1. Це DOMAINрядок, необхідний для автентифікації
  2. Чи потрібно кодувати спеціальні символи?
    • Пробіли та знаки (@) є особливо складними

З повагою

ВІННІ ПРОМЕНЛЕННЯ ЕКОЛОГІЇ (підказка CMD)

Оновлення

Виявляється, що навіть із вищезазначеними конфігураціями, у мене все ще виникали проблеми з деякими пакетами / сценаріями, які використовують Запит - спрощений клієнт HTTP для завантаження матеріалів. Отже, як пояснено вище readme, ми можемо вказати змінні середовища для встановлення проксі-сервера в командному рядку, а Request буде виконувати ці значення.

Потім, після (і я неохоче визнаю це) кілька спроб (більше, як днів), намагаючись встановити змінні середовища, я нарешті досяг успіху, дотримуючись наступних вказівок:

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, я також використовую:

  • бауер
  • бродячий
    • віртуальна скринька (працює під Linux)
    • apt-get [linux]
  • git
  • vscode
  • дужки
  • атом
  • цд

кроки налаштування cntlm

Отже, я встановив cntlm . Налаштування cntlmдосить чітке вперед, ви шукаєте файл ini @C:\Program Files\Cntlm\cntlm.ini

  1. Відкрити C:\Program Files\Cntlm\cntlm.ini(можуть знадобитися права адміністратора)
  2. шукати Usernameі Domainлінії (рядок 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, тому додайте #рядок до PassLMі PassNTне використовуйте їх
  5. Вставити висновок з cntlm -Hна іні файлу , що заміняє лінії для PassLM, PassNTі PassNTMLv2, або коментар оригінальні лінії і додавати нові .
  6. Додайте свої Proxyсервери. Якщо ви не знаєте, що таке проксі-сервер ... Зробіть те, що я зробив, я шукав свій файл проконфігурації проксі, шукаючи AutoConfigURLключ реєстру в HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings. Перейдіть до цієї URL-адреси та перегляньте код, який трапляється у JavaScript.
  7. Опціонально ви можете змінити порт, де слухає cntlm, змінивши Listen ####рядок, де ####номер порту.

Налаштування NPM за допомогою cntlm

Отже, ви вказуєте npm на свій проксі-сервер cntml, ви можете використовувати ip, я використав localhostі порт за замовчуванням для cntlm, 3128так що мій URL проксі виглядає так

http://localhost:3128

За допомогою відповідної команди:

npm config set proxy http: // localhost: 3128

Набагато простіше. Ви налаштовуєте всі свої інструменти з тим самим URL-адресою, а пароль оновлюєте лише в одному місці. Життя набагато простіше не.

Потрібна настройка Сертифікат npm CA

З документації npm ca

Якщо ваш корпоративний проксі-сервер перехоплює 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 і перезавантажую його.


7

Я зіткнувся з декількома проблемами з цим і, нарешті, зробив наступне:

  1. Використовується Fiddler, вибрано "Автоматично підтвердити автентифікацію"
  2. У користувацьких правилах fiddler я додав

    if (m_AutoAuth) {oSession["X-AutoAuth"] = "domain\\username:password";}
  3. Нарешті в npm я встановив проксі на http: // localhost: 8888

Це спрацювало чудово.


Дякую! Працював як шарм !! Мій сценарій: Ім'я користувача було у форматі "домен / ім'я користувача". У паролі було "@". Не довелося взагалі робити кодування / декодування URL-адрес тощо
A_B

Для мене прекрасно працювали. Дуже дякую. Просто хотів зазначити, що використання "domain\\username:password"може становити загрозу безпеці крадіжок особи. Натомість використання "(default)"конфігу в користувацьких правилах працювало чарівно. Fiddler потрібно працювати, поки ви використовуєте "npm" для цього.
pk10

7

Для тих, хто бореться за корпоративний брандмауер, а також проблеми з 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" тут, мої облікові записи проксі однакові для захищених і незахищених запитів (зверніть увагу, як я залишив свій протокол як http: // для конфігурації https-proxy ). Це може бути для вас однаково, а може і не бути.

Я хочу зберегти SSL

Якщо ви хочете зберегти SSL, а не хочете користуватися strict-ssl=false, то вам належить зробити ще багато роботи. Для мене я за корпоративним брандмауером і ми використовуємо самопідписані сертифікати, тому я отримую помилку unable to get local issuer certificate. Якщо ви перебуваєте в тому ж човні, що і я, вам знадобиться встановити cafile=параметр у файлі конфігурації npm. Спочатку потрібно створити файл PEM, який містить інформацію про ваші самопідписані сертифікати. Якщо ви не знаєте, як це зробити, ось інструкції для середовища Windows без використання стороннього програмного забезпечення:

Нам потрібно чітко вказати, яким сертифікатам слід довіряти, оскільки ми використовуємо сертифікати самопідписання. Для мого прикладу я перейшов на www.google.com за допомогою Chrome, щоб я міг захопити сертифікати.

У Chrome перейдіть до Інспектувати -> Захист -> Переглянути сертифікат. Ви побачите всі сертифікати, які дозволяють з'єднання SSL. Зверніть увагу, як ці сертифікати підписуються самостійно. Розмита частина - це моя компанія, і ми не є сертифікованим органом. Ви можете експортувати повний шлях сертифіката у вигляді файлу P7B або ж експортувати сертифікати окремо у вигляді файлів CER (кодування base64). Експорт повного шляху як P7B не приносить вам великої користі, оскільки вам потрібно буде відкрити цей файл у диспетчері сертифікатів і все одно експортувати як окремі файли CER. У Windows, двічі клацнувши файл P7B, відкриється програма диспетчера сертифікатів.

введіть тут опис зображення

Експорт як CER (Base 64) - це дійсно текстовий файл у такому форматі:

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

Щоб створити наш файл PEM, нам просто потрібно скласти ці сертифікати один на одного в один файл і змінити розширення на .pem. Для цього я використовував блокнот.

Ви зберігаєте сертифікати у зворотному порядку зі шляху сертифіката. Отже, я б почав з * .google.com, потім вставив Websense під ним, потім видав CA 1 і т. Д. Цим чином сертифікати аналізуються зверху вниз, шукаючи відповідний Root CA. Просто включити Root CA не вийде, але нам також не потрібно включати всі сертифікати. З вищенаведеного шляху мені потрібно включити лише ті сертифікати, які поставляються перед сертифікатом Websense (Випуск CA 1, Policy CA, Root CA).

Після того, як ці сертифіковані сертифікати, які підписалися, будуть збережені у файлі PEM, ми готові доручити npm використовувати ці сертифікати як наш довірений CA. Просто встановіть конфігураційний файл, і вам слід добре:

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

Тепер із набором проксі-серверів (http та https) та встановленим реєстром https://registry.npmjs.orgви маєте змогу встановлювати пакети за корпоративним брандмауером із сертифікатами, що підписуються самостійно, не змінюючи strict-sslналаштування.


6

Ви можете перевірити Fiddler, якщо NPM видає помилку аутентифікації. Встановити та налаштувати його легко. Встановіть правило Fiddler на автоматичну перевірку автентичності. В .npmrc встановіть ці властивості

registry=http://registry.npmjs.org
proxy=http://127.0.0.1:8888
https-proxy=http://127.0.0.1:8888
http-proxy=http://127.0.0.1:8888
strict-ssl=false

Це працювало для мене :)


дивно, що жодна з конфігурацій, які я використовував для мого проксі, не працювала, я використовував це і відкрив скрипт, і я міг його просто використовувати ...
Роберто

5

Спробуйте це, встановіть проксі в npm наступним чином

npm config set proxy "http://<user-name>:<password>@<proxy-url>:<port>"
npm config set https-proxy "http://<user-name>:<password>@<proxy-url>:<port>"
npm config set strict-ssl false
npm config set registry "http://registry.npmjs.org/"

4

Ви отримаєте хост і порт проксі-сервера від свого адміністратора або підтримки сервера.

Після цього налаштуйте

npm config set http_proxy http://username:password@proxyofmycomp.com:itsport
npm config set proxy http://username:password@proxyofmycomp.com:itsport

Якщо в паролі є якийсь спеціальний символ, спробуйте з% urlencode. Наприклад: - фунт (хеш) повинен бути замінений на% 23.

Це працювало для мене ...


3

Просто створіть файл з файлом .npmrc у папці вашого проекту, це дозволить уникнути налаштування проксі на системному рівні

#Without password
proxy=http://ipaddress:80
https-proxy=http://ipaddress:80

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

Прокоментуйте так, якщо ви не використовуєте проксі

#proxy=http://ipaddress:80
#https-proxy=http://ipaddress:80

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

3

Жодна з існуючих відповідей не пояснює, як використовувати npm з файлом PAC. Деякі пропонують завантажити файл PAC, перевірити його вручну та вибрати один із рядків "PROXY ...". Але це не працює, якщо PAC-файл потребує вибору з декількох проксі, або якщо файл PAC містить складну логіку для обходу проксі-серверів для певних URL-адрес.

Також для деяких корпоративних проксі-серверів потрібна автентифікація NTLM. CNTLM може працювати з автентифікацією, але не підтримує файли PAC.

Альтернативою є використання Alpaca , який виконує файл PAC у VM JavaScript і виконує автентифікацію NTLM з отриманим проксі.


2

Якщо ви стоїте за корпоративною мережею з проксі, я просто використовував інструмент проксі ntlm і використовував порт і проксі, надані ntlm, для інстанції я використовував цю конфігурацію:

strict-ssl=false
proxy=http://localhost:3125

Я сподіваюся, що це допомагає.


2

Використовуйте команду нижче в cmd або GIT Bash або іншому рядку

$ npm config set proxy "http://192.168.1.101:4128"

$ npm config set https-proxy "http://192.168.1.101:4128"

де 192.168.1.101 є проксі ip, а 4128 - портом. змінити відповідно до налаштувань проксі.


2

Ви повинні використовувати "npm config set http-proxy "

використання:

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


1

Спробуйте це, для мене це працювало тільки:

npm --proxy http: //: @proxyhost: --https-proxy http: //: @proxyhost: --strict-ssl false false -g package

Зверніть увагу на опцію --ststric-ssl false

Удачі.


1

Налаштування проксі-сервера NPM, згаданий у прийнятій відповіді, вирішує проблему, але, як ви бачите в цій проблемі з npm , деякі залежності використовують GIT, і це робить необхідну установку проксі-сервера git , і це можна зробити так:

git config --global http.proxy http://username:password@host:port
git config --global https.proxy http://username:password@host:port

Згадана настройка NPM-проксі:

npm config set proxy "http://username:password@host:port"
npm config set https-proxy "http://username:password@host:port"
npm config set strict-ssl false
npm config set registry "http://registry.npmjs.org/"

0

У мене була подібна проблема, і я спробував усі способи вирішення вище, але жоден з них не працював на мене (я використовував у своєму паролі спеціальні символи (наприклад, символ "@"), і мені також потрібно було додати доменне ім'я).

Крім того, я трохи побоювався додати свій пароль як звичайний текст. Виявилося, найпростішим рішенням для подолання всіх цих викликів було використання якихось зворотних проксі (наприклад, Fiddler).

Я вже детально описав кроки конфігурації у цій відповіді.



0

Я зіткнувся з подібною проблемою і виявив, що мій файл npm config (.npmrc) має неправильний запис реєстру. прокоментував це і запустив npm install. це спрацювало.


0

ОС: Windows 7

Кроки, які працювали для мене:

  1. npm config get proxy
  2. npm config get https-proxy

  3. Коментарі: Я виконав цю команду, щоб знати мої настройки проксі
    npm config rm proxy

  4. npm config rm https-proxy
  5. npm config set registry=http://registry.npmjs.org/
  6. npm install

0

Оскільки у мене все ще виникають проблеми з налаштуванням параметрів проксі на роботі та відключенням їх вдома, я написав сценарій та публікую npm-corpo-proxy.sh . У кожному корпусі пароль потрібно часто змінювати і повинен містити спеціальні символи, які повинні бути закодовані перед подачею конфігурації npm (те саме для домену форми резервного копіювання \ користувача).


0

З невеликого пошуку в Google перше, що я спробував, це це

npm config set registry http://registry.npmjs.org/
npm config set proxy "your proxy"
npm config set https-proxy "your proxy"

Але все ж npm, здавалося, втрачає зв'язок при спробі зробити "npm install" s. тоді я запустив цей рядок у командному рядку і тепер я можу використовувати npm install

set NODE_TLS_REJECT_UNAUTHORIZED=0

0

Я не міг змусити його працювати з CNTLM. Я спробував дотримуватися всієї інформації, розміщеної вище, але проксі все ще не надав дозвіл на з'єднання. З Fiddler вам просто потрібно встановити його і перевірити параметр Автоматично підтверджена автентичність. Але для роботи мені довелося видалити .npmrc файл із моєї папки користувача та встановити змінні середовища, як зазначено тут , із цими значеннями:

set npm_config_https-proxy="http://127.0.0.1:8888"

set npm_config_registry="http://registry.npmjs.org/"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.