mysql.connector使用SSL连接MySQL报错但pymysql可正常连接问题排查
问题原因及解决方案
pymysql可正常连接证明证书有效性、服务端SSL配置、网络连通性均无问题,故障由mysql.connector与pymysql的SSL默认处理逻辑差异导致,常见原因及解决方法如下:
- TLS版本协商不匹配
mysql.connector8.0及以上版本默认禁用TLS 1.0、TLS 1.1,仅允许TLS 1.2及以上版本建立连接,若你的MySQL服务端仅支持低版本TLS协议,就会出现SSL握手失败。而pymysql默认支持的TLS协议范围更广,不会触发该问题。
解决方法:在配置中指定兼容的TLS版本,示例:
import ssl config = { 'user': 'ssl-username', 'password': 'password', 'host': '4.1.3.2', 'ssl_ca': '/path/to/ca.pem', 'ssl_cert': '/path/to/cert.pem', 'ssl_key': '/path/to/key.pem', # 按需指定TLS版本,可选ssl.PROTOCOL_TLSv1 / ssl.PROTOCOL_TLSv1_1 / ssl.PROTOCOL_TLSv1_2 'ssl_version': ssl.PROTOCOL_TLSv1_2 }
- SSL主机名校验失败
mysql.connector默认开启SSL证书主机名校验,要求证书的CN/SAN字段与连接使用的host值完全匹配,而pymysql默认不开启该校验。如果你使用IP地址连接、且证书未绑定对应IP,就会触发握手失败。
解决方法:在配置中关闭主机名校验:
config['ssl_check_hostname'] = False
如果不需要校验证书有效性(不推荐生产环境使用),可额外添加'ssl_verify_cert': False参数。
mysql.connector版本存在SSL处理缺陷
部分mysql.connector版本(如8.0.23、8.0.30等)存在已知的SSL参数处理bug,即使配置正确也会出现握手失败。
解决方法:更换为稳定版本,可尝试升级到最新版,或降级到8.0.28、8.0.33等经过验证的稳定版本,使用pip命令调整版本:
pip install mysql-connector-python==8.0.33
- 手动指定
client_flags导致协商冲突
当配置中已传入ssl_ca等SSL相关参数时,mysql.connector会自动启用SSL连接,无需手动添加client_flags=[ClientFlag.SSL],手动指定该参数可能会导致与服务端的能力协商冲突,触发连接失败,直接删除该参数即可。
最终可用连接示例
import mysql.connector import ssl config = { 'user': 'ssl-username', 'password': 'password', 'host': '4.1.3.2', 'ssl_ca': '/path/to/ca.pem', 'ssl_cert': '/path/to/cert.pem', 'ssl_key': '/path/to/key.pem', 'ssl_version': ssl.PROTOCOL_TLSv1_2, 'ssl_check_hostname': False } conn = mysql.connector.connect(**config)
内容的提问来源于stack exchange,提问作者telefoontoestel
相关产品推荐
相关产品推荐

