WSL2中使用mysql2无法连接Azure MySQL数据库的问题及解决
问题原因与解决方案
核心原因
mysql2库在WSL2(Ubuntu)环境下的SSL连接配置逻辑与原生mysql客户端不一致。Azure MySQL强制要求SSL连接:
- Win11环境中系统证书存储包含Azure所需的根证书,mysql2能自动完成SSL验证,因此连接正常;
- WSL2的Ubuntu环境默认未导入该根证书,且mysql2默认的SSL验证逻辑比原生mysql客户端更严格,导致连接失败。而原生mysql客户端连接时会自动适配兼容配置,所以能成功连接。
解决步骤
1. 先确认具体错误类型
修改代码中的异常捕获块,打印完整错误信息,定位是否为SSL相关问题:
async function init() { try { const connection = await pool.getConnection(); console.log("Connected to the MySQL server."); connection.release(); } catch (error) { console.error("完整错误信息:", error); // 替换原有的仅打印message的逻辑 } }
运行后若看到UNABLE_TO_VERIFY_LEAF_SIGNATURE或SSL connection error类提示,即可确认是SSL验证问题。
2. 调整mysql2的SSL连接配置
有两种方案可选:
方案一:临时关闭证书验证(仅测试环境使用)
在连接池配置中添加SSL选项,关闭证书验证:
const pool = mysql.createPool({ host: "host.mysql.database.azure.com", user: "user", password: "password", database: "db", port: 3306, waitForConnections: true, connectionLimit: 10, queueLimit: 0, ssl: { rejectUnauthorized: false } // 添加该行配置 });
方案二:配置官方根证书(生产环境推荐)
- 在WSL2的Ubuntu中下载Azure MySQL所需的DigiCert根证书:
wget https://cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem -P /usr/local/share/ca-certificates/
- 更新系统证书存储:
sudo update-ca-certificates
- 修改mysql2连接配置,指定证书路径:
const fs = require("fs"); const pool = mysql.createPool({ host: "host.mysql.database.azure.com", user: "user", password: "password", database: "db", port: 3306, waitForConnections: true, connectionLimit: 10, queueLimit: 0, ssl: { ca: fs.readFileSync("/usr/local/share/ca-certificates/DigiCertGlobalRootCA.crt.pem") } });
3. 验证连接
修改配置后重新运行代码,即可正常连接Azure MySQL。
内容的提问来源于stack exchange,提问作者No Ting
相关产品推荐
相关产品推荐

