2008-08-25 16 views
2

Ich versuche, einen vorhandenen CAS-Server zu verwenden, um die Anmeldung für ein Perl CGI-Webskript zu authentifizieren, und verwende das AuthCAS Perl-Modul (v 1.3.1). Ich kann mit dem CAS-Server verbinden, um das Service-Ticket zu bekommen, aber wenn ich versuche verbinden das Ticket meines Skript aus dem IO::Socket::SSL Modul mit dem folgenden Fehler zurück zu überprüfen:Warum kann ich keine Verbindung mit meinem CAS-Server mit Perls AuthCAS herstellen?

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

Symptome/Tests:

  1. Wenn ich die generierte URL für die Authentifizierung in die Adressleiste des Webbrowsers eintippe, wird das erwartete XML-Snippet zurückgegeben. Es ist also kein schlechter Hostname.
  2. Wenn ich ein Skript ohne Verwendung des AuthCAS-Moduls erzeuge, aber das IO :: Socket :: SSL-Modul direkt verwende, um den CAS-Server zur Überprüfung auf dem generierten Serviceticket abzufragen, läuft das Perl-Skript von der Befehlszeile aus, aber nicht in der Browser.
  3. Wenn ich das AuthCAS-Modul in das Skript in Punkt 2 hinzufüge, funktioniert das Skript nicht mehr in der Befehlszeile und funktioniert immer noch nicht im Browser.

Hier ist die nackte Knochen-Skript, das den Fehler erzeugt:

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

Irgendwelche Ideen auf, wo der Konflikt sein könnte?


die Fehler aus der Leitung kommen, direkt über dem Schnipsel Cebjyre nämlich

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

nämlich die Schaffung Buchse. Alle Eingabeparameter sind korrekt. Ich hatte das Modul bearbeitet, um Debug-Anweisungen einzufügen und alle Parameter kurz vor diesem Aufruf auszudrucken, und es geht ihnen allen gut. Sieht so aus, als müsste ich tiefer in das IO :: Socket :: SSL-Modul eintauchen.

Antwort

3

Wie normalerweise passiert, wenn ich Fragen wie diese posten, fand ich das Problem. Es stellt sich heraus, Crypt::SSLeay Modul wurde nicht installiert oder zumindest nicht auf dem neuesten Stand. Die Fehlermeldungen haben mir natürlich keine Hinweise gegeben. Aktualisierung und alle Probleme verschwinden und die Dinge funktionieren jetzt gut.

-1

Nun, aus dem module source sieht es so aus, dass IO :: Socket Fehler von get_https2 kommt

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

, die von callCAS genannt wird, die durch validateST genannt wird.

Eine Möglichkeit besteht darin, die Moduldatei vorübergehend zu bearbeiten, um einige Debug-Anweisungen einzufügen, wenn Sie können, aber wenn ich raten müsste, würde ich sagen, die CasUrl, die Sie liefern, stimmt nicht mit der _parse_url-Regex überein - vielleicht hast du drei Schrägstriche nach dem https?

+0

Die ursprüngliche Modulquelle nicht bearbeiten. Kopieren Sie die Datei in ein neues Verzeichnis, legen Sie das Verzeichnis an der Vorderseite von @INC ab und führen Sie dann das Debugging durch. Auf diese Weise stören Sie das Original nicht und brechen möglicherweise andere Dinge, die vom Modul abhängen. –