如何解决Docker容器内运行Nginx出现SSL: error:0200100D:fopen权限拒绝错误
Nginx容器挂载SSL证书报权限错误修复方案
你遇到的错误SSL: error:0200100D:system library:fopen:Permission denied:fopen翻译为:SSL错误:0200100D:系统库fopen调用失败:权限拒绝。即使宿主机证书已设置为r-xr-xrwx权限,依然报错通常是以下几个原因,对应修复方案如下:
用户身份映射不匹配
官方Nginx镜像默认使用UID为101的
nginx用户运行工作进程,而非root用户。如果宿主机开启了Docker用户命名空间(User Namespace),容器内的UID会和宿主机UID做重映射,导致容器内的nginx用户无法匹配宿主机文件的权限位规则。
操作步骤:- 进入容器确认Nginx运行的UID:
docker exec -it <你的Nginx容器名称> id nginx- 回到宿主机修改证书文件的所有者为对应UID,权限调整为更安全的只读即可:
sudo chown 101:101 /宿主机/证书存储路径/* sudo chmod 400 /宿主机/证书存储路径/*SELinux安全策略拦截
RHEL、CentOS、Fedora等发行版默认开启SELinux,挂载到容器的本地文件如果没有配置对应安全上下文,会被SELinux拦截访问。
修复命令:# 给证书目录添加容器可访问的SELinux标签 sudo chcon -Rt svirt_sandbox_file_t /宿主机/证书存储目录验证方式:可临时执行
setenforce 0关闭SELinux后重启容器,如问题消失即可确认是该原因。上层目录无执行权限
Linux系统下访问任意文件,都需要该文件路径上所有上层目录具备执行权限(x权限),哪怕证书本身权限正确,上层目录缺失x权限也会触发权限拒绝。
修复命令:# 给证书路径的所有上层目录开放其他用户执行权限 sudo chmod o+x /宿主机/证书父目录 /宿主机/证书祖父目录
内容的提问来源于stack exchange,提问作者Tharak Sarvayoni
相关产品推荐
相关产品推荐

