Сценарии сломались после обновления LWP "проверка сертификата не удалась"
У меня много скриптов, большинство из которых основаны на WWW::Mechanize
, которые очищают данные от обычного оборудования, доступного через HTTP. После обновления большей части моей установки perl и ее модулей все скрипты, использующие HTTPS://сломались из-за "certificate verify failed"
Это результат того, что новые версии LWP выполняют надлежащую проверку сертификата и dies
, если что-то не соответствует.
В моем случае ожидаемая аутентификация с подтверждением подлинности ожидается из-за обстоятельств, поэтому мне нужно найти способ для чистой проверки этой проверки.
Ответы
Ответ 1
Сначала я добавил свой код с помощью:
system("export PERL_LWP_SSL_VERIFY_HOSTNAME=0");
... но поскольку это неоптимально (поскольку это влияет на весь сеанс входа в систему, в основном).
Изменить: Кроме того, экспорт этого способа не делает ничего, поскольку я пальцем поймал свою логику. См. Комментарии ниже.
Затем я изменил его, чтобы добавить код:
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
И после этого, только сценарии, которые должны обойти проверку, делают это чистым и простым способом.
Ответ 2
Скажи, что я хочу тебе кое-что сказать, и я не хочу, чтобы кто-то еще знал об этом. Мы бы упорядочили пароль, и я бы использовал его для шифрования сообщения, затем я пришлю вам сообщение.
Что делать, если я не удостоверился, что человек, которому я дал пароль и зашифрованное сообщение, был вами? Тогда любое количество людей может просто олицетворять вас, и шифрование было бы напрасно. Это было состояние поддержки LWP HTTPS до недавнего времени.
Теперь LWP фактически проверяет, к кому это относится, если вы не попросите LWP вести себя так, как это было раньше. Вы можете сделать это, используя:
my $ua = LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
);
Если вы хотите повлиять на все экземпляры LWP:: UserAgent в script без указания опции по всему месту, вы можете добавить следующее к своему script
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
Или вы можете запустить script следующим образом:
PERL_LWP_SSL_VERIFY_HOSTNAME=0 script.pl
Наконец, если вы хотите, чтобы LWP всегда был небезопасным, вы можете добавить в свой логин script следующее:
export PERL_LWP_SSL_VERIFY_HOSTNAME=0
Однако я не рекомендую ни одного из вышеперечисленных. Самый лучший вариант - предоставить сертификат для хоста, с которым вы общаетесь. (Это эквивалентно добавлению исключения в Firefox, если вы знаете, что я имею в виду.) См. Документацию для $ua->ssl_opts
.
Ответ 3
Для меня, используя:
my $ua = LWP::UserAgent->new(
ssl_opts => { verify_hostname => 0 },
);
Поддавшись
Использование по умолчанию SSL_verify_mode для SSL_VERIFY_NONE для клиента осуждается! Установите SSL_verify_mode в SSL_VERIFY_PEER вместе. с SSL_ca_file | SSL_ca_path для проверки. Если вы действительно не хотите проверить сертификат и открыть соединение для Атаки Man-In-The-Middle, пожалуйста, установите SSL_verify_mode явно SSL_VERIFY_NONE в вашем приложении.
Использование этого не давало никаких предупреждений:
my $ua = LWP::UserAgent->new(
ssl_opts => { SSL_verify_mode => 'SSL_VERIFY_NONE'},
);
Ответ 4
@ikegami делает хороший аргумент в пользу того, почему вы не хотите отключать проверку имени хоста SSL, но прямо не упоминает, как его избежать.
Если вы разговариваете с общедоступной системой с сертификатом, подписанным CA, вам нужно указать LWP в свою коллекцию сертификатов корневого каталога дистрибутива. В системе под управлением Debian (Ubuntu и т.д.) Это поддерживается под /etc/ssl/certs/
.
BEGIN {
$ENV{HTTPS_CA_DIR} = '/etc/ssl/certs'
}
Если вы разговариваете с собственным сервером с самозаверяющим сертификатом, вы можете сохранить копию этого сертификата на клиенте и указать ваш script в этот конкретный файл.
BEGIN {
$ENV{HTTPS_CA_FILE} = '/path/to/my/server-certificate.crt'
}
Вместо этого вы можете установить их в среде перед запуском script (например, экспортировать их из своей оболочки) или применить параметры непосредственно к объекту UserAgent. Дополнительную информацию см. В LWP:: Документация UserAgent; найдите ssl_opts
(около половины страницы).