ssl — TLS/SSL 전송용 암호화 컨텍스트
ssl — TLS/SSL 전송용 암호화 컨텍스트
소스 코드: Lib/ssl.py
이 모듈은 Python의 TLS(Transport Layer Security) 및 SSL(Secure Socket Layer) 프로토콜에 대한 접근을 제공합니다. OpenSSL을 사용하여 구현됩니다.
본문
이 모듈은 보안 통신에 사용됩니다. 가장 일반적인 용도는 HTTPS 클라이언트/서버입니다.
함수 및 클래스
- *ssl.SSLContext(protocol=None, , cert_store=None, cb_data=None, skip_verify=False) — TLS 연결의 설정을 보유하는 클래스. 프로토콜 버전을 지정합니다.
- *ssl.create_default_context(purpose=Purpose.SERVER_AUTH, , cafile=None, capath=None, cadata=None, check_hostname=True) — 신뢰할 수 있는 CA 인증서로 로드된 기본 SSLContext를 만듭니다. 클라이언트 인증에는
Purpose.SERVER_AUTH, 서버에는Purpose.CLIENT_AUTH를 사용합니다. - ssl.wrap_socket(sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version=PROTOCOL_TLS, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True, ciphers=None) — 기존 소켓을 래핑하여 SSL 소켓을 만듭니다.
SSLContext.wrap_socket()을 사용하는 것이 권장됩니다. - ssl.get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, ca_certs=None) — 서버로부터 인증서를 가져와 PEM 인코딩 문자열로 반환합니다.
- ssl.RAND_bytes(num) — 암호학적으로 안전한 난수 바이트를 반환합니다.
- ssl.RAND_pseudo_bytes(num) — 의사 난수 바이트를 반환합니다(더 이상 사용되지 않음).
- ssl.match_hostname(cert, hostname) — 인증서가 호스트 이름과 일치하는지 확인합니다(Python 3.7에서 폐기됨,
SSLContext.check_hostname참고).
SSLContext 메서드
SSLContext 객체는 다음과 같은 메서드와 속성을 가집니다.
- load_cert_chain(certfile, keyfile=None, password=None) — 인증서 체인과 개인 키를 로드합니다.
- load_verify_locations(cafile=None, capath=None, cadata=None) — 신뢰할 수 있는 CA 인증서를 로드합니다.
- load_default_certs(purpose=Purpose.SERVER_AUTH) — 시스템의 기본 CA 인증서를 로드합니다.
- set_default_verify_paths() — 시스템 기본 CA 경로를 사용하도록 설정합니다.
- wrap_socket(sock, server_side=False, do_handshake_on_connect=True, suppress_ragged_eofs=True, server_hostname=None, session=None) — 기존 소켓을 래핑합니다.
- wrap_bio(incoming, outgoing, server_side=False, server_hostname=None) — BIO 기반 SSL 소켓을 만듭니다.
- cert_store_stats() — 인증서 저장소에 대한 정보를 반환합니다.
- get_ca_certs(binary_form=False) — 로드된 CA 인증서 목록을 반환합니다.
- set_ciphers(ciphers) — 사용할 암호화 스위트를 설정합니다.
- set_alpn_protocols(protocols) — ALPN 협상에 사용할 프로토콜을 설정합니다.
- set_servername_callback(callback) — SNI(Server Name Indication) 콜백을 설정합니다.
- verify_flags — 인증서 검증 플래그.
- verify_mode — 인증서 검증 모드.
- check_hostname — 호스트 이름 검사 여부.
- minimum_version — 허용되는 최소 프로토콜 버전.
- maximum_version — 허용되는 최대 프로토콜 버전.
SSLSocket 객체
wrap_socket()이 반환하는 SSLSocket 객체는 표준 socket 메서드에 더해 여러 메서드를 추가합니다.
- do_handshake() — SSL 핸드셰이크를 수행합니다.
- getpeercert(binary_form=False) — 피어의 인증서를 반환합니다.
- cipher() — 선택된 암호화 스위트를 반환합니다.
- compression() — 압축 알고리즘을 반환합니다.
- version() — 협상된 프로토콜 버전을 반환합니다.
- selected_alpn_protocol() — 협상된 ALPN 프로토콜을 반환합니다.
- shared_ciphers() — 피어와 공유된 암호화 스위트 목록을 반환합니다.
- unwrap() — SSL 래핑을 해제하고 원래 소켓을 반환합니다.
상수
- ssl.PROTOCOL_TLS — 현재 사용 가능한 가장 높은 프로토콜 버전을 선택합니다.
- ssl.PROTOCOL_TLS_CLIENT — 클라이언트 측 TLS.
- ssl.PROTOCOL_TLS_SERVER — 서버 측 TLS.
- ssl.CERT_NONE — 인증서 검증 없음.
- ssl.CERT_OPTIONAL — 인증서 검증(선택).
- ssl.CERT_REQUIRED — 인증서 필수 및 검증.
- ssl.OP_NO_TLSv1 등 — 특정 프로토콜 버전을 비활성화하는 옵션.
- ssl.HAS_SNI — SNI 지원 여부.
- ssl.HAS_ALPN — ALPN 지원 여부.
보안 고려 사항
보안을 위해 create_default_context()를 사용하여 TLS 클라이언트를 구성하는 것이 좋습니다. 인증서 검증을 비활성화하지 마세요. 자세한 내용은 ssl 문서의 보안 고려 사항 섹션을 참고하세요.
예제 (클라이언트)
import socket
import ssl
context = ssl.create_default_context()
with socket.create_connection(("www.python.org", 443)) as sock:
with context.wrap_socket(sock, server_hostname="www.python.org") as ssock:
print(ssock.version())