SSLv3 を指定した最小バージョン設定

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 などで実際のサービスのネゴシエーション結果を確認してください。

例

変更前

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 を除外します。証明書検証と暗号スイートも適切に設定する必要があります。

参考資料