지원 중단된 ssl.wrap_socket 사용

지원 중단된 ssl.wrap_socket 사용

설명

ssl.wrap_socket 함수는 Python 3.7에서 사용 중단이 예고되었고 Python 3.12에서 제거되었습니다. 이 함수는 호스트명 검증과 프로토콜 설정을 명확하게 구성하기 어렵기 때문에, ssl.SSLContext를 사용해 인증서 검증, 호스트명 검증, 최소 TLS 버전 등을 명시적으로 설정해야 합니다.

잠재적 영향

  • 호환성 문제: Python 3.12 이상에서는 제거된 함수를 호출할 수 없습니다.
  • 연결 위조: 인증서와 호스트명 검증이 없으면 통신을 가로챌 수 있는 공격자가 서버를 사칭할 수 있습니다.
  • 데이터 유출: 검증되지 않은 연결로 민감한 데이터가 전달될 수 있습니다.

해결 방법

  • ssl.SSLContext 사용: ssl.create_default_context() 또는 ssl.SSLContext를 사용하여 인증서 검증과 호스트명 검증을 활성화합니다.
  • 최신 보안 프로토콜 사용: TLS 1.2 이상을 사용하고, 가능하면 TLS 1.3을 허용합니다.
  • 보안 설정 강화: 신뢰할 CA 번들, 서버 호스트명, 서버 인증서 체인을 명시적으로 검증합니다.

예시

변경 전은 Python 3.12에서 제거된 API를 보여 주는 과거 예시입니다. 서버 예시는 인증서·개인키와 요청 처리 코드를 별도로 준비해야 하는 발췌이며, 클라이언트 인증을 요구하는 구성은 아닙니다.

변경 전

python
# Unsafe ssl.wrap_socket
import socket
import ssl

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
wrapped_socket = ssl.wrap_socket(sock)
wrapped_socket.connect(('example.com', 443))

변경 후

Client 측

python
# Safe ssl.SSLContext Client
import socket
import ssl

hostname = 'www.python.org'
context = ssl.create_default_context()

with socket.create_connection((hostname, 443)) as sock:
    with context.wrap_socket(sock, server_hostname=hostname) as ssock:
        print(ssock.version())

Server 측

python
# Safe ssl.SSLContext Server
import socket
import ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain('/path/to/certchain.pem', '/path/to/private.key')

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    sock.bind(('127.0.0.1', 8443))
    sock.listen(5)
    with context.wrap_socket(sock, server_side=True) as ssock:
        conn, addr = ssock.accept()
        ...

설명

  • 변경 전: ssl.wrap_socket은 지원 중단 후 제거된 API이며, 기본 보안 설정을 명확히 제어하기 어렵습니다.
  • 변경 후: ssl.create_default_context()와 SSLContext.wrap_socket()을 사용합니다. 클라이언트는 서버 인증서와 호스트명을 검증하고, 서버 컨텍스트는 자체 인증서와 개인키를 로드합니다.

참조