SSLv3 최소 버전 설정

Use of Broken Cryptographic Algorithm (SSLv3)

설명

SSLv3는 POODLE 같은 공격에 취약한 폐기된 프로토콜입니다. 다만 현재 Go의 crypto/tls는 SSLv3를 지원하지 않으므로 tls.VersionSSL30 상수를 지정해도 SSLv3 통신이 활성화되지는 않습니다. 이처럼 오래된 최소 버전 설정은 제거하고, 지원되는 TLS 버전 중 조직이 허용한 최솟값을 명시하세요.

잠재적 영향

  • SSLv3를 실제로 지원하는 레거시 환경에서는 POODLE 등으로 통신 기밀성이 훼손될 수 있습니다.
  • Go에서 지나치게 낮은 최솟값을 지정하면 런타임이 지원하는 TLS 1.0/1.1 같은 구버전까지 허용할 수 있습니다.
  • 지원하지 않는 프로토콜 상수는 실제 협상 설정을 오해하게 만들고 보안 정책과 운영 설정 사이의 차이를 숨길 수 있습니다.

해결 방법

  • tls.Config.MinVersion을 tls.VersionTLS12 이상으로 설정하고, 호환성이 맞으면 tls.VersionTLS13을 사용하세요.
  • 서버와 클라이언트에서 실제로 허용되는 버전을 확인하고 구형 프로토콜 의존성을 제거하세요.
  • 유지 관리되는 Go 버전을 사용하고 crypto/tls의 기본값과 변경 사항을 확인하세요.
  • nmap, sslyze 같은 TLS 검사 도구로 실제 서비스의 협상 결과를 확인하세요.

예시

변경 전

go
package main

import (
    "crypto/tls"
    "net/http"
)

func newInsecureClient() *http.Client {
    // 비권장: SSLv3 상수를 최소 버전으로 지정
    tlsConfig := &tls.Config{
        MinVersion: tls.VersionSSL30, // 현재 Go는 SSLv3를 지원하지 않음
    }

    return &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: tlsConfig,
        },
    }
}

func main() {
    client := newInsecureClient()
    // 실제 협상은 런타임이 지원하는 TLS 버전으로 이루어짐
    _, _ = client.Get("https://example.com")
}

변경 후

go
package main

import (
    "crypto/tls"
    "net/http"
)

func newSecureClient() *http.Client {
    // 권장: 최소 TLS 1.2 이상 사용 (가능하면 1.3)
    tlsConfig := &tls.Config{
        MinVersion: tls.VersionTLS12, // 또는 tls.VersionTLS13
    }

    return &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: tlsConfig,
        },
    }
}

func main() {
    client := newSecureClient()
    // 안전한 TLS 버전만 사용
    _, _ = client.Get("https://example.com")
}

설명:

  • 변경 전: tls.VersionSSL30을 최솟값으로 지정하지만 현재 Go에서 SSLv3를 사용할 수 있다는 뜻은 아닙니다. 지원되는 구형 TLS 버전까지 허용할 수 있는 낮은 설정입니다.
  • 변경 후: MinVersion: tls.VersionTLS12로 TLS 1.0/1.1 협상을 제외합니다. 인증서 검증과 암호 스위트도 함께 적절히 구성해야 합니다.

참조