当前位置:首页> 正文

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

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

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

我正在尝试使用现有的CAS服务器来验证Perl CGI Web脚本的登录,并且正在使用AuthCAS Perl模块(v 1.3.1)。我可以连接到CAS服务器以获取服务票证,但是当我尝试连接以验证票证时,我的脚本从IO :: Socket :: SSL模块:

返回以下错误

1
2
 500 Can't connect to [CAS Server]:443 (Bad hostname '[CAS Server]')
 ([CAS Server] substituted for real server name)

症状/测试:

  • 如果我在网络浏览器的位置栏中键入用于身份验证的生成的URL,它将返回正确的预期XML片段。因此,它不是一个不好的主机名。
  • 如果我在不使用AuthCAS模块的情况下生成脚本,而是直接使用IO :: Socket :: SSL模块来查询CAS服务器以对生成的服务凭单进行验证,则Perl脚本可以从命令行(而不是浏览器)正常运行。
  • 如果我将AuthCAS模块添加到第2项中的脚本中,则该脚本将不再在命令行上运行,并且仍然无法在浏览器中运行。
  • 这是产生错误的准系统脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/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\
    \
    "
    ;
        exit 0;
    } else {
        print $q->header();
        print"CAS TEST\
    "
    ;

        ## When coming back from the CAS server a ticket is provided in the QUERY_STRING
        print"QUERY_STRING =" . $id ."</br>\
    "
    ;
        ## $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\
    "
    , &AuthCAS::get_errors() unless (defined $user);
    }

    关于冲突可能在何处的任何想法?

    错误来自片段Cebjyre正上方的行,即

    1
    $ssl_socket = new IO::Socket::SSL(%ssl_options);

    即套接字创建。所有输入参数均正确。我已经编辑了该模块,以放入调试语句并在该调用之前打印出所有参数,它们都很好。看来我将不得不更深入地研究IO :: Socket :: SSL模块。


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


    好吧,从模块源看,IO :: Socket错误似乎来自get_https2

    1
    2
    3
    4
    5
    6
    7
    [...]
    unless ($ssl_socket) {
        $errors = sprintf"error %s unable to connect https://%s:%s/\
    "
    ,&IO::Socket::SSL::errstr,$host,$port;
        return undef;
    }
    [...]

    由callCAS调用,由validateST调用。

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


    展开全文阅读

    相关内容