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

时间:2020-03-05 18:43:00  来源:igfitidea点击:

我试图使用现有的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)

症状/测试:

  • 如果我在网络浏览器的位置栏中键入用于身份验证的生成的URL,它将返回正确的预期XML片段。因此,它不是一个不好的主机名。
  • 如果我在不使用AuthCAS模块的情况下生成脚本,而是直接使用IO :: Socket :: SSL模块来查询CAS服务器以对生成的服务票证进行验证,则Perl脚本可以在命令行上正常运行,但不能在浏览器中运行。
  • 如果我将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模块。

解决方案

回答

好吧,从模块源看,似乎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之后?

回答

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