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

时间:2008-08-25 20:45:33

标签: perl apache authentication ssl cgi

我正在尝试使用现有的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. 如果我将AuthCAS模块添加到第2项的脚本中,则该脚本将不再适用于命令行,仍然无法在浏览器中运行。
  4. 以下是产生错误的简单脚本:

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

2 个答案:

答案 0 :(得分:3)

正如我经常发布这样的问题时,我发现了问题。事实证明Crypt::SSLeay模块没有安装或至少没有更新。当然错误信息没有给我任何线索。更新它和所有问题都会消失,现在情况正常。

答案 1 :(得分:-1)

好吧,从module source来看,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后你有三个斜杠?