既存の 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)
症状/テスト:
- 認証用に生成された URL を Web ブラウザのロケーション バーに入力すると、予想される XML スニペットが正常に返されます。したがって、これは悪いホスト名ではありません。
- AuthCAS モジュールを使用せずにスクリプトを生成し、IO::Socket::SSL モジュールを直接使用して、生成されたサービス チケットの検証のために CAS サーバーにクエリを実行すると、Perl スクリプトはコマンド ラインから正常に実行されますが、ブラウザーでは実行されません。
- 項目 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 モジュールをさらに深く掘り下げる必要があるようです。