Использование 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-адреса / хоста, в то время как дубай адресует только один прокси-адрес - из обзора
Ferrybig

1
Ни один ответ не указывает, как использовать pac-скрипты, которые могут содержать несколько прокси-адресов в зависимости от целевого адреса ip / host. Может кто-нибудь помочь, пожалуйста.
Партха Саратхи Гош

2
Для меня это помогло открыть proxy.pacфайл, чтобы получить из него адрес прокси. (В моем случае мне просто пришлось переключить порт на 8080).
кочевник

@ParthaSarathiGhosh Вы правы, ни один из ответов на самом деле не объяснил, как использовать сценарии PAC, поэтому я добавил еще один ответ, который касается этого: stackoverflow.com/a/61811444 . Уже несколько лет, но лучше поздно, чем никогда?
user1031921

Ответы:


204

У меня только что была очень похожая проблема, когда я не мог заставить npm работать за нашим прокси-сервером.

Мое имя пользователя имеет форму «домен \ имя пользователя» - включая косую черту в конфигурации прокси, что привело к появлению прямой косой черты. Итак, введя это:

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

и с этим доступ прокси был исправлен.


5
это причина того, что вы пропустили часть% 5C .key, являющуюся C .... видите, я разложил ее для вас
sinisterrook

1
Я только что обновил некоторые вещи, и мой прокси перестал работать снова. Оказалось, что в настройке «прокси» файла .npmrc (как упомянуто ниже @Ovidiu Buligan) он содержал% 5C для обратной косой черты, а «https-proxy» просто содержал «\». Изменение этого значения на% 5C решило проблему. Я полагаю, это также можно обновить, запустив конфигурационный набор npm http_proxy " домен% 5 Имя пользователя: пароль @ имя_сервера: порт /"
Стив Робертс,

1
Я пытаюсь настроить npm за прокси, но есть способ выполнить "ping", используя конфигурацию npm. Потому что, если мой conf неверен, мой пользователь будет заблокирован в моем корпоративном домене.
Рикардо

3
Что сработало для меня, так это сначала очистить проклятые переменные среды. Используйте set HTTP_PROXY = и установите HTTPS_PROXY =
Sydwell

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

64

Найдите URL-адрес pacфайла в настройках локальной сети Internet Explorer и загрузите 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 пользователя не требуется для прокси , только имя пользователя и пароль (которые могут отличаться от вашего имени входа Active Directory)

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


Спасибо. я перешел на .npmrc и изменил настройки. это сработало
Арн-

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-прокси я должен был сделать «... установить https-proxy = http: // ...» вместо «... установить https-proxy http: // ...» для этого работай. Просто мои $ .02.
Ник

Благодаря установке https-прокси на http: // это единственное, что сработало; после того, как я сбросил переменные окружения http_proxy и https_proxy из bash!
Алекс Пуннен

Для https-прокси я не смог установить «установить https-прокси https: /.../», мне пришлось установить «установить https-прокси http: // ...» (информация прокси от https -> http)
Марс

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
Просто чтобы указать, что установка строгого ssl для npm в ложь - это проблема безопасности. Вместо этого рассмотрите правильную настройку ca[]свойства на npm.
Аарон C

26

Чтобы расширить @Steve Робертс ответ.

Мое имя пользователя имеет форму «домен \ имя пользователя» - включая косую черту в конфигурации прокси, что привело к появлению прямой косой черты. Итак, введя это:

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чтобы получить проанализированные значения, которые я установил выше, и именно так я узнал о двойном кодировании. Weird.

По сути, вы должны выяснить следующие требования:

  1. DOMAINТребуется ли строка для аутентификации
  2. Вам нужно кодировать специальные символы?
    • Пробелы и знаки (@) особенно сложны

С уважением.

ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫ WINDOWS (CMD Prompt)

Обновить

Оказывается, что даже с вышеупомянутыми конфигурациями у меня все еще были некоторые проблемы с некоторыми пакетами / сценариями, которые используют Request - Упрощенный 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]
  • мерзавец
  • 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 -Hini-файла, заменив строки для 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 установленный прокси http: // localhost: 3128

Это намного проще. Вы устанавливаете все свои инструменты с тем же URL-адресом и обновляете пароль только в одном месте. Жизнь намного проще, нет.

Необходимо настроить сертификат 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 и перезапускаю его.


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"может создать угрозу безопасности Identity Theft. Вместо этого использование "(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/

Вкратце, я понял, что мои учетные данные прокси одинаковы для защищенных и незащищенных запросов (обратите внимание, как я оставил свой протокол как 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 откроет приложение 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. Простое включение 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 file в папке вашего проекта, это позволит избежать настройки прокси на системном уровне.

#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 на виртуальной машине 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

На работе мы используем ZScaler в качестве нашего прокси. Единственный способ заставить npm работать - использовать Cntlm .

Смотрите этот ответ:

NPM за прокси NTLM


1

Попробуйте это, это было единственное, что работало для меня:

npm --proxy http: //: @proxyhost: --https-proxy http: //: @proxyhost: --strict-ssl false установить -g пакет

Обратите внимание на опцию --strict-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).

Я уже подробно описал шаги настройки в этом ответе в SO.



0

Я столкнулся с подобной проблемой и обнаружил, что мой файл конфигурации npm (.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. Затем я запустил эту строку в командной строке, и теперь я могу использовать 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.