Ubuntu LAMP服务器本地HTTPS cURL请求SSL证书问题求助
解决同一服务器内cURL HTTPS请求的SSL证书问题
首先,你遇到的问题并非“无法向自身主机发起SSL cURL请求”,而是证书验证环节出现了具体问题,下面分步骤帮你排查和解决:
一、可能的原因及修复方案
1. CA证书文件版本过旧,缺失对应根证书
虽然你已经在php.ini中指定了cacert.pem的路径,但如果这个文件版本较旧,可能没有包含你当前SSL证书(比如Let's Encrypt的R3根CA)对应的信任根证书,导致验证失败。
修复步骤:
- 从可信渠道获取最新的CA证书集合,替换服务器上
/etc/ssl/certs/cacert.pem文件 - 重启PHP-FPM服务(若使用FPM模式)或Web服务器(比如Nginx/Apache),确保新的CA证书配置生效
2. 跳过公网链路,改用本地方式请求
既然两个脚本都部署在同一服务器,完全没必要通过公网IP发起HTTPS请求,既绕路又容易触发证书验证问题:
- 方案1:将cURL目标URL改为
https://localhost/templates/document.php,但要确保你的Web服务器配置了包含localhost的SSL证书(或证书的SAN字段覆盖了本地地址) - 方案2:更高效的方式——直接在
form.php中调用文档生成逻辑:把document.php的核心代码封装成函数,通过include引入后直接传参调用,完全跳过cURL请求环节
3. 检查Web服务器的SSL证书链是否完整
部分SSL证书(比如Let's Encrypt颁发的证书)需要配置完整的证书链(域名证书+中间CA证书),如果只配置了单独的域名证书,本地cURL请求可能无法完成链验证。
验证方法:
在服务器上执行以下命令查看证书链:
openssl s_client -connect example.com:443 -showcerts
如果输出中仅显示1个证书,说明缺少中间CA证书。需要将Web服务器的ssl_certificate(以Nginx为例)配置为包含全链的证书文件,而非单独的域名证书。
二、关于安全禁用CURLOPT_SSL_VERIFYPEER的问题
如果是同一服务器内的本地请求,临时禁用CURLOPT_SSL_VERIFYPEER的风险极低——因为请求不会离开服务器,不存在中间人攻击的可能。但这只是临时绕过方案,不推荐作为长期生产环境的常规配置。
如果确实需要禁用,建议仅在这个特定的本地cURL请求中单独设置,不要全局修改PHP配置,示例代码:
$ch = curl_init('https://example.com/templates/document.php'); // 其他cURL配置(比如设置POST数据、请求头)... curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 执行请求并处理响应...
内容的提问来源于stack exchange,提问作者Nordling Art
相关产品推荐
相关产品推荐

