You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:36:09