لماذا لا يمكنني الاتصال بخادم CAS الخاص بي باستخدام Perl's AuthCAS؟
-
09-06-2019 - |
سؤال
أحاول استخدام خادم CAS موجود لمصادقة تسجيل الدخول لبرنامج نصي ويب Perl CGI وأستخدم AuthCAS وحدة بيرل (الإصدار 1.3.1).يمكنني الاتصال بخادم CAS للحصول على تذكرة الخدمة ولكن عندما أحاول الاتصال للتحقق من صحة التذكرة، يعود البرنامج النصي الخاص بي مع الخطأ التالي من الإدخال::المقبس::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.
المحلول
كما يحدث عادةً عندما أنشر أسئلة كهذه، وجدت المشكلة.اتضح سرداب::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 الذي تقدمه لا يتطابق مع regex _parse_url بشكل صحيح - ربما لديك ثلاثة مائلة بعد https؟