Как заставить 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-> (и т. Д.);

Другие вопросы по тегам