You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何PHP无法识别用户安装的CA证书?Docker环境技术问询

解决PHP在Docker中无法使用自定义CA证书验证SSL的问题

第一步:修正Dockerfile中的错误

你当前的Dockerfile存在两处关键问题:

  • 自定义CA证书的文件名后缀不是.crt,update-ca-certificates工具只会识别该目录下后缀为.crt的文件
  • chmod命令指定的文件名foo.crt和实际复制的php-www.ca不匹配

修正后的Dockerfile:

FROM php:7.1-fpm

# 复制自定义CA证书,保留.crt后缀
COPY ./ssl/ca/ca.crt /usr/local/share/ca-certificates/php-www.crt
# 修正权限并更新系统CA证书库
RUN chmod 644 /usr/local/share/ca-certificates/php-www.crt && update-ca-certificates

执行update-ca-certificates后,系统会将所有信任的CA证书合并到/etc/ssl/certs/ca-certificates.crt文件中,这是系统默认的CA证书bundle。

第二步:配置PHP使用系统CA证书

PHP的openssl扩展默认可能没有指定正确的CA证书路径,需要修改php.ini配置:

方法1:在Dockerfile中直接添加配置

在Dockerfile末尾添加以下内容,设置openssl的CA文件路径:

# 设置PHP使用系统合并后的CA证书文件
RUN echo "openssl.cafile=/etc/ssl/certs/ca-certificates.crt" >> /usr/local/etc/php/php.ini

方法2:使用自定义php.ini文件

如果你有预先配置好的php.ini文件,直接在其中添加:

openssl.cafile=/etc/ssl/certs/ca-certificates.crt

然后在Dockerfile中复制该文件到PHP配置目录:

COPY ./php.ini /usr/local/etc/php/php.ini

第三步:验证配置是否生效

重新构建Docker镜像并启动容器,执行以下PHP代码测试:

$context = stream_context_create([
    'ssl' => [
        'verify_peer' => true,
        'verify_peer_name' => true,
    ]
]);
$contents = file_get_contents("https://custom_ca_url.local", false, $context);
echo $contents;

如果不再出现SSL验证错误,说明配置成功。

额外检查点

  • 确保自定义CA证书正确签署了custom_ca_url.local的服务器证书,证书的subjectAltName必须包含该域名(可通过openssl x509 -in www.crt -text -noout查看)
  • 容器内DNS可正确解析custom_ca_url.local到对应的Nginx服务器

内容的提问来源于stack exchange,提问作者Dimitrios Desyllas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:23:18