换了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模式。

getenforcesestatus -v

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

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

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

$ sudo ausearch -m avc -ts todaytime->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 , 成功!

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

  1. nginx证书填写路径报错:SSL: error:0200107B:system library:fopen:Unknown error:fopen

    nginx配置ssl证书时,启动报错,无法找到证书文件,报错日志如下: 2021/11/24 15:52:19 [emerg] 4124#3800: cannot load certificate & ...

  2. nginx: [emerg] cannot load certificate “/ssl/w“error:2006D080:BIO routines:BIO_new_file:no such file

    无法加载到证书的解决方案 查找之前的docker 的挂载的地址和ip docker inspect nginx docker run --name ftpnginx -d -p 80:80 -p 44 ...

  3. nginx填坑之路(1)Nginx 检测语法正常,启用报 [emerg] bind() to 0.0.0.0:XXXX failed (13: Permission denied)错误处理...

    参考文档:Nginx 启动报 [emerg] bind() to 0.0.0.0:XXXX failed (13: Permission denied)错误处理 nginx 启动失败: 检测语法正常, ...

  4. nginx启动报错:nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/ngi

    nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx 这个错误是由于配置了https代理但 ...

  5. unable to access ‘https://github.com/XXX.git/‘: LibreSSL SSL_read: error:02FFF03C:system library:fun

    unable to access 'https://github.com/XXX.git/': LibreSSL SSL_read: error:02FFF03C:system library:fun ...

  6. LibreSSL SSL_read: error:02FFF031:system library:func(4095):

    通过 Github 上传本地仓储 code 的时候抛出了如下异常 LibreSSL SSL_read:error:02FFF031:system library:func(4095):Can't as ...

  7. git操作时出现error: cannot stat 'path/file': Permission denied

    git操作时出现error: cannot stat 'path/file': Permission denied 问题发生OS 场景 尝试 解决 问题发生OS Windows 10 场景 公司的小妹 ...

  8. php fpm安装curl后,nginx出现connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied)的错误...

    这里选择直接apt-get安装,因为比起自己编译简单多了,不需要自己配置什么 #sudo apt-get install curl libcurl3 libcurl3-dev php5-curl 安装 ...

  9. error: could not create 'xxxxxx': Permission denied

    先说解决办法----将目标文件夹赋予权限即可: sudo chmod -R 777 xxxxxx 然后输入密码. 我再重新安装python27的时候遇到了这个问题 pip install python ...

最新文章

  1. CRM问题:导入、导出实体错误
  2. 关于HtmlParser中Parser【org.htmlparser.Parser】这个类奇怪的地方...求解释【已获得解释】...
  3. java常用类解析十:Date类和Calendar类示例
  4. [云炬创业基础笔记]第六章商业模式测试18
  5. Linux下Nginx、MySQL、PHP5、phpMyAdmin安装与配置
  6. 特斯拉股价暴跌,疯狂烧钱是否真的能够带来高额回报?
  7. bash 抓捕异常_SHELL异常处理(转载)
  8. 微信小程序运行的底层逻辑
  9. 王军生老师---银行领域高端讲师(王军生)
  10. Go基础编程:工作区
  11. Linux自学之旅-基础命令(write用户之间发送信息命令)
  12. 计算机基础知识题库选择题,计算机基础知识题库选择题
  13. C#:VARCHART XGantt 5.2.0.167-2022-08-18-UPDATE
  14. kvaser canking 的使用
  15. 实景三维重建大雁云与三青鸟达成战略合作提供自助式实景三维建模全流程服务
  16. Python 神器!自动识别文字中的省市区并绘图
  17. php 调用java接口
  18. Sailfish 浏览器是基于 Gecko 引擎开发
  19. Win32 SDK 访问数据库
  20. proguard 配置简介

热门文章

  1. Openfiler安装图解教程
  2. 脑启发遥感解译:一个全面的调查
  3. SLF4J: Class path contains multiple SLF4J bindings. 问题原因及解决方法。
  4. 浪潮服务器5112面板灯_浪潮英信服务器SA5112M5
  5. python翻页爬取京东商品评价
  6. 笔记本电脑没有鼠标怎么右键_没有键盘怎么办Windows10屏幕键盘让你实现用鼠标打字...
  7. 流程图怎么做?迅捷画图教你快速绘制流程图
  8. 学习笔记5--摄像头标定之内参标定
  9. skype安卓手机版_手机剪辑软件,乐秀最新特殊版(安卓)
  10. 如何下载红桥区卫星地图高清版大图