파이썬에서 PyOpenSSL은 OpenSSL 라이브러리에 대한 바인딩을 제공하여 SSL/TLS 프로토콜과 관련된 작업을 수행할 수 있게 해줍니다. 이를 사용하여 SSL 인증서를 검증하는 방법은 다음과 같습니다.
먼저, PyOpenSSL 라이브러리를 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다.
pip install pyopenssl
다음으로, PyOpenSSL을 사용하여 SSL 인증서를 검증하는 코드를 작성해보겠습니다.
from OpenSSL import SSL
from OpenSSL.crypto import X509StoreContext, X509Store, load_certificate, FILETYPE_PEM
# 검증할 인증서 파일 경로
cert_file = "path/to/certificate.pem"
# 인증서 파일을 X509Store 객체에 로드
store = X509Store()
store.load_locations(cert_file)
# SSL 인증서 검증 함수
def verify_callback(ok, store_ctx):
if not ok:
# 인증서가 유효하지 않은 경우
err_num = store_ctx.get_error()
err_depth = store_ctx.get_error_depth()
err_msg = store_ctx.get_error_string()
print(f"Error: {err_msg} (depth={err_depth}, num={err_num})")
else:
# 인증서가 유효한 경우
cert = store_ctx.get_current_cert()
subject = cert.get_subject()
print(f"Certificate valid: {subject}")
return ok
# SSL 인증서 검증을 위한 컨텍스트 생성
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, verify_callback)
ctx.load_verify_locations(cert_file)
# 인증서 검증
conn = SSL.Connection(ctx)
conn.connect(("example.com", 443))
conn.do_handshake()
conn.shutdown()
conn.close()
위 코드에서 cert_file
변수에 검증할 SSL 인증서 파일의 경로를 지정해야 합니다. store.load_locations(cert_file)
을 통해 인증서 파일을 로드한 후, ctx.set_verify(SSL.VERIFY_PEER, verify_callback)
를 통해 검증 콜백 함수를 설정합니다. ctx.load_verify_locations(cert_file)
를 호출하여 검증에 사용할 인증서 파일을 로드합니다.
검증 콜백 함수 verify_callback
은 인증서의 유효성을 확인하고 검증 결과에 따라 동작을 수행합니다. 유효하지 않은 경우에는 에러를 출력하고, 유효한 경우에는 해당 인증서의 주체(subject)를 출력합니다.
마지막으로, SSL.Connection(ctx)
를 통해 SSL 연결을 생성하고, conn.connect(("example.com", 443))
을 호출하여 서버에 연결합니다. conn.do_handshake()
를 호출하여 SSL 핸드셰이크를 수행하고, conn.shutdown()
과 conn.close()
를 호출하여 연결을 종료합니다.
이렇게 하면 PyOpenSSL을 사용하여 SSL 인증서를 검증할 수 있습니다. 추가적으로 인증서 체인 검증이나 다른 유효성 검사를 수행할 수도 있으며, 필요에 따라 검증 콜백 함수를 수정하여 사용할 수 있습니다.
참고 문서: