使用Rust通过mysql_async建立MariaDB TLS 1.3连接遇格式错误
解决Rust(mysql_async/sqlx)连接MariaDB双向认证时的TLS格式错误
你的错误是TLS握手阶段的消息格式不匹配,核心原因是Rust客户端的TLS配置与MariaDB服务器的要求不兼容。以下是针对性的修改方案:
1. 强制指定兼容的TLS版本
MariaDB通常使用TLS 1.2或1.3,而rustls(mysql_async依赖的TLS库)默认版本范围可能包含服务器不支持的协议,显式指定版本即可解决:
use rustls::Version; let ssl_opts = SslOpts::default() .with_danger_accept_invalid_certs(true) .with_client_identity(Some( ClientIdentity::new(Path::new("./src/ssl/client-identity.p12")) .with_password("password"), )) .with_tls_versions(vec![Version::TLS1_2, Version::TLS1_3]); // 新增指定TLS版本
2. 明确设置SSL强制模式
mysql_async默认SSL模式为PREFERRED,会先尝试未加密连接再升级,而服务器若强制加密会导致格式冲突,需显式设置为强制加密:
let opts = OptsBuilder::default() .ip_or_hostname("x.x.x.x") .tcp_port(xxxx) .user(Some("user")) .pass(Some("password")) .db_name(Some("db_x")) .ssl_opts(ssl_opts) .ssl_mode(mysql_async::SslMode::Required); // 新增强制SSL模式
若需要严格验证服务器证书,可改用SslMode::VerifyIdentity(需确保服务器证书CN与连接主机名匹配)。
3. 替换PKCS#12证书为PEM格式
部分Rust TLS库对PKCS#12(.p12)格式的支持存在兼容性问题,可将证书导出为PEM格式后重新配置:
- 导出客户端证书:
openssl pkcs12 -in client-identity.p12 -clcerts -nokeys -out client-cert.pem - 导出客户端私钥:
openssl pkcs12 -in client-identity.p12 -nocerts -out client-key.pem
修改代码使用PEM证书:
let ssl_opts = SslOpts::default() .with_danger_accept_invalid_certs(true) .with_client_cert_path(Path::new("./src/ssl/client-cert.pem")) .with_client_key_path(Path::new("./src/ssl/client-key.pem"));
4. 禁用SNI(针对旧版MariaDB)
若你的MariaDB服务器版本较旧不支持SNI,可关闭该功能:
let ssl_opts = SslOpts::default() // ... 其他配置 .with_sni(false); // 新增禁用SNI
优先尝试前两个修改,这是此类问题最常见的解决途径。同时建议确保mysql_async依赖为最新版本,旧版本可能存在TLS相关bug。
内容的提问来源于stack exchange,提问作者RunDosRun
相关产品推荐
相关产品推荐

