Сценарии сломались после обновления LWP "проверка сертификата не удалась" - программирование

Сценарии сломались после обновления LWP "проверка сертификата не удалась"

У меня много скриптов, большинство из которых основаны на WWW::Mechanize, которые очищают данные от обычного оборудования, доступного через HTTP. После обновления большей части моей установки perl и ее модулей все скрипты, использующие HTTPS://сломались из-за "certificate verify failed"

Это результат того, что новые версии LWP выполняют надлежащую проверку сертификата и dies, если что-то не соответствует.

В моем случае ожидаемая аутентификация с подтверждением подлинности ожидается из-за обстоятельств, поэтому мне нужно найти способ для чистой проверки этой проверки.

4b9b3361

Ответ 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 (около половины страницы).