2016-09-02 1 views
0

Python 3.4에서 verify_flags은 인증서가 CRL에 대해 폐기되었는지 확인하는 데 사용할 수 있습니다. VERIFY_CRL_CHECK_LEAF 또는 VERIFY_CRL_CHECK_CHAIN으로 설정합니다.Python이 SSL/TLS 연결에 대한 CRL을 확인하지 못했습니다.

테스트 용으로 간단한 프로그램을 작성했습니다. 그러나 내 시스템에서는이 스크립트가 완벽하게 유효하더라도 모든 연결을 확인하지 못했습니다.

import ssl 
import socket 

def tlscheck(domain, port): 
     addr = domain 

     ctx = ssl.create_default_context() 
     ctx.options &= ssl.CERT_REQUIRED 
     ctx.verify_flags = ssl.VERIFY_CRL_CHECK_LEAF 

     ctx.check_hostname = True 

     #ctx.load_default_certs() 
     #ctx.set_default_verify_paths() 
     #ctx.load_verify_locations(cafile="/etc/ssl/certs/ca-certificates.crt") 

     sock = ctx.wrap_socket(socket.socket(), server_hostname=addr) 
     sock.connect((addr, port)) 

     import pprint 
     print("TLS Ceritificate:") 
     pprint.pprint(sock.getpeercert()) 
     print("TLS Version:", sock.version()) 
     print("TLS Cipher:", sock.cipher()[0]) 
     exit() 

tlscheck("stackoverflow.com", 443) 

내 코드는 항상 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)으로 종료됩니다.

먼저 인증서 데이터베이스가 제대로로드되지 않은 것으로 의심됩니다. 그러나 시도한 후에 load_default_certs(), set_default_verify_paths(), load_verify_locations(cafile="/etc/ssl/certs/ca-certificates.crt"), 그리고 그들 중 누구도 일했다.

또한 ctx.options &= ssl.CERT_REQUIRED은 예상대로 작동하며 인증서 체인이 신뢰되는지 여부를 알 수 있습니다. 그러나 CRL은 아닙니다 ... 또한 CA가 정확하다는 것을 나타냅니다.

"/etc/ssl/certs/ca-certificates.crt"에는 유효한 CA가 들어 있습니다. 문제가 무엇입니까?

답변

1

CRL을 확인하려면 CRL을 수동으로 다운로드하여 올바른 위치에 배치해야 기본 OpenSSL 라이브러리에서 찾을 수 있습니다. CRL을 자동으로 다운로드하지 않으며 CRL을 찾을 곳을 지정하는 것도 직관적이지 않습니다. 할 수있는 일 :

  • 인증서에서 CRL 배포 지점을 가져옵니다.
    openssl crl -inform der -in sha2-ha-server-g5.crl > sha2-ha-server-g5.crl.pem
  • 가 위치를 추가 :이 다음 단계에서 예상되는 것입니다 때문에 stackoverflow.com 들어 하나는 http://crl3.digicert.com/sha2-ha-server-g5.crl
  • 다운로드,이
  • 에서 PEM 형식으로 DER 형식에서 변환 현재 CRL입니다 verify_locations는 :
    ctx.load_verify_locations(cafile="./sha2-ha-server-g5.crl.pem")

이 방법 당신은 CRL에 대해 인증서를 확인할 수 있습니다.

+0

'load_verify_locations()'가'cadata'라는 매개 변수를 받아들이 기 때문에 파일을 디스크에 저장하거나 수동으로 변환 할 필요가 없습니다. 바이너리 바이트 테스트는 DER 또는 PEM 형식으로 전달 될 수 있습니다. –

+0

고마워요. 어쨌든, 파이썬의'ssl' 모듈은 끔찍한 디자인을 가지고 있습니다. 알려진 인증서가 취소되었는지를 검사 할 수있는 API를 제공하지 않습니다! 즉, ** 연결이 생성 된 후 ** 단순히 CRL을 확인할 수 없다는 것을 의미하지만 2 단계 과정이 필요합니다. CRL을 가져 오기 위해 연결하고 다른 연결을 통해 통신 할 수 있습니다 ... 어쨌든, 적절한 암호화가 무시 된 시대 ... –

+1

@ 비자 : 그것은 실제로 기본 openssl 라이브러리의 디자인입니다. 그 외에도 대개 해지를 확인하기 위해 거대한 CRL 파일을 자주로드하고 싶지는 않습니다. 이동 방법은 OCSP입니다. 그러나 파이썬은 다양한 다른 프로그래밍 언어와 마찬가지로 OCSP 검사를 쉽게 수행 할 수있는 방법을 지원하지 않습니다. –

관련 문제