2014-10-28 2 views
2

Я использую 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(); 

ответ

3

Там есть проблема конфигурации, которая вызывает IP-адрес сервера отличается от той, которую она использует в своем свидетельстве. По этой причине я игнорирую проверку имени хоста.

Лучше использовать параметр SSL_verifycn_name для IO :: Socket :: SSL для определения, какое имя вы ожидаете в сертификате.

Это может быть причиной, по которой WWW :: Mechanize работает медленно.

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

Я работаю на Solaris 10 (sparc), с Perl 5.20.1 и OpenSSL 0.7.9d.

Сомневаюсь, что вы используете 0.7.9d, вы, вероятно, имеете значение 0.9.7d. Это по-прежнему очень необычная конфигурация, использующая современный Perl с 10-летней версией OpenSSL. Я бы предположил, что вместо этого вы используете текущую версию, и, возможно, ваши проблемы уйдут.

Однако при использовании обычного веб-браузера для выполнения тех же функций нет никакой медлительности.

Текущие браузеры используют современный стек TLS, который имеет более эффективные шифры, возобновление сеанса и т. Д. Опять же, попробуйте вместо этого использовать последнюю версию OpenSSL.

+0

Благодарим вас за отзыв о SSL_verifycn. Я попробую. Ты прав. Это 0.9.7d, и это необычная конфигурация. Если я обновляю OpenSSL, я думаю, что мне придется обновлять некоторые модули Perl, например Net :: SSLeay. У меня нет Crypt :: SSLeay, который я не думаю, что использую с WWW :: Mechanize в любом случае. Я опубликую мои результаты как можно скорее. – MikeU

+0

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. –

+0

Я обновился до OpenSSL 1.0.1j и добавил результаты в мой комментарий orignal выше. – MikeU