Perl の AuthCAS を使用して CAS サーバーに接続できないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/26842

質問

既存の CAS サーバーを使用して Perl CGI Web スクリプトのログインを認証しようとしていますが、 AuthCAS Perl モジュール (v 1.3.1)。CAS サーバーに接続してサービス チケットを取得できますが、チケットを検証するために接続しようとすると、スクリプトが次のエラーを返します。 IO::ソケット::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 モジュールをさらに深く掘り下げる必要があるようです。

役に立ちましたか?

解決

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

他のヒント

さて、から モジュールソース 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;
}
[...]

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top