Pregunta

Estoy intentando utilizar un servidor CAS existente para autenticar el inicio de sesión para un script web Perl CGI y estoy usando el AuthCAS Módulo Perl (v 1.3.1).Puedo conectarme al servidor CAS para obtener el ticket de servicio, pero cuando intento conectarme para validar el ticket, mi secuencia de comandos devuelve el siguiente error del E/S::Socket::SSL módulo:

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

Síntomas/Pruebas:

  1. Si escribo la URL generada para la autenticación en la barra de ubicación del navegador web, el resultado es correcto con el fragmento XML esperado.Entonces no es un mal nombre de host.
  2. Si genero un script sin usar el módulo AuthCAS pero usando el módulo IO::Socket::SSL directamente para consultar al servidor CAS para la validación del ticket de servicio generado, el script Perl se ejecutará bien desde la línea de comando pero no en el navegador.
  3. Si agrego el módulo AuthCAS al script del elemento 2, el script ya no funciona en la línea de comando y aún no funciona en el navegador.

Aquí está el script básico que produce el error:

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

¿Alguna idea sobre dónde podría estar el conflicto?


El error proviene de la línea directamente encima del fragmento citado por Cebjyre, a saber

$ssl_socket = new IO::Socket::SSL(%ssl_options);

es decir, la creación del socket.Todos los parámetros de entrada son correctos.Edité el módulo para incluir declaraciones de depuración e imprimir todos los parámetros justo antes de esa llamada y todos están bien.Parece que voy a tener que profundizar más en el módulo IO::Socket::SSL.

¿Fue útil?

Solución

Como suele ocurrir cuando publico preguntas como esta, encontré el problema.Resulta que Cripta::SSLeay El módulo no estaba instalado o al menos no estaba actualizado.Por supuesto, los mensajes de error no me dieron ninguna pista.Al actualizarlo, todos los problemas desaparecen y todo funciona bien ahora.

Otros consejos

Bueno, desde el fuente del módulo parece que el error IO::Socket proviene de get_https2

[...]
unless ($ssl_socket) {
    $errors = sprintf "error %s unable to connect https://%s:%s/\n",&IO::Socket::SSL::errstr,$host,$port;
    return undef;
}
[...]

que se llama mediante callCAS, que se llama mediante validarST.

Una opción es editar temporalmente el archivo del módulo para incluir algunas declaraciones de depuración si puede, pero si tuviera que adivinar, diría que el casUrl que está proporcionando no coincide correctamente con la expresión regular _parse_url; tal vez tenga tres ¿barras después de https?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top