Почему я не могу подключиться к своему CAS-серверу с помощью Perl AuthCAS?

StackOverflow https://stackoverflow.com/questions/26842

Вопрос

Я пытаюсь использовать существующий сервер CAS для аутентификации входа в систему для веб-скрипта Perl CGI и использую Авторизации Модуль Perl (версия 1.3.1).Я могу подключиться к серверу CAS, чтобы получить служебный билет, но когда я пытаюсь подключиться для проверки билета, мой скрипт возвращает следующую ошибку из IO::Сокет::SSL модуль:

 500 Can't connect to [CAS Server]:443 (Bad hostname '[CAS Server]') 
 ([CAS Server] substituted for real server name)

Симптомы/Тесты:

  1. Если я ввожу сгенерированный URL-адрес для аутентификации в строку местоположения веб-браузера, он возвращает только ожидаемый фрагмент XML.Так что это неплохое имя хоста.
  2. Если я сгенерирую скрипт без использования модуля AuthCAS, но используя модуль IO:: Socket :: SSL напрямую для запроса сервера CAS для проверки сгенерированного билета на службу, сценарий Perl будет нормально выполняться из командной строки, но не в браузере.
  3. Если я добавлю модуль AuthCAS в скрипт в пункте 2, скрипт больше не будет работать в командной строке и по-прежнему не будет работать в браузере.

Вот простой скрипт, который выдает ошибку:

#!/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);

а именно создание сокета.Все входные параметры верны.Я отредактировал модуль, чтобы ввести инструкции отладки и распечатать все параметры непосредственно перед этим вызовом, и все они в порядке.Похоже, мне придется глубже погрузиться в модуль ввода-вывода :: Socket:: SSL.

Это было полезно?

Решение

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

Другие советы

Ну, с самого начала источник модуля похоже, что ошибка ввода-вывода::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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top