Я пытаюсь использовать существующий сервер CAS для аутентификации входа в систему для веб-скрипта Perl CGI и использую модуль Perl AuthCAS (v 1.3.1). Я могу подключиться к серверу CAS, чтобы получить билет службы, но когда я пытаюсь подключиться для проверки билета, мой скрипт возвращается со следующей ошибкой из модуля IO :: Socket :: SSL:
500 Can't connect to [CAS Server]:443 (Bad hostname '[CAS Server]')
([CAS Server] substituted for real server name)
Симптомы / тесты:
Вот простой скрипт, вызывающий ошибку:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use AuthCAS;
use CGI::Carp qw( fatalsToBrowser );
my $id = $ENV{QUERY_STRING};
my $q = new CGI;
my $target = "http://localhost/cgi-bin/testCAS.cgi";
my $cas = new AuthCAS(casUrl => 'https://cas_server/cas');
if ($id eq ""){
my $login_url = $cas->getServerLoginURL($target);
printf "Location: $login_url\n\n";
exit 0;
} else {
print $q->header();
print "CAS TEST<br>\n";
## When coming back from the CAS server a ticket is provided in the QUERY_STRING
print "QUERY_STRING = " . $id . "</br>\n";
## $ST should contain the received Service Ticket
my $ST = $q->param('ticket');
my $user = $cas->validateST($target, $ST); #### This is what fails
printf "Error: %s\n", &AuthCAS::get_errors() unless (defined $user);
}
Есть идеи о том, где может быть конфликт?
Ошибка исходит из строки непосредственно над цитируемым фрагментом Cebjyre, а именно
$ssl_socket = new IO::Socket::SSL(%ssl_options);
а именно создание сокета. Все входные параметры верны. Я отредактировал модуль, чтобы вставить операторы отладки и распечатать все параметры непосредственно перед этим вызовом, и все они в порядке. Похоже, мне придется глубже погрузиться в модуль IO :: Socket :: SSL.





Ну, из источник модуля похоже, что ошибка IO :: Socket исходит из get_https2
[...]
unless ($ssl_socket) {
$errors = sprintf "error %s unable to connect https://%s:%s/\n",&IO::Socket::SSL::errstr,$host,$port;
return undef;
}
[...]
который вызывается callCAS, который вызывается validateST.
Один из вариантов - временно отредактировать файл модуля, чтобы добавить некоторые операторы отладки, если вы можете, но если бы мне пришлось угадывать, я бы сказал, что предоставляемый вами casUrl не соответствует регулярному выражению _parse_url должным образом - возможно, у вас есть три слэши после https?
Как обычно бывает, когда я задаю подобные вопросы, я нашел проблему. Оказывается, модуль Крипта :: SSLeay не был установлен или, по крайней мере, не обновлен. Конечно, сообщения об ошибках не дали мне никаких подсказок. Обновив его, все проблемы исчезнут, и теперь все работает нормально.
Не редактируйте исходный код модуля. Скопируйте файл в новый каталог, поместите этот каталог перед @INC, а затем выполните отладку. Таким образом, вы не нарушите оригинал и, возможно, нарушите другие функции, зависящие от модуля.