Я использую WWW::Mechanize
, чтобы сделать HTTPS-соединение с частью оборудования, работающего на собственном веб-сервере на основе SSLv3.WWW :: Механизировать с SSL работает, но реакция медленная
Мой код работает, но ответы на get(), submit() и click() возвращаются медленно, от 6 до 12 секунд.
Существует проблема с конфигурацией, которая приводит к тому, что IP-адрес сервера отличается от того, который он использует в своем сертификате. По этой причине я игнорирую проверку имени хоста.
Это может быть причиной того, почему WWW :: Mechanize работает медленно. Тем не менее, при использовании обычного веб-браузера для выполнения одних и тех же функций нет никакой медлительности. Я работаю на Solaris 10 (sparc), с Perl 5.20.1 и OpenSSL 0.7.9d. Механизация выполняется быстро при выполнении обычных HTTP-соединений на другом сервере.
Я также пробовал все псевдонимы агентов. Без улучшения.
use WWW::Mechanize;
$ENV{HTTPS_VERSION} = 3; # Try SSLv3 first
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; # Ignore verification
my $agent = WWW::Mechanize->new(autocheck => 1);
$agent->get($https_url);
$agent->credentials($username, $password);
$agent->get($status_url);
print "$agent->{content}\n";
$agent->form_number(2);
$agent->click();
print "$agent->{content}\n";
UPDATE:
Я обновил OpenSSL на 1.0.1j и перекомпилировать Net :: SSLeay 1,66. Я также обновил IO :: Socket :: SSL до 2.002. Я все еще видел такое же поведение.
Затем я перекомпилировал LWP :: Protocol :: https 6.0.6 и WWW :: Механизируйте 1.73 для хорошей меры. Такое же поведение.
Я добавил use IO::Socket::SSL qw(debug3);
к моему сценарию. Я вижу 6-секундную задержку вывода отладки.
Fetching initial page...
DEBUG: .../IO/Socket/SSL.pm:2537: new ctx 11476520
DEBUG: .../IO/Socket/SSL.pm:529: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:531: socket connected
DEBUG: .../IO/Socket/SSL.pm:553: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:589: not using SNI because hostname is unknown
DEBUG: .../IO/Socket/SSL.pm:640: set socket to non-blocking to enforce timeout=180
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:663: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:673: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:693: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:663: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:673: waiting for fd to become ready: SSL wants a read first
# >>> There's a 6 second delay here <<<
DEBUG: .../IO/Socket/SSL.pm:693: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:708: ssl handshake done
DEBUG: .../IO/Socket/SSL.pm:2570: free ctx 11476520 open=11476520
DEBUG: .../IO/Socket/SSL.pm:2582: OK free ctx 11476520
Credentials...
Fetching status page...
DEBUG: .../IO/Socket/SSL.pm:2537: new ctx 11476520
DEBUG: .../IO/Socket/SSL.pm:529: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:531: socket connected
DEBUG: .../IO/Socket/SSL.pm:553: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:589: not using SNI because hostname is unknown
DEBUG: .../IO/Socket/SSL.pm:640: set socket to non-blocking to enforce timeout=180
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:663: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:673: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:693: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:663: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:673: waiting for fd to become ready: SSL wants a read first
# >>> Another 6 second delay <<<
DEBUG: .../IO/Socket/SSL.pm:693: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:708: ssl handshake done
DEBUG: .../IO/Socket/SSL.pm:2570: free ctx 11476520 open=11476520
DEBUG: .../IO/Socket/SSL.pm:2582: OK free ctx 11476520
DEBUG: .../IO/Socket/SSL.pm:2537: new ctx 11476520
DEBUG: .../IO/Socket/SSL.pm:529: socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:531: socket connected
DEBUG: .../IO/Socket/SSL.pm:553: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:589: not using SNI because hostname is unknown
DEBUG: .../IO/Socket/SSL.pm:640: set socket to non-blocking to enforce timeout=180
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:663: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:673: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:693: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:663: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:673: waiting for fd to become ready: SSL wants a read first
# >>> Another 6 second delay <<<
DEBUG: .../IO/Socket/SSL.pm:693: socket ready, retrying connect
DEBUG: .../IO/Socket/SSL.pm:653: Net::SSLeay::connect -> -1
DEBUG: .../IO/Socket/SSL.pm:708: ssl handshake done
DEBUG: .../IO/Socket/SSL.pm:2570: free ctx 11476520 open=11476520
DEBUG: .../IO/Socket/SSL.pm:2582: OK free ctx 11476520
Submitting form...
# Repeat of behavior when fetching the initial page, except ctx is 12700768
РЕШЕНИЕ:
Вот мой рабочий скрипт с изменениями, описанными в моем разговоре с Штеффен. Решающим условием было оставаться живым.
use WWW::Mechanize;
use IO::Socket::SSL qw(debug3); # Turn on level 3 debug
use LWP::ConnCache;
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; # Ignore verification
my $agent = WWW::Mechanize->new(autocheck => 1);
$agent->conn_cache(LWP::ConnCache->new); # Enable keep-alive
$agent->get($https_url);
$agent->credentials($username, $password);
$agent->get($status_url);
$agent->form_number(2);
$agent->click();
Благодарим вас за отзыв о SSL_verifycn. Я попробую. Ты прав. Это 0.9.7d, и это необычная конфигурация. Если я обновляю OpenSSL, я думаю, что мне придется обновлять некоторые модули Perl, например Net :: SSLeay. У меня нет Crypt :: SSLeay, который я не думаю, что использую с WWW :: Mechanize в любом случае. Я опубликую мои результаты как можно скорее. – MikeU
WWW :: Mechanize использует LWP :: UserAgent, который с версии 6.0 использует IO :: Socket :: SSL по умолчанию. IO :: Socket :: SSL сам использует Net :: SSLeay. Crypt :: SSLeay использовался в версии LWP до 6.0. Поскольку вы явно отключили проверку имени хоста, вы должны использовать бэкэнд IO :: Socket :: SSL, потому что Crypt: SSLeay в любом случае не проверяет имя хоста. Поэтому этого достаточно, чтобы перекомпилировать Net :: SSLeay. –
Я обновился до OpenSSL 1.0.1j и добавил результаты в мой комментарий orignal выше. – MikeU