2012-04-02 5 views
0

comp.lang.python에 연락하여이 문제와 관련된 아이디어가 있는지 확인했습니다. 나는 메일 링리스트에 아무런 응답을받지 못했기 때문에 여기로 도달하기로 결정했다.Python M2Crypto.SSL.Checker.NoCertificate 예외

나는 M2Crypto 모듈과 이상한 버크가 있는데 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다. 나는 동료와 협력하여 표준 도구를 통해 얻은 IPv4 주소 목록에서 SSL 인증서를 확인하는 내부 도구를 개발하고 있습니다.

우리는 M2Crypto를 사용하여 인증서의 유효성을 검사합니다. 하나의 IPv4 주소 만 확인하면 올바른 인증서를 제공 할 수 있으며 SSL 인증서에 포함 된 정보에 대한 유효성 검사를 수행 할 수 있습니다.

그러나 여러 개의 IPv4 주소를 확인하려고하면 "M2Crypto.SSL.Checker.NoCertificate"가 수신됩니다. 우리가 이것을 받아야 할 경우가 있습니다. 그러나 두 번째 또는 세 번째 IPv4 주소가 무엇이든 관계없이 (첫 번째로 양호한 것으로 테스트 된 경우에도) 실패합니다.

컨텍스트 생성 :

global context 

    context = M2Crypto.SSL.Context() 
    if sys.platform.startswith('linux'): 
      context.load_verify_info(capath="/etc/ssl/certs/") 
    elif sys.platform.startswith('darwin'): 
      context.load_verify_info(cafile=certfile) 
    else: 
      print "Unknown platform, bail!" 
      exit(1) 
    context.set_allow_unknown_ca(True) 
    context.set_verify(M2Crypto.SSL.verify_none,9) 

소켓의 작성 : 코드

conn = M2Crypto.SSL.Connection(context) 
    socket.setdefaulttimeout(2.0) 
    conn.set_socket_read_timeout(M2Crypto.SSL.timeout(sec=2)) 
    conn.set_socket_write_timeout(M2Crypto.SSL.timeout(sec=2)) 

    try: 
      conn.connect((ip,443)) 
    # we can the catch the exception here, but it shouldn't be failing 

상기 두 부분은 자신의 기능에 존재한다. 컨텍스트는 모든 연결에 전역 적으로 사용되므로 컨텍스트 생성은 한 번만 호출됩니다. 처음에는 이것이 문제일지도 모른다고 생각하고 변경없이 각 루프에서 컨텍스트를 만들도록 시도했습니다.

후자의 블록은 주소 배열을 통해 루프의 일부로 호출됩니다. IP는 호출자로부터 전달됩니다.

- 팀

답변

0

나는 당신이 단지 하나의 인증서를 확인, 대신 당신이 당신의 CERT-저장소에 설치 "을/etc/SSL/인증서 표시 /"한 경우에만 인증서를 확인 아니에요 확신 ... 물어 봐도 그래서 주위에 파고 후

http://www.madboa.com/geek/openssl/#verify-new

+0

- 팀./etc/ssl/certs의 '.pem'파일을 사용하여 신뢰할 수있는 CA를 판별 한 후 이들에 대해 유효성을 검사합니다. 데비안에서 파생 된 배포판에는 '/ etc/ssl/certs'에 여러 개의 .pem 파일이 있습니다. Mac OS X 시스템에서도 Mozilla의 신뢰할 수있는 CA에서 생성 된 단일 파일을 사용하여 동일한 문제가 발생합니다. – theckman

+0

Python ssl 라이브러리는 OpenSSL 위에 구축되었습니다. 수동으로 인증서를 확인하여 인증서 저장소가 올바르게 구성되었는지 확인하십시오./etc/ssl/certs가 올바르게 작동하는 것은 어려운 일일 수 있습니다. "OpenSSL 확인"을 사용하여 인증서를 확인할 수 있습니다. http://www.madboa.com/geek/openssl/#verify-standard – user590028

+0

인증서 저장소는 여기에서 문제가되지 않습니다. 하나의 IP를 검사 할 때 제대로 검증됩니다. 그것은 연결하고 우리의 유효성 체크가 작동합니다. 후속 호스트에서 인증서를 가져 오기 위해 연결할 때 NoCertificate 예외가 발생합니다. 연결하는 동안 서버에서 인증서를받지 못한다고 생각하게됩니다. OpenSSL은 또한 상점이 유효한지 확인합니다. 추적 기록 : http://paste.pocoo.org/show/575594/ – theckman

0

은 제한 시간 (들)이 문제를 일으키는 설정 밝혀졌습니다. 다음 코드를 제거하고 완벽하게 작동하기 시작했습니다.

socket.setdefaulttimeout(2.0) 
conn.set_socket_read_timeout(M2Crypto.SSL.timeout(sec=2)) 
conn.set_socket_write_timeout(M2Crypto.SSL.timeout(sec=2)) 

그것은 다른 시스템에서 호스팅되는 웹 서버에서 인증서를 당기는

관련 문제