nginx: [emerg] cannot load certificate SSL: error:0200100D:system library:fopen:Permission denied:fo

本文介绍了解决Nginx在更换SSL证书后无法启动的问题,详细分析了SELinux的安全上下文导致的访问权限错误,并提供了通过restorecon命令修复文件安全上下文的方法。
部署运行你感兴趣的模型镜像

换了SSL Cert之后,Nginx无法启动,发生如下错误。

nginx: [emerg] cannot load certificate “/etc/nginx/ssl/test.crt”: BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied:fopen(’/etc/nginx/ssl/test.crt’,‘r’) error:2006D002:BIO routines:BIO_new_file:system lib)

  • 确认使用 sudo 运行。
  • 确认该文件可以 cat 打开。
  • 确认文件权限与原Cert一致。
  • nginx -t successful.

查了一下,原来是 SELinux 的问题。

SELinux,即 Security Enhanced Linux,是一种基于委任式存取控制 (Mandatory Access Control, MAC)的权限控制系统,比通常所理解的用户自主式存取控制 (Discretionary Access Control, DAC)更严格。

DAC 主要根据程序的拥有者和文件的rwx权限来决定用户可以进行的操作,但 root 可以控制一切,777文件可以被任何人操作。

MAC 可以通过规则限定特定的程序只能操作指定的文件,这样就算是 root 运行的程序,也不能随意访问其他不相关的文件了。

SELinux 默认使用 targeted模式。

getenforce

sestatus -v

检查 Audit log 可以发现,文件不能访问的原因,是程序与目标文件的 scontext(Security Context) 不一致。

Nginx 使用的是httpd_t,自己copy的文件使用的是user_home_t

导致这个问题的操作是,先在 home 下创建了文件,然后再 mv 到当前目录,而 scontext 不会因复制移动而修改。

$ sudo ausearch -m avc -ts today

time->Thu Apr  9 12:00:42 2020
type=PROCTITLE msg=audit(1586404842.411:635786): proctitle=2F7573722F7362696E2F6E67696E78002D63002F6574632F6E67696E782F6E67696E782E636F6E66
type=SYSCALL msg=audit(1586404842.411:635786): arch=c000003e syscall=2 success=no exit=-13 a0=55ba2565c54d a1=0 a2=1b6 a3=24 items=0 ppid=1 pid=65228 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1586404842.411:635786): avc:  denied  { read } for  pid=65228 comm="nginx" name="test.crt" dev="dm-0" ino=136402657 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0

查看测试 Cert 与原来版本的区别。

$ sudo ls -lrtZ /etc/nginx/ssl
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 origin.crt
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 origin.key
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 test.crt
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 test.key

使用 restorecon 让文件恢复正确的 SELinux type。

$ sudo restorecon -v -R /etc/nginx/ssl/test.*
restorecon reset /etc/nginx/ssl/test.crt context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_config_t:s0
restorecon reset /etc/nginx/ssl/test.key context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_config_t:s0
$ sudo ls -lrtZ /etc/nginx/ssl
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 origin.crt
-rw-r--r--. root root system_u:object_r:httpd_config_t:s0 origin.key
-rw-r--r--. root root unconfined_u:object_r:httpd_config_t:s0 test.crt
-rw-r--r--. root root unconfined_u:object_r:httpd_config_t:s0 test.key

可以使用 semanage 查询和修改默认的目录安全性本文,此即restorecon 恢复的所谓正确 SELinux type 的来源。

$ sudo semanage fcontext -l|grep etc/nginx
/etc/nginx(/.*)?                                   all files          system_u:object_r:httpd_config_t:s0

重启 Nginx , 成功!

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

在 Discourse 安装后启动失败,Nginx 报错 `cannot load certificate` 的问题通常与证书路径配置错误、证书文件权限不足或证书内容格式不正确有关。以下是可能的解决方案: ### 1. 检查证书路径配置 确保在 Discourse 配置文件(通常是 `containers/app.yml`)中指定的 SSL 证书路径是正确的。例如: ```yaml params: # ssl_certificate: /shared/ssl/discourse.example.com.crt # ssl_certificate_key: /shared/ssl/discourse.example.com.key ``` 确认这些路径指向实际存在的证书文件,并且容器内可以访问这些文件。 ### 2. 检查证书文件权限 证书文件需要对运行 Nginx 的用户具有读取权限。通常情况下,可以通过以下命令修改权限: ```bash chmod 644 /path/to/discourse.example.com.crt chmod 600 /path/to/discourse.example.com.key ``` ### 3. 验证证书和私钥内容 使用 OpenSSL 工具检查证书和私钥是否匹配,并且没有语法错误: ```bash openssl x509 -in /path/to/discourse.example.com.crt -text -noout openssl rsa -in /path/to/discourse.example.com.key -check ``` 如果发现任何问题,请重新生成或获取有效的证书文件。 ### 4. 确保私钥未加密 如果私钥受到密码保护,则 Nginx 将无法自动加载它。可以通过以下命令去除密码: ```bash openssl rsa -in /path/to/encrypted.key -out /path/to/unencrypted.key ``` ### 5. 重新构建并重启 Discourse 容器 完成上述更改后,执行以下命令重建并重启 Discourse 容器以应用新配置: ```bash cd /var/discourse ./launcher rebuild app ./launcher restart app ``` ### 6. 检查日志以进一步诊断 查看 Nginx 日志和容器日志来获取更详细的错误信息: ```bash docker logs <nginx_container_id> tail -f /var/log/nginx/error.log ``` 通过以上步骤,大多数与证书加载相关的 Nginx 错误都可以得到解决。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值