- 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が勝つ
- Admin APIのリファレンス(IpConfiguration)で、
| 値 | 挙動 | 旧require_ssl |
|---|---|---|
ALLOW_UNENCRYPTED_AND_ENCRYPTED | 平文もSSLも許可(デフォルト) | false |
ENCRYPTED_ONLY | SSL接続のみ許可 | false |
TRUSTED_CLIENT_CERTIFICATE_REQUIRED | SSL接続+有効なクライアント証明書が必須 | 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にすると、証明書を配っていないアプリが軒並み接続不能になる