설명
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 협상을 제외합니다. 인증서 검증과 암호 스위트도 함께 적절히 구성해야 합니다.