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가 들어 있습니다. 문제가 무엇입니까?
'load_verify_locations()'가'cadata'라는 매개 변수를 받아들이 기 때문에 파일을 디스크에 저장하거나 수동으로 변환 할 필요가 없습니다. 바이너리 바이트 테스트는 DER 또는 PEM 형식으로 전달 될 수 있습니다. –
고마워요. 어쨌든, 파이썬의'ssl' 모듈은 끔찍한 디자인을 가지고 있습니다. 알려진 인증서가 취소되었는지를 검사 할 수있는 API를 제공하지 않습니다! 즉, ** 연결이 생성 된 후 ** 단순히 CRL을 확인할 수 없다는 것을 의미하지만 2 단계 과정이 필요합니다. CRL을 가져 오기 위해 연결하고 다른 연결을 통해 통신 할 수 있습니다 ... 어쨌든, 적절한 암호화가 무시 된 시대 ... –
@ 비자 : 그것은 실제로 기본 openssl 라이브러리의 디자인입니다. 그 외에도 대개 해지를 확인하기 위해 거대한 CRL 파일을 자주로드하고 싶지는 않습니다. 이동 방법은 OCSP입니다. 그러나 파이썬은 다양한 다른 프로그래밍 언어와 마찬가지로 OCSP 검사를 쉽게 수행 할 수있는 방법을 지원하지 않습니다. –