Por que não consigo me conectar ao meu servidor CAS com o AuthCAS do Perl?
-
09-06-2019 - |
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:
- 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.
- 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.
- 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.
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?