Question

J'essaie d'utiliser un serveur CAS existant pour authentifier la connexion à un script Web Perl CGI et j'utilise le AuthCAS Module Perl (version 1.3.1).Je peux me connecter au serveur CAS pour obtenir le ticket de service mais lorsque j'essaie de me connecter pour valider le ticket, mon script renvoie l'erreur suivante du IO :: Socket :: SSL module:

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

Symptômes/Tests :

  1. Si je tape l'URL générée pour l'authentification dans la barre d'adresse du navigateur Web, elle renvoie très bien l'extrait XML attendu.Ce n'est donc pas un mauvais nom d'hôte.
  2. Si je génère un script sans utiliser le module AuthCAS mais en utilisant le module IO::Socket::SSL directement pour interroger le serveur CAS pour validation sur le ticket de service généré, le script Perl s'exécutera correctement à partir de la ligne de commande mais pas dans le navigateur.
  3. Si j'ajoute le module AuthCAS dans le script au point 2, le script ne fonctionne plus sur la ligne de commande et ne fonctionne toujours pas dans le navigateur.

Voici le script simple qui produit l'erreur :

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

Avez-vous des idées sur l'endroit où pourrait se situer le conflit ?


L'erreur vient de la ligne directement au-dessus de l'extrait cité par Cebjyre, à savoir

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

à savoir la création de socket.Tous les paramètres d'entrée sont corrects.J'avais édité le module pour insérer des instructions de débogage et imprimer tous les paramètres juste avant cet appel et tout va bien.On dirait que je vais devoir approfondir le module IO::Socket::SSL.

Était-ce utile?

La solution

Comme cela arrive généralement lorsque je pose des questions comme celle-ci, j'ai trouvé le problème.Il s'avère que Crypte ::SSLeay Le module n'était pas installé ou du moins pas à jour.Bien sûr, les messages d'erreur ne m'ont donné aucun indice.En le mettant à jour, tous les problèmes disparaissent et tout fonctionne bien maintenant.

Autres conseils

Eh bien, du source du module il semble que l'erreur IO::Socket provienne 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;
}
[...]

qui est appelé par callCAS, qui est appelé par validateST.

Une option consiste à modifier temporairement le fichier du module pour y insérer des instructions de débogage si vous le pouvez, mais si je devais deviner, je dirais que le casUrl que vous fournissez ne correspond pas correctement à l'expression régulière _parse_url - peut-être que vous en avez trois. des barres obliques après le https ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top