为何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
相关产品推荐
相关产品推荐

