仅本地Xampp中getimagesize()报SSL错误,线上正常如何解决?
问题原因与修复方案
这问题我本地开发时也踩过坑,本质是PHP的SSL证书信任机制和Apache的SSL配置是相互独立的——你虽然给Apache配置了自签名证书消除了Apache的警告,但PHP在通过getimagesize()(底层依赖PHP的HTTP流处理模块)请求HTTPS资源时,会检查目标证书是否在它自带的信任根证书列表里,而自签名证书默认不在这个列表中,所以就触发了证书验证失败的报错。
下面给你几个针对性的修复方案,按规范程度排序:
方案一:临时跳过SSL验证(仅本地测试用,禁止生产环境)
如果你只是想快速解决问题进行测试,可以在调用getimagesize()前设置流上下文,强制禁用SSL验证:
$file = "https://webtest.test/content/uploads/img.jpg"; // 创建跳过SSL验证的流上下文 $sslContext = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ] ]); // 调用getimagesize时传入上下文参数 $img_info = getimagesize($file, null, $sslContext); if(!$img_info) { throw new Exception(__('The file type is not valid image (1)')); }
注意:这个方法只是临时 workaround,完全绕开了SSL安全验证,绝对不能用于生产环境!
方案二:将自签名证书加入PHP的信任列表(推荐的本地开发方案)
这个方法更规范,让PHP信任你自己生成的自签名证书,步骤如下:
- 找到你之前生成的自签名证书文件(比如教程里的
server.crt),复制它的全部内容(包括-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----这两行) - 打开XAMPP中PHP的根证书文件,路径一般是
xampp\php\extras\ssl\cacert.pem - 将你复制的自签名证书内容,粘贴到
cacert.pem文件的末尾,保存文件 - 打开XAMPP的PHP配置文件
xampp\php\php.ini,找到openssl.cafile配置项:- 去掉配置项前面的分号
;取消注释 - 设置为你刚才修改的
cacert.pem的绝对路径,比如:openssl.cafile = "C:\xampp\php\extras\ssl\cacert.pem"
- 去掉配置项前面的分号
- 重启XAMPP的Apache服务,让PHP配置生效
完成后,PHP就会信任你的自签名证书,getimagesize()访问HTTPS本地域名就能正常工作了。
额外检查项:确认本地域名解析
确保你的webtest.test已经正确映射到本地IP,打开C:\Windows\System32\drivers\etc\hosts文件,确认存在以下一行:
127.0.0.1 webtest.test
如果域名解析错误,会导致证书里的域名和请求域名不匹配,也会触发验证失败的问题。
内容的提问来源于stack exchange,提问作者AlexAngc
相关产品推荐
相关产品推荐

