説明
弱い暗号スイートを明示的に許可すると、TLS の機密性や完全性が低下する可能性があります。RC4、3DES、以下の非推奨 CBC スイートにはそれぞれ異なる問題があり、AES-CBC というだけで全実装が同じ攻撃に弱いわけではありません。弱い組み合わせがネゴシエーションされると、攻撃者がデータの復元やセッションへの攻撃に利用するおそれがあります。
想定される影響
- ネゴシエーションされた暗号の弱点による機密データや認証トークンの漏えい
- アルゴリズムや実装の弱点を利用した通信の改ざん
- TLS を使用していても保護が弱まり、セキュリティ要件を満たさない可能性
対処方法
tls.Config.CipherSuitesは TLS 1.0–1.2 用です。TLS 1.3 のTLS_AES_128_GCM_SHA256やTLS_AES_256_GCM_SHA384はこのフィールドで設定できません。TLS 1.2 を明示的に構成する場合はtls.CipherSuites()と公式文書で推奨 AEAD スイートを確認してください。- 非推奨の RC4、3DES、CBC スイートを除き、明示的な一覧が必要でなければ、維持管理されている Go の既定値を使ってください。
MinVersionはtls.VersionTLS12以上、互換性があればtls.VersionTLS13にして、古いプロトコルを除外してください。- Go のリリースノートとセキュリティ情報で、対応・推奨スイートの変更を確認してください。
例
変更前
go
package main
import (
"crypto/tls"
"net/http"
)
// 変更前: 弱い暗号スイートを明示的に選択
func insecureClient() *http.Client {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
// これらの RC4、3DES、CBC スイートは脆弱または非推奨
CipherSuites: []uint16{
tls.TLS_RSA_WITH_RC4_128_SHA,
tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
},
MinVersion: tls.VersionTLS10,
},
}
return &http.Client{Transport: tr}
}
変更後
go
package main
import (
"crypto/tls"
"net/http"
)
// 変更後: 現代的な暗号スイートと TLS バージョンを使用
func secureClient() *http.Client {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
// 可能なら TLS 1.3 を使用。既定の暗号スイートは Go が管理
MinVersion: tls.VersionTLS12,
// 必要なら適切な TLS 1.2 暗号スイートを明示的に選択
CipherSuites: []uint16{
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
},
},
}
return &http.Client{Transport: tr}
}
説明:
- 変更前:
tls.TLS_RSA_WITH_RC4_128_SHA、tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA、tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256を明示しています。RC4 には統計的な弱点があり、ブロック長が短い 3DES は SWEET32 の影響を受けます。CBC のリスクはパディング処理と実装によって異なります。最小値を TLS 1.0 にすると、古い組み合わせも許可します。 - 変更後:
MinVersion: tls.VersionTLS12で TLS 1.0/1.1 を除外します。別のスイート一覧では、TLS 1.2 用の GCM や CHACHA20-POLY1305 による AEAD を選び、変更前の非推奨スイートを除きます。TLS 1.3 のスイートは Go が別途管理します。弱い組み合わせのリスクを減らしますが、証明書検証は引き続き必要です。