설명
SSL과 TLS 1.0·1.1 같은 오래된 프로토콜은 사용하지 마세요. TLS 1.2 또는 TLS 1.3을 지원하는 보안 구성을 사용하고, 가능하면 TLS 1.3을 우선하세요. 프로토콜 버전 설정과 함께 인증서 체인 및 호스트명 검증도 필요합니다.
잠재적 영향
- 데이터 유출: 공격자가 SSL 취약점을 악용하여 암호화된 데이터를 해독할 수 있습니다.
- 중간자 공격: 공격자가 통신을 가로채고 변조할 수 있습니다.
해결 방법
- 최소 TLS 버전을 1.2 이상으로 제한하고, 요구 사항과 호환성이 허용하면 TLS 1.3을 사용하세요.
- 클라이언트에서는 신뢰할 CA와 호스트명을 검증하세요. 서버에는 용도에 맞는 서버 컨텍스트와 인증서·개인키를 설정하세요.
예시
변경 전
python
# Unsafe SSL configuration
import ssl
import socket
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
with socket.create_connection(('example.com', 443)) as sock:
with context.wrap_socket(sock, server_hostname='example.com') as ssock:
print(ssock.version())
변경 후
python
# Safe TLS configuration
import ssl
import socket
context = ssl.create_default_context()
context.minimum_version = ssl.TLSVersion.TLSv1_2
with socket.create_connection(('example.com', 443)) as sock:
with context.wrap_socket(sock, server_hostname='example.com') as ssock:
print(ssock.version())
설명
-
변경 전:
PROTOCOL_SSLv23는 구식 이름의 범용 TLS 컨텍스트 별칭입니다. 이름만으로 실제 SSL 사용을 단정할 수 없지만, 이 코드는 인증서와 호스트명 검증을 구성하지 않습니다. 협상 가능한 버전은 Python/OpenSSL과 설정에 따라 달라집니다. -
변경 후:
create_default_context()가 서버 인증서와 호스트명 검증을 활성화하고, 최소 TLS 버전을 1.2로 명시합니다. -
아래처럼 TLS 1.3만 허용할 수도 있습니다. 이는 컨텍스트 설정 발췌이며, 실제 연결 전에 신뢰할 CA를 로드해야 합니다. 양쪽의 TLS 1.3 지원을 확인하세요.
pythonclient_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) client_context.minimum_version = ssl.TLSVersion.TLSv1_3 client_context.maximum_version = ssl.TLSVersion.TLSv1_3