2

既存の CAS サーバーを使用して Perl CGI Web スクリプトのログインを認証しようとしており、AuthCAS Perl モジュール (v 1.3.1) を使用しています。CAS サーバーに接続してサービス チケットを取得できますが、チケットを検証するために接続しようとすると、IO::Socket::SSLモジュールから次のエラーが返されます。

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

症状/テスト:

  1. 認証用に生成された URL を Web ブラウザのロケーション バーに入力すると、予想される XML スニペットが正常に返されます。したがって、これは悪いホスト名ではありません。
  2. AuthCAS モジュールを使用せずにスクリプトを生成し、IO::Socket::SSL モジュールを直接使用して、生成されたサービス チケットの検証のために CAS サーバーにクエリを実行すると、Perl スクリプトはコマンド ラインから正常に実行されますが、ブラウザーでは実行されません。
  3. 項目 2 のスクリプトに AuthCAS モジュールを追加すると、スクリプトはコマンド ラインで機能しなくなり、ブラウザーでも機能しなくなります。

エラーを生成する必要最小限のスクリプトは次のとおりです。

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

競合がどこにあるのかについてのアイデアはありますか?


エラーは、引用されたスニペット Cebjyre のすぐ上の行から発生しています。

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

つまり、ソケットの作成です。すべての入力パラメーターが正しい。モジュールを編集して、デバッグ ステートメントを挿入し、その呼び出しの直前にすべてのパラメーターを出力しましたが、すべて問題ありません。IO::Socket::SSL モジュールをさらに深く掘り下げる必要があるようです。

4

2 に答える 2

3

このような質問を投稿するとよくあることですが、問題が見つかりました。Crypt::SSLeayモジュールがインストールされていないか、少なくとも最新ではないことが判明しました。もちろん、エラーメッセージからは何の手がかりも得られませんでした。それを更新すると、すべての問題がなくなり、現在は正常に機能しています。

于 2008-08-27T16:01:30.737 に答える
-1

モジュール ソースからは、IO::Socket エラーが get_https2 から発生しているように見えます。

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

これは、validateST によって呼び出される callCAS によって呼び出されます。

1つのオプションは、モジュールファイルを一時的に編集して、可能であればいくつかのデバッグステートメントを入れることですが、推測する必要がある場合は、提供しているcasUrlが_parse_url正規表現と適切に一致していないと思います-おそらく3つありますhttpsの後のスラッシュ?

于 2008-08-26T09:07:48.100 に答える