为什么我不能使用 Perl 的 AuthCAS 连接到我的 CAS 服务器?

Why can't I connect to my CAS server with Perl's AuthCAS?

提问人:dagorym 提问时间:8/26/2008 最后编辑:Tim Postdagorym 更新时间:11/21/2011 访问量:2036

问:

我正在尝试使用现有的 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. 如果我在 Web 浏览器的位置栏中键入生成的身份验证 URL,它会返回预期的 XML 代码段。所以它不是一个糟糕的主机名。
  2. 如果我在不使用 AuthCAS 模块的情况下生成脚本,而是直接使用 IO::Socket::SSL 模块查询 CAS 服务器以验证生成的服务票证,则 Perl 脚本将从命令行正常运行,但不能在浏览器中运行。
  3. 如果我将 AuthCAS 模块添加到第 2 项的脚本中,则该脚本不再在命令行上工作,并且在浏览器中仍然不起作用。

以下是产生错误的准脚本:

#!/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模块。

Perl Apache 身份验证 SSL CGI

评论


答:

-1赞 Cebjyre 8/26/2008 #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;
}
[...]

它由 callCAS 调用,后者由 validateST 调用。

如果可以的话,一种选择是临时编辑模块文件以放入一些调试语句,但如果我不得不猜测,我会说您提供的 casUrl 与_parse_url正则表达式没有正确匹配 - 也许您在 https 之后有三个斜杠?

评论

0赞 brian d foy 9/30/2008
不要编辑原始模块源。将文件复制到新目录,将该目录放在@INC的前面,然后进行调试。这样你就不会打扰原来的东西,可能会破坏依赖于模块的其他东西。
3赞 dagorym 8/28/2008 #2

就像我发布这样的问题时通常发生的那样,我发现了问题所在。事实证明,Crypt::SSLeay 模块未安装或至少不是最新的。当然,错误消息没有给我任何线索。更新它,所有问题都消失了,现在一切正常。