Вопрос или проблема
Я относительно новичок в использовании HTTP-протоколов, связанных с прокси и аутентификацией. Я работаю над приложением, которое запускается на Windows и использует хост-сеть для отправки/получения HTTP/S-запросов. Оно также использует Libcurl для помощи в передаче данных.
Однако у меня есть несколько проблем, когда мне приходится использовать прокси. Поскольку я нахожусь в сети, у меня определен прокси для определенных URL с файлом PAC. Поскольку в Libcurl нет поддержки Javascript, я использую PACParser для обработки файла PAC и определения прокси.
Когда я использую прокси, получаю сообщение 407 о необходимости аутентификации. Я не уверен, как обойти аутентификацию прокси. Я пробовал различные доступные настройки с CURL, такие как BASIC/DIGEST/NTLM. Ни одна из них, похоже, не работает. Однако если я жёстко прописываю имя пользователя и пароль в запросе, он проходит.
Как мне избежать жесткого кодирования имени пользователя/пароля и при этом обеспечить работу использования прокси?
См. libcurl-tutorial (3)
, раздел Переменные окружения:
libcurl автоматически проверяет и использует набор переменных
окружения, чтобы узнать, какие прокси использовать для определенных
протоколов. Имена переменных следуют древнему де-факто стандарту и
строятся в виде "[protocol]_proxy" (обратите внимание на строчные буквы).
Это означает, что переменная 'http_proxy' проверяется на наличие имени прокси
для использования, когда входной URL является HTTP. По тому же правилу
переменная с именем 'ftp_proxy' проверяется для FTP URL. Снова, прокси всегда
являются HTTP-прокси, разные имена переменных просто позволяют использовать
разные HTTP-прокси.
Содержимое переменной окружения прокси должно быть в формате
"[protocol://][user:password@]machine[:port]".
Поэтому вы должны вводить прокси в настройках переменных окружения, а не в сетевых настройках.
Ответ или решение
Использование прокси-сервера в приложениях, работающих с HTTP/S запросами через библиотеку libcurl, — это ключевая задача, особенно когда вы сталкиваетесь с необходимостью аутентификации. Давайте разберемся, как вы можете добиться этого, избегая явного указания логина и пароля в коде.
Проблема
Вы разрабатываете приложение на Windows, использующее libcurl для отправки и получения HTTP/S запросов. На вашей сети настроен прокси-сервер, определяемый PAC-файлом, который помогает направлять трафик. При отправке запросов через прокси вы сталкиваетесь с кодом ошибки 407 («требуется аутентификация»), и единственный способ получить доступ — это явно указать логин и пароль в запросе, что нежелательно по соображениям безопасности.
Решение
1. Использование окружения для прокси
libcurl поддерживает использование переменных окружения для указания параметров прокси. Эти переменные следуют стандарту и именуются в формате [protocol]_proxy
. В вашем случае для HTTP потребуется переменная http_proxy
. Формат переменной:
[protocol://][user:password@]machine[:port]
Рекомендация: Настройте в вашей ОС переменные окружения http_proxy
и https_proxy
(если используется HTTPS) без указания user и password. Это создаст базовые условия для работы.
2. Автоматическая аутентификация
Если сеть использует NTLM или другой протокол, поддерживающий автоматическую аутентификацию, вы можете настроить libcurl на использование механизмов, которые поддерживают безвведную аутентификацию:
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
Эта установка скажет libcurl попытаться использовать любое доступное средство аутентификации, поддерживаемое сервером.
3. Работа с PAC-файлом
С учетом отсутствия поддержки JavaScript в libcurl, решение через PAC-файл возможно только через стороннюю библиотеку, как PACParser, которую вы уже упомянули. Убедитесь, что определенный прокси из PAC используется корректно в вашей конфигурации через libcurl.
Заключение
Исходя из предоставленной информации, рекомендуется пользоваться переменными окружения для определения прокси, чтобы избежать указания учётных данных прямо в коде. Автоматическая аутентификация при помощи libcurl может быть адаптирована к различным протоколам (BASIC, DIGEST, NTLM), и при правильной конфигурации можно обойтись без прямого указания логина и пароля.
Эта стратегия не только повысит уровень безопасности, но и улучшит общий подход к автоматизации вашей системы, оставляя возможность корректировки параметров прокси без внесения изменений в кодовое решение.