[python] 파이썬에서 PyOpenSSL을 사용하여 SSL 인증서를 검증하는 방법은 무엇인가요?

파이썬에서 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 인증서를 검증할 수 있습니다. 추가적으로 인증서 체인 검증이나 다른 유효성 검사를 수행할 수도 있으며, 필요에 따라 검증 콜백 함수를 수정하여 사용할 수 있습니다.

참고 문서: