代码之家  ›  专栏  ›  技术社区  ›  dagorym

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

  •  2
  • dagorym  · 技术社区  · 17 年前

    我正在尝试使用现有的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模块。

    2 回复  |  直到 17 年前
        1
  •  3
  •   brian d foy    15 年前

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

        2
  •  -1
  •   Cebjyre    17 年前

    嗯,从 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 regex不匹配-可能在https后面有三个斜杠?