説明
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などで実際のサービスのネゴシエーション結果を確認してください。
例
変更前
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 以上を要求し、互換性があれば TLS 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 を除外します。証明書検証と暗号スイートも適切に設定する必要があります。