Prisma连接远程MySQL报错:bad handshake问题求助
解决Prisma连接远程MySQL出现Bad Handshake错误的方法
针对你遇到的**命令行能连接远程MySQL,但执行npx prisma db pull时报ERROR 08S01 (1043): Bad handshake**的问题,可按以下步骤排查解决:
1. 确认SSL连接的必要性与参数匹配
- 你用命令行连接时的命令
mysql -usven -h<ip-address> -p未添加SSL参数,说明服务器允许无SSL连接,而Prisma的URL强制开启了SSL配置,可能导致握手不匹配。先尝试移除URL中的SSL参数,改为:
执行mysql://sven:<URL-ENCODEDPASSWORD>@<IP-ADDRESS>:3306/portfolionpx prisma db pull测试是否正常。 - 如果服务器要求必须用SSL连接,重新检查
client-identity.p12文件的生成过程:确保将client-key.pem和client-cert.pem正确合并,生成时输入的密码要与URL中sslpassword完全一致,生成命令示例:openssl pkcs12 -export -out client-identity.p12 -inkey client-key.pem -in client-cert.pem
2. 验证URL编码的数据库密码
确认密码的URL编码是否准确,比如密码包含@、#、/等特殊字符时,必须替换为对应的URL编码(如@→%40),避免因编码错误导致身份验证失败。
3. 检查MySQL服务器的SSL配置
登录远程MySQL服务器,执行以下命令查看SSL状态:
SHOW VARIABLES LIKE '%ssl%';
- 确认
have_ssl值为YES,若require_secure_transport为ON,则必须使用SSL连接;若为OFF,则允许非SSL连接,此时Prisma无需配置SSL参数。 - 对比服务器端的
ca.pem与你本地的ca.pem内容,确保证书完全一致,避免证书不匹配导致握手失败。
4. 更换Prisma的SSL配置方式
尝试放弃sslidentity参数,改用单独的证书文件配置,将URL修改为:
mysql://sven:<URL-ENCODEDPASSWORD>@<IP-ADDRESS>:3306/portfolio?sslkey=client-key.pem&sslcert=client-cert.pem&sslca=ca.pem
确保client-key.pem、client-cert.pem、ca.pem三个文件存放在项目根目录,或指定完整文件路径。
5. 排查网络与防火墙限制
虽然命令行能连接,但仍需确认服务器3306端口对Prisma所在环境开放,可通过telnet <IP-ADDRESS> 3306测试端口连通性,排除防火墙或网络策略拦截的可能。
内容的提问来源于stack exchange,提问作者codingholt
相关产品推荐
相关产品推荐

