TLS 프로토콜과 인증서 검증 설정

Selection of Less-Secure Algorithm During Negotiation

설명

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 지원을 확인하세요.

    python
    client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    client_context.minimum_version = ssl.TLSVersion.TLSv1_3
    client_context.maximum_version = ssl.TLSVersion.TLSv1_3
    

참조