لماذا لا يمكنني الاتصال بخادم CAS الخاص بي باستخدام Perl's AuthCAS؟

StackOverflow https://stackoverflow.com/questions/26842

سؤال

أحاول استخدام خادم 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)

الأعراض / الاختبارات:

  1. إذا قمت بكتابة عنوان 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.

هل كانت مفيدة؟

المحلول

كما يحدث عادةً عندما أنشر أسئلة كهذه، وجدت المشكلة.اتضح سرداب::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؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top