【问题标题】:SSL Certificate on NGINX fails to loadNGINX 上的 SSL 证书无法加载
【发布时间】:2020-02-20 11:09:13
【问题描述】:

我正在尝试将我从 Godaddy 获得的 SSL 证书安装到我的 NGINX 服务器上。我很肯定我的所有路径都是正确的,并且据我所知,我的服务器配置是正确的,但我仍然收到以下错误。

Feb 20 11:06:35 my.server.com nginx[6173]: nginx: [emerg] cannot load certificate "/etc/ssl/certs/certificate.crt": BIO_new_file() failed (SSL: error:0200100D:system library:fopen:Permission denied:fopen('/etc/ssl/certs/certificate.crt','r') error:2006D002:BIO routines:BIO_new_file:system lib)
Feb 20 11:00:01 my.server.com nginx[5969]: nginx: configuration file /etc/nginx/nginx.conf test failed

以下是我的 SSL 配置。我已将其放入路径 /etc/nginx/conf.d/ssl.conf 的文件中。

server {
    listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  my.server.com;
        root         /usr/share/nginx/html;

        ssl_certificate /etc/ssl/certs/certificate.crt;
        ssl_certificate_key /etc/ssl/private/private.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
               proxy_pass http://[MY_IP_ADDRESS]:8443;
               proxy_http_version 1.1;
               proxy_set_header Upgrade $http_upgrade;
               proxy_set_header Connection 'upgrade';
               proxy_set_header Host $host;
               proxy_cache_bypass $http_upgrade;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
    }
}

这看起来是权限问题,但我已经运行 chown 来更改 root 用户的权限,并且我已通过 chmod 将文件权限更改为 600。这不正确吗?有人可以就如何解决这个问题给我一些指导吗?

** 更新 **

我确实检查并发现 SSL 证书不属于 root 用户。我已将所有 SSL 文件修改为由 root 所有者和组拥有,并将文件权限更改为 600,我尝试了 700。当我运行 sudo ls -l

时,我得到以下输出
-rwx------. 1 root root 7072 Feb 20 10:41 my.server.com.chained.crt
-rwx------. 1 root root 2277 Feb 20 10:36 my.server.com.crt
-rwx------. 1 root root 4795 Feb 20 10:39 intermediate.crt

不过,我仍然遇到同样的错误。我也尝试过普通证书和全链证书。有人知道发生了什么吗?

【问题讨论】:

  • 您检查nginx 用户是否可以读取证书文件?
  • this 答案。如果您启用了 SELinux,您可能还需要更改证书文件类型:chcon -t cert_t /etc/ssl/certs/certificate.crt /etc/ssl/private/private.key
  • 我尝试了您的两个建议,但仍然卡住。请参阅主要问题中的更新。有什么想法吗?

标签: ssl nginx


【解决方案1】:

我终于解决了我的问题。结果当我移动文件(mv)时,它改变了文件的安全上下文,从而使它们对 nginx 不可读。我通过在我的根 nginx 文件夹上运行以下命令解决了这个问题。

restorecon -v -R /etc/nginx

我是从这个post 找到的。

感谢大家的帮助!

【讨论】:

  • 今天刚刚在我的一台服务器上遇到了这个问题。我在想我们的 IT 团队以某种方式更新了我们的多年证书(仍然必须每年发布一个新证书),使用不同的 CSR/密钥或其他东西。它最终成为 SELinux 上下文。我要说的唯一一件事是您的命令可能过于宽泛,具体取决于您在 /etc/nginx 文件夹中可能还有什么。我建议改为在特定文件上运行它。 restorecon -v -R /etc/nginx/ssl/yourSSLCert.crt 这样您就不会潜在地更改您不希望更改的其他文件的 SELinux 上下文。
【解决方案2】:

解决方案:restorecon -v -R /etc/nginx - 适用于我 RHEL 8

将 /etc/nginx/ssl/vhost/server.crt 从 unconfined_u:object_r:user_home_t:s0 重新标记为 unconfined_u:object_r:httpd_config_t:s0 将 /etc/nginx/ssl/vhost/archive.pem 从 unconfined_u:object_r:user_home_t:s0 重新标记为 unconfined_u:object_r:httpd_config_t:s0 将 /etc/nginx/ssl/vhost/intermediate.crt 从 unconfined_u:object_r:user_home_t:s0 重新标记为 unconfined_u:object_r:httpd_config_t:s0

只需重启 nginx。

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 2021-12-04
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2017-08-19
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多