설명
TLS 1.0/1.1 같은 구형 프로토콜을 허용하면 통신 보호가 약해질 수 있습니다. 다만 현재 Go의 crypto/tls는 MinVersion을 생략해도 기본적으로 TLS 1.2를 최솟값으로 사용하므로, 생략만으로 취약한 연결이라고 판단할 수는 없습니다. 사용 중인 Go 버전과 환경 설정을 확인하고, 서비스에 필요한 최소 TLS 버전을 명시하세요.
잠재적 영향
- 실제로 구형 프로토콜이나 약한 암호 스위트가 협상되면 민감 정보의 기밀성과 무결성이 약해질 수 있습니다.
- 실행 환경의 기본값이나 예외 설정을 확인하지 않으면 조직이 요구한 최소 버전과 다르게 동작할 수 있습니다.
- 지나치게 높은 최솟값도 필요한 클라이언트의 연결을 끊을 수 있으므로 전환 시 호환성을 확인해야 합니다.
해결 방법
- TLS 최소 버전 명시: Go 애플리케이션에서
crypto/tls의tls.Config를 사용할 때 반드시MinVersion: tls.VersionTLS12이상(가능하면tls.VersionTLS13)을 명시하세요. - 레거시 지원 최소화: 오래된 브라우저(예: IE 10)를 꼭 지원해야 하는 특수 상황이 아니라면, TLS 1.0/1.1은 사용하지 마세요. 부득이하게 사용할 경우, 해당 경로를 별도 서비스/도메인으로 분리하고, 추가 모니터링 및 위험 고지를 검토하세요.
- 보안 가이드라인 준수: 기업/조직의 보안 정책, 브라우저/플랫폼 지원 현황, 최신 보안 권고(예: OWASP, 각 언어 런타임 릴리즈 노트)를 참고해 주기적으로 TLS 설정을 점검하세요.
- 테스트 및 검증:
sslscan,nmap --script ssl-enum-ciphers, 온라인 TLS 검사 도구 등을 사용해 서버가 허용하는 프로토콜과 암호 스위트를 정기적으로 점검하세요.
예시
변경 전
go
package main
import (
"crypto/tls"
"net/http"
)
func newInsecureServer() *http.Server {
// MinVersion 생략: 실제 최솟값은 Go 버전과 환경 설정에 따름
// 현재 기본값은 TLS 1.2
tlsConfig := &tls.Config{
// 다른 옵션만 설정하고 MinVersion 없음
// CipherSuites, Certificates 등만 설정했다고 가정
}
return &http.Server{
Addr: ":8443",
TLSConfig: tlsConfig,
}
}
func main() {
srv := newInsecureServer()
// 인증서/키 경로는 예시
_ = srv.ListenAndServeTLS("server.crt", "server.key")
}
변경 후
go
package main
import (
"crypto/tls"
"net/http"
)
func newSecureServer() *http.Server {
tlsConfig := &tls.Config{
// 최소 TLS 버전을 명확히 TLS 1.2 이상으로 지정
MinVersion: tls.VersionTLS12,
// 필요 시 추가 보안 설정 (예: 강한 CipherSuite만 허용)
// CipherSuites: []uint16{ ... },
}
return &http.Server{
Addr: ":8443",
TLSConfig: tlsConfig,
}
}
func main() {
srv := newSecureServer()
// 인증서/키 경로는 예시
_ = srv.ListenAndServeTLS("server.crt", "server.key")
}
설명:
- 변경 전:
MinVersion을 생략해 런타임 기본값을 사용합니다. 현재 기본값은 TLS 1.2이며, 구형 Go나 환경별 예외 설정은 따로 확인해야 합니다. - 변경 후:
MinVersion: tls.VersionTLS12를 명시해 코드에서 최솟값을 정합니다. 이미 같은 기본값을 사용했다면 허용 버전이 달라지는 것은 아닙니다. 인증서 검증과 TLS 1.2 암호 스위트도 함께 확인하세요.