понедельник, 2 декабря 2013 г.

Perl, OpenSSL и самоподписной сертификат

В продолжение предыдущей заметки...

Так как кроме получения данных по https со "своими" сертификатами мне эти данные нужно было ещё и обработать, то решил и обработку и получение данных запихнуть в один perl-скрипт. Так как с проблемой "трёх сертификатов в одном файле" разобрался, то не предвидел каких-либо трудностей на этом пути :)

Ну и само собой трудности появились, быстро их решить не удалось, а в инете нагуглилось немалое количество вопросов на эту же тему, но так же без ответов их решающих.

Ошибка:

500 Can't connect to www.nekiysite.ru:443 (SSL connect attempt failed with unknown error error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure)


Решение:
обязательно должны быть установлены модули LWP::UserAgent, Net::SSL, IO::Socket::SSL, Net::SSLeay. Net::SSL мы явно прописываем в скрипте, но остальные тоже используются. В моём случае всё как бы работало, и на модули не ругалось, но не хватало Net::SSLeay. После его установки всё заработало как надо. В общем, проверяем наличие этих модулей и при необходимости доустанавливаем их.


Ну и сам вариант скрипта:

#!/usr/bin/perl

use strict;
use warnings;

use LWP::UserAgent;
use Net::SSL;

$ENV{HTTPS_CA_FILE} = 'serv.pem';
$ENV{HTTPS_CERT_FILE} = 'servcert.pem';
$ENV{HTTPS_KEY_FILE}  = 'servkey.pem';

my $ua = LWP::UserAgent->new( ssl_opts => {
        verify_hostname => 0,
        SSL_version     => 'SSLv3',
    }); 

$ua->agent("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
$ua->timeout(5);

my $res = $ua->get('https://www.nekiysite.ru/content.xml');

if ( $res->is_success ) {
    ...
}
...


Использованы pem-файлы, полученные из одного p12-файла. Из предыдущей заметки.
Лишнее из скрипта убрано, здесь только то, что касается описываемого вопроса.

Теоретически можно передать имена (и пути) к сертификатам в ssl_opts, но у меня не заработало, зато подхватилось из переменных окружения.

Комментариев нет:

Отправить комментарий