mysql客户端没指定证书为什么也能ssl连接?

Viewed 27

1.客户端没指定证书
客户端>mysql -h192.168.0.10 -uroot -p

2.服务端(客户端所在主机的mysql容器)查询当前连接是ssl连接

服务端> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| Ssl_cipher | TLS_AES_256_GCM_SHA384

3.客户端退出登录,查看证书默认值空

客户端>mysql --help
ssl-ca (No default value)
ssl-capath (No default value)
ssl-cert (No default value)
ssl-cipher (No default value)

补充提问:客户端没指定证书,如何加密登录连接字符串呢?如何解密服务端返回的数据呢?

1 Answers

MySQL客户端能在不指定SSL证书选项的情况下建立SSL连接,主要有以下原因:

1. 客户端默认使用 --ssl-mode=PREFERRED(在支持SSL的版本中)

  • MySQL客户端(特别是5.7及以上版本)默认启用了--ssl-mode=PREFERRED选项。这意味着:
    客户端在连接时,如果服务器支持SSL,会自动尝试建立加密连接。
    如果服务器不支持SSL,客户端会退回到未加密连接,而不会报错。
  • 在您的命令mysql -h192.168.0.10 -uroot -p中,没有指定任何SSL选项(如--ssl-ca或--ssl-cert),但默认行为触发了SSL尝试。
  • 查看客户端默认值(mysql --help)显示“No default value”,但这只表示用户未显式设置值;内部逻辑会根据服务器响应自动处理。

2. SSL连接不需要客户端证书

  • SSL/TLS加密连接的核心是服务器证书验证,而非客户端证书:
    服务器必须拥有一个证书(配置在MySQL服务器端,通过选项如ssl_cert)。
    客户端在连接时,仅验证服务器证书(如果提供了CA证书)。如果未指定--ssl-ca选项,客户端可能跳过验证(这有安全风险,但仍能加密数据)。
    客户端证书(--ssl-key和--ssl-cert)只在服务器明确要求客户端身份认证(通过选项如REQUIRE X509)时才需要。在您的场景中,服务器没有强制客户端证书,因此空值不影响连接。
  • 当SHOW STATUS LIKE 'Ssl_cipher'显示一个值(如TLS_AES_256_GCM_SHA384)时,它确认了SSL连接已建立,但这只依赖于服务器端证书的可用性。

3. 服务器端配置允许无客户端证书的SSL

  • 如果MySQL服务器配置了SSL(例如,在my.cnf设置如ssl=ON或require_secure_transport=ON),它将接受SSL连接:
    在服务器端,SSL支持是独立配置的(使用ssl_cert、ssl_key等选项)。
    客户端可以通过基本握手探测服务器是否支持SSL,并自动升级连接。
  • 在您的例子中,服务器位于192.168.0.10,且返回了非空Ssl_cipher值,证明服务器已启用SSL支持,使客户端默认行为生效。

总结:客户端在未指定SSL选项时,默认尝试建立SSL连接(如果服务器支持),且SSL加密不需要客户端证书(仅服务器证书即可)。这种行为有助于简化连接过程,但如果您需要强制客户端证书或严格验证,应在客户端指定--ssl-ca、--ssl-cert等选项以增强安全性。

Related