Cloud SQL: ssl_mode

  • Cloud SQLのSSL接続オプションは、require_sslからssl_modeへ移行が進んでいる
    • Admin APIのリファレンス(IpConfiguration)で、requireSslの説明文が "Use sslMode instead." から始まっている(=deprecated扱い)
    • 同ページに "The value of sslMode has priority over the value of requireSsl." とあり、両方指定されたらsslModeが勝つ
値挙動旧require_ssl
ALLOW_UNENCRYPTED_AND_ENCRYPTED平文もSSLも許可(デフォルト)false
ENCRYPTED_ONLYSSL接続のみ許可false
TRUSTED_CLIENT_CERTIFICATE_REQUIREDSSL接続+有効なクライアント証明書が必須true

注意:require_ssl=trueは「暗号化必須」ではない

前提として、TLSには役割の違う2種類の証明書がある。

  • サーバ証明書 … サーバが「私が本物のCloud SQLです」と名乗るためのもの。暗号化するなら必ず使われるので、クライアント側は特に何も持たなくてよい
  • クライアント証明書 … 逆に、繋ぎに来た側が「私は許可されたクライアントです」と名乗るためのもの。Cloud SQL側で事前に発行し、アプリに配っておく必要がある(=お互いが証明書を出し合う mTLS / 相互TLS)

この区別を踏まえると、

  • ENCRYPTED_ONLY … 通信は暗号化するが、相手が誰かは証明書では問わない(認証はDBのユーザー/パスワードに任せる)
  • TRUSTED_CLIENT_CERTIFICATE_REQUIRED(= 旧require_ssl=true) … 上に加えてクライアント証明書も必須

つまり旧require_ssl=trueは「平文を弾く」だけでなく「証明書を持たないクライアントを全部弾く」設定。公式も "If you want to enforce SSL/TLS without enforcing the requirement for valid client certificates, then use the sslMode flag instead of the legacy requireSsl flag." と書いている。

  • 平文を弾きたいだけならENCRYPTED_ONLY。深く考えずTRUSTED_CLIENT_CERTIFICATE_REQUIREDにすると、証明書を配っていないアプリが軒並み接続不能になる