2014-11-25 5 views
1

У меня есть скрипт Perl, который действует как веб-сервис для других скриптов Perl, работающих под одним и тем же доменом. Недавно я создал новый SSL-сертификат (AlphaSSL) для этого домена и установил его на сервере, и он отлично отображается при доступе к сайту с использованием https.Ошибка SSL-вызова веб-службы Perl через https с использованием LWP

Однако теперь, когда клиентский скрипт вызывает веб-службу с использованием htttps через LWP, выдается сообщение об ошибке, если раньше это не было. Код для вызова веб-службы выглядит следующим образом:

$useragent = LWP::UserAgent->new(); 
$useragent->agent("someagentid"); 
$postdata = { 
    'action' => $apiaction, 
    'xauth' => $REQUEST_AUTH_KEY, 
}; 
$response = $useragent->post($BILLING_INFO_GATEWAY, $postdata); 

Шлюз в пост является https: URL для сценария веб-службы под управлением одной и той же области.

Ошибка он производит:

500 Can't connect to xxxxx.com:443 (certificate verify failed) 
Content-Type: text/plain 
Client-Date: Tue, 25 Nov 2014 01:52:20 GMT Client-Warning: Internal response 
Can't connect to xxxxx.com:443 (certificate verify failed) 
LWP::Protocol::https::Socket: SSL connect attempt failed with unknown error 
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify 
failed at /usr/perl/lib/site_perl/5.10.1/LWP/Protocol/http.pm line 49. 

Если добавить:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 

то ошибка уходит, но защищенное соединение кажется менее безопасным.

Я расположен каталог сертификат на моем сервере, который/SSL/сертификаты /, который имеет один файл .crt в нем, так что я попробовал, добавив:

$ENV{HTTPS_CA_PATH} = '/ssl/certs'; 

, но я все еще получаю ошибку. Я также попытался:

$ENV{HTTPS_CA_FILE} = '/ssl/certs/xxxxxxxxxx.cabundle'; 

после копирования файла CA расслоения в ту же папку (там не было ни одного файла расслоения там ранее). Эта папка содержит .crt файл, который уже существовал там после установки сертификата через WHM/Cpanel.)

Я также попытался указать только переменную окружения HTTPS_CA_FILE без переменной HTTPS_CA_PATH, но не повезло. Тем не менее ошибка сохраняется.

Любые идеи о том, что мне может не хватать либо в коде, либо на сервере, чтобы сценарий мог успешно проверить имя хоста? Это выделенный веб-сервер под управлением Linux и cPanel.

Спасибо!

ответ

1

Если он работает в браузере, но не в скрипте LWP, это может быть связано с отсутствием промежуточных сертификатов. Браузер часто получает эти промежуточные сертификаты от более ранних SSL-подключений и кэширует их, но скрипты обычно этого не делают. Вы можете проверить это, если вы проверите хост с SSLLabs и следите за «Chain Issues».

Если это не проблема, предоставьте версии модулей, которые вы используете, а также URL-адрес хоста, к которому вы пытаетесь связаться. Чтобы получить версии:

#!/usr/bin/perl 
for (qw(LWP::UserAgent LWP::Protocol::https IO::Socket::SSL)) { 
    eval "require $_; warn '$_: '.$_->VERSION"; 
} 
+0

Я считаю, что у вас это есть. Позднее я заметил, что Firefox не понравился SSL-сертификат, хотя Chrome, IE и Safari. FF жаловался на цепочку доверия. Я пытался переустановить сертификат несколько раз с помощью пакета CA Bundle, предоставленного GlobalSign и AlphaSSL, и в конечном итоге передал его моим администраторам на сервере. Они сказали, что просто переустановили сертификат, и теперь ему нравится FF. Я только что вернулся и проверил этот скрипт и установил $ ENV {PERL_LWP_SSL_VERIFY_HOSTNAME} = 1, и теперь он работает отлично. :) – vdawg

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

  • Нет связанных вопросов^_^