2015-08-14 2 views
0

Perl version is = v5.12.4Perl UserAgent не будет подключаться к серверу TLS1.2

LWP::UserAgent->VERSION = 6.03

#.... 
    # Setup HTTP request 
    my $req = HTTP::Request->new(); 
    $req->method($cmd); 
    $req->uri($uri); 
    $req->header('content-type' => 'application/json'); 
    $req->header('Accept' => 'application/json'); 

    # Setup the call 
    my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, 
               SSL_version => 'tlsv12' }); 
    $ua->timeout(60); 

    # Do the call 
    my $resp = $ua->request($req); 
    # .... 

код HTTP всегда 500 и я получаю сообщение об ошибке -

"Can't connect to 10.0.0.1:443".

Я пробовал различные SSL_versions строки tlsv12, tslv1. 2, TSLv1, TLSv12, TLS и т. Д. Безрезультатно. Я знаю, что сервер ожидает TLS 1.2. Тот же HTTP-вызов через curl отлично работает.

Дополнительный выход отладки ..

Perl -MIO::Socket::SSL=debug4 powervc_cli.pl -O 
DEBUG: .../IO/Socket/SSL.pm:193: set domain to 2 
DEBUG: .../IO/Socket/SSL.pm:1545: new ctx 140528264056208 
DEBUG: .../IO/Socket/SSL.pm:334: socket not yet connected 
DEBUG: .../IO/Socket/SSL.pm:336: socket connected 
DEBUG: .../IO/Socket/SSL.pm:349: ssl handshake not started 
DEBUG: .../IO/Socket/SSL.pm:379: set socket to non-blocking to enforce timeout=60 
DEBUG: .../IO/Socket/SSL.pm:392: Net::SSLeay::connect -> -1 
DEBUG: .../IO/Socket/SSL.pm:402: ssl handshake in progress 
DEBUG: .../IO/Socket/SSL.pm:412: waiting for fd to become ready: SSL wants a read first 
DEBUG: .../IO/Socket/SSL.pm:432: socket ready, retrying connect 
DEBUG: .../IO/Socket/SSL.pm:392: Net::SSLeay::connect -> 0 
DEBUG: .../IO/Socket/SSL.pm:440: connection failed - connect returned 0 
DEBUG: .../IO/Socket/SSL.pm:1276: SSL connect attempt failed because of handshake problemserror:00000000:lib(0):func(0):reason(0) 

DEBUG: .../IO/Socket/SSL.pm:1276: IO::Socket::INET6 configuration failederror:00000000:lib(0):func(0):reason(0) 

DEBUG: .../IO/Socket/SSL.pm:1582: free ctx 140528264056208 open=140528264056208 
DEBUG: .../IO/Socket/SSL.pm:1590: OK free ctx 140528264056208 

Пожалуйста, помогите! -Eddie

+1

500 - это серверный код. вы посмотрели, что находится в журнале ошибок веб-сервера? –

+1

@MarcB: LWP генерирует такие 500 кодов самостоятельно по ошибкам, чтобы упаковать ошибку в действительный HTTP-ответ. –

+0

гул .... Сообщения LWP обычно длиннее. – ikegami

ответ

2
DEBUG: .../IO/Socket/SSL.pm:392: Net::SSLeay::connect -> 0 
DEBUG: .../IO/Socket/SSL.pm:440: connection failed - connect returned 0 
DEBUG: .../IO/Socket/SSL.pm:1276: SSL connect attempt failed because of handshake problemserror:00000000:lib(0):func(0):reason(0) 

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

Same HTTP call through curl works fine.

Если это действительно HTTP вызов (т.е. не HTTPS) вы с завитком, чем ваша проблема в том, что сервер ожидает HTTP без SSL, но ваш код с LWP использует HTTP с SSL (HTTPS). Но если вызов HTTPS с завихрением преуспевает, вы можете отладить проблему, сделав захват пакетов успешным вызовом с завитом и неудачным с LWP и сравните рукопожатия.

I have tried various SSL_versions string tlsv12, tslv1.2, TSLv1, TLSv12, TLS, etc. to no avail.

С текущими версиями IO :: Socket :: SSL будет принимать TLSv12 и TLSv1_2 для TLS 1.2 и TLSv1 для TLS 1. *, регистр не имеет значения. Указание только «TLS» вызовет критический анализ IO :: Socket :: SSL. Старые версии IO :: Socket :: SSL (до версии 1.70 с 2012 года) просто игнорировали недопустимые настройки. См. Также документацию, описывающую настройки.

Смежные вопросы