ssl — TLS/SSL 전송용 암호화 컨텍스트

ssl — TLS/SSL 전송용 암호화 컨텍스트

소스 코드: Lib/ssl.py

이 모듈은 Python의 TLS(Transport Layer Security) 및 SSL(Secure Socket Layer) 프로토콜에 대한 접근을 제공합니다. OpenSSL을 사용하여 구현됩니다.

출처: Python documentation

본문

이 모듈은 보안 통신에 사용됩니다. 가장 일반적인 용도는 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())

더 알아보기 (Learn more)