Laravel使用SnappyPDF生成PDF时报退出码1 QSslSocket错误
这个报错是SnappyPDF底层依赖的wkhtmltopdf工具和服务器系统的OpenSSL版本不兼容导致的:旧版wkhtmltopdf使用的Qt框架依赖OpenSSL 1.0.x的接口,而现在主流服务器发行版(比如Ubuntu 22.04+、CentOS 9+)默认预装的是OpenSSL 3.x,移除了旧版接口,所以运行时找不到对应函数。本地环境能正常运行是因为本地的OpenSSL版本和wkhtmltopdf的依赖匹配。
以下方案按落地成本从低到高排序:
方案1:关闭wkhtmltopdf的SSL校验(最快临时解决)
如果你的PDF内容里没有加载HTTPS的外部资源,或者不需要严格SSL校验,直接在生成PDF前加参数关闭SSL相关功能即可,修改代码如下:$pdf = SnappyPDF::loadHTML($html) ->setOption('ignore-ssl-errors', true) ->setOption('no-stop-slow-scripts', true) ->save('reports/cargo_manifest_' . str_pad($cargo->id, 6, '0', STR_PAD_LEFT) . '.pdf');如果HTML内容完全没有外部HTTPS资源,还可以额外加
->setOption('disable-external-links', true)彻底禁用外部链接加载,避免触发SSL逻辑。方案2:安装适配OpenSSL 3.x的wkhtmltopdf版本
目前官方已经推出支持OpenSSL 3.x的wkhtmltopdf版本,直接替换服务器上的旧版本即可:- 先卸载服务器原有wkhtmltopdf:Debian/Ubuntu系执行
sudo apt remove wkhtmltopdf,RHEL/CentOS系执行sudo dnf remove wkhtmltopdf - 下载对应系统架构、支持OpenSSL 3.x的wkhtmltopdf版本,解压后将二进制文件放到
/usr/local/bin目录,执行sudo chmod +x /usr/local/bin/wkhtmltopdf赋予执行权限 - 执行
wkhtmltopdf --version验证安装成功后,重新运行代码即可。
- 先卸载服务器原有wkhtmltopdf:Debian/Ubuntu系执行
方案3:安装旧版OpenSSL兼容包
如果不方便升级wkhtmltopdf,可以直接安装系统的旧版OpenSSL兼容包:- Ubuntu/Debian系执行
sudo apt install libssl1.1 - CentOS/RHEL系执行
sudo dnf install openssl1.0
安装完成后重启web服务和php-fpm服务即可生效。
- Ubuntu/Debian系执行
方案4:使用静态编译版wkhtmltopdf
直接下载官方预编译的静态版本wkhtmltopdf,静态版本将所有依赖打包到二进制文件中,不依赖系统的OpenSSL版本,解压放到可执行目录赋予权限即可直接使用,无需额外安装依赖。
内容的提问来源于stack exchange,提问作者Muhammad Nabeel Siddiqui

