Pergunta

Estou tentando usar um servidor CAS existente para autenticar o login de um script da web Perl CGI e estou usando o AuthCAS Módulo Perl (v 1.3.1).Posso me conectar ao servidor CAS para obter o ticket de serviço, mas quando tento me conectar para validar o ticket, meu script retorna com o seguinte erro do E/S::Soquete::SSL módulo:

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

Sintomas/Testes:

  1. Se eu digitar o URL gerado para a autenticação na barra de localização do navegador da web, ele retornará perfeitamente com o snippet XML esperado.Portanto, não é um nome de host ruim.
  2. Se eu gerar um script sem usar o módulo AuthCAS, mas usando o módulo IO::Socket::SSL diretamente para consultar o servidor CAS para validação no tíquete de serviço gerado, o script Perl será executado corretamente na linha de comando, mas não no navegador.
  3. Se eu adicionar o módulo AuthCAS ao script do item 2, o script não funciona mais na linha de comando e ainda não funciona no navegador.

Aqui está o script básico que produz o erro:

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

Alguma ideia sobre onde pode estar o conflito?


O erro vem da linha diretamente acima do trecho citado por Cebjyre, a saber

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

ou seja, a criação do soquete.Todos os parâmetros de entrada estão corretos.Eu editei o módulo para inserir instruções de depuração e imprimir todos os parâmetros antes da chamada e estão todos bem.Parece que terei que me aprofundar no módulo IO::Socket::SSL.

Foi útil?

Solução

Como geralmente acontece quando posto perguntas como essa, encontrei o problema.Acontece que Cripta::SSLeay O módulo não foi instalado ou pelo menos não está atualizado.É claro que as mensagens de erro não me deram nenhuma pista.Atualizá-lo e todos os problemas desaparecerão e as coisas estão funcionando bem agora.

Outras dicas

Bem, do fonte do módulo parece que o erro IO::Socket vem 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 é chamado por callCAS, que é chamado por validST.

Uma opção é editar temporariamente o arquivo do módulo para inserir algumas instruções de depuração, se possível, mas se eu tivesse que adivinhar, diria que o casUrl que você está fornecendo não corresponde corretamente ao regex _parse_url - talvez você tenha três barras após o https?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top