Perl の AuthCAS を使用して CAS サーバーに接続できないのはなぜですか?
-
09-06-2019 - |
質問
既存の 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)
症状/検査:
- 認証用に生成された 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 モジュールをさらに深く掘り下げる必要があるようです。
解決
このような質問を投稿するとよくあることですが、問題が見つかりました。判明したのは、 クリプト::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の後のスラッシュは?