Как заставить Frontier::Client / LWP ОСТАНОВИТЬ проверку SSL-сертификата в веб-приложении CGI::Application?
В средах разработки и тестирования мы используем самозаверяющие сертификаты SSL для веб-службы XMLRPC. Производство использует хороший сторонний сертификат, и проверка сертификата работает хорошо, никаких проблем нет.
В коде вызывающего приложения, которое является веб-приложением CGI::Application, мы пропускаем проверку сертификатов SSL только в среде разработки и тестирования, зная, что это будет и должно произойти сбой... или пытаясь пропустить это. Несмотря на то, что для $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} установлено значение 0, вызов все равно не выполняется с:
Error executing run mode 'myRunMode': 500 Can't connect to mydomain.com:443 (certificate verify failed)
Испытана куча других (возможно, уже устаревших?) Переменных env, и мы не можем обойти эту ошибку в веб-приложении. В командной строке мы можем сделать успешный вызов, который игнорирует проверку сертификата со всем тем же кодом, и мы сравнили версии всех модулей Perl в игре (например, LWP в 6.15 в обоих случаях).
Он-лайн обсуждение указывает на разные сценарии, в зависимости от того, какой бэкэнд SSL используется, поэтому мы экспериментировали с установкой LWP::Protocol::https и, по крайней мере, получили другое поведение. Мы начали терпеть неудачу с этим вместо этого сразу после установки модуля:
Error executing run mode 'myRunMode': 404 Not Found
404 выглядит как красная сельдь, но, увы, удаление LWP::Protocal::https возвращает нас к ошибке "сбой проверки сертификата", поэтому кажется, что мы можем что-то предпринять.
У кого-нибудь есть идеи о том, как пропустить проверку сертификата в этой среде CGI::Application?
2 ответа
Это старая ветка, но все же я хотел бы поделиться своим решением. Просто добавьте следующее, прежде чем делать пограничные вызовы:
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
Не нужно менять какой-либо пограничный код или прочее...
LWP:: UserAgent:: ssl_opts (verify_hostname => 0);
--- ОБНОВЛЕНИЕ 17/17/16 330 вечера ---
Если у вас все в порядке с редактированием Frontier::Client (или просто скопируйте его и присвоите ему другое имя пакета / файла), вы можете просто заменить использование LWP:: UserAgent на WWW:: Curl:: Easy, который был моим перейти к SSL (у меня есть старая версия LWP, которая использует библиотеки с ошибками). Вот код скручивания:
my ($rBody,$rHead); # response written here
my $curl = WWW::Curl::Easy->new();
$curl->setopt(CURLOPT_URL, $url);
$curl->setopt(CURLOPT_HEADER, 0);
$curl->setopt(CURLOPT_POST, 1);
$curl->setopt(CURLOPT_POSTFIELDS, $myRequest);
$curl->setopt(CURLOPT_HTTPHEADER, \@myHeaders);
$curl->setopt(CURLOPT_WRITEDATA, \$rBody);
$curl->setopt(CURLOPT_WRITEHEADER, \$rHead);
$curl->setopt(CURLOPT_FOLLOWLOCATION, 1);
$curl->setopt(CURLOPT_SSL_VERIFYHOST, 0);
$curl->setopt(CURLOPT_SSL_VERIFYPEER, 0);
my $cc = $curl->perform();
Вы можете даже использовать HTTP::Response->parse($rHeadRegexed . $ RBody) впоследствии, чтобы получить тот же объект, возвращенный запросом LWP::UserAgent-> (и т. Д.);