为什么我无法使用 Perl 的 AuthCAS 连接到我的 CAS 服务器?
-
09-06-2019 - |
题
我正在尝试使用现有的 CAS 服务器来验证 Perl CGI Web 脚本的登录,并且正在使用 验证CAS Perl 模块(v 1.3.1)。我可以连接到 CAS 服务器来获取服务票证,但是当我尝试连接以验证票证时,我的脚本返回以下错误 IO::套接字::SSL 模块:
500 Can't connect to [CAS Server]:443 (Bad hostname '[CAS Server]')
([CAS Server] substituted for real server name)
症状/测试:
- 如果我将生成的身份验证 URL 输入到 Web 浏览器的位置栏中,它会正常返回预期的 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 模块。
解决方案
正如我发布此类问题时通常会发生的那样,我发现了问题。事实证明 地穴::SSLeay 模块未安装或至少不是最新的。当然,错误消息没有给我任何线索。更新它,所有问题都消失了,现在一切正常。
其他提示
嗯,从 模块源码 看起来 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 后面有斜杠吗?
不隶属于 StackOverflow