2008-08-25 3 views
2

나는 기존의 CAS 서버를 사용하여 Perl CGI 웹 스크립트에 대한 로그인을 인증하려고 시도 중이고 AuthCAS Perl 모듈 (v 1.3.1)을 사용하고 있습니다. 나는 서비스 티켓을 얻기 위해 CAS 서버에 연결할 수 있지만 내가하려고 할 때 내 스크립트가 IO::Socket::SSL 모듈에서 다음 오류를 반환 티켓의 유효성을 검사하는 연결 :왜 Perl의 AuthCAS를 사용하여 CAS 서버에 연결할 수 없습니까?

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 모듈에 대해 더 깊이 들어가야 할 것 같습니다. 그 IO :: 소켓 오류가 validateST에 의해 호출 callCAS에 의해 호출 get_https2

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

에서 오는 것처럼

답변

3

이렇게 질문을 올리면 일반적으로 문제가 발견되었습니다. Crypt::SSLeay 모듈이 설치되지 않았거나 적어도 최신이 아닙니다. 물론 오류 메시지는 나에게 단서를주지 못했습니다. 그것을 업데이트하면 모든 문제가 사라지고 모든 것이 잘 작동합니다.

-1

음은 module source에서 보인다.

하나의 옵션은 가능한 경우 디버그 문을 넣기 위해 모듈 파일을 일시적으로 편집하는 것입니다.하지만 내가 추측해야만한다면, 제공하는 casUrl이 _parse_url 정규식과 제대로 일치하지 않는다고 말할 수 있습니다. https 다음에 세 개의 슬래시가 있습니까?

+0

원본 모듈 원본을 편집하지 마십시오. 파일을 새 디렉토리에 복사하고 해당 디렉토리를 @INC 앞에 놓은 다음 디버깅을 수행하십시오. 그렇게하면 원래 모듈을 방해하지 않고 모듈에 의존하는 다른 것들을 무력화 할 수 있습니다. –

관련 문제