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

Я пытаюсь использовать существующий сервер 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)

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

  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);

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 915
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Не редактируйте исходный код модуля. Скопируйте файл в новый каталог, поместите этот каталог перед @INC, а затем выполните отладку. Таким образом, вы не нарушите оригинал и, возможно, нарушите другие функции, зависящие от модуля.

brian d foy 30.09.2008 10:27
Ответ принят как подходящий

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

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