【问题标题】:How to fix PR_END_OF_FILE_ERROR when using nginx with ssl?使用带有 ssl 的 nginx 时如何修复 PR_END_OF_FILE_ERROR?
【发布时间】:2020-03-22 12:42:41
【问题描述】:

我正在尝试通过 nginx 反向代理 http 服务器。该服务正在侦听端口 8123,我想在 443 上代理它。 我创建了一个这样的自签名证书:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

这里是完整的 nginx 配置:

events {
        worker_connections 768;
}

http {
        server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;

                ssl_certificate         /home/mcmsadm/cert.pem;
                ssl_certificate_key     /home/mcmsadm/key.pem;

                location / {
                        proxy_pass http://localhost:8123;
                }
        }
}

当我尝试使用 Firefox 连接到服务器时,它显示 PR_END_OF_FILE_ERROR。

我做错了什么? 谢谢!

编辑: 我在日志中发现了nginx错误信息(没想到):

SSL_CTX_use_PrivateKey_file("/home/mcmsadm/key.pem") failed 
(SSL: error:2807106B:UI routines:UI_process:processing error:while reading strings
error:0906406D:PEM routines:PEM_def_callback:problems getting password 
error:0907B068:PEM routines:PEM_read_bio_PrivateKey:bad password read 
error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)

我确实使用密码创建了证书,但是当我通过nginx -s reload 重新启动它时,nginx 会要求它。为了暂时解决这个问题,我将密码写在一个文件中,并将这一行添加到我的nginx.conf

ssl_password_file       /etc/nginx/pass;

有什么方法可以避免将密码写入文件?

【问题讨论】:

  • 请查看 nginx 错误日志以了解可能出现的问题。如果您不理解那里的信息,请将这些信息添加到问题中。
  • 这不是一个编程问题,我希望它会在 serverfault 或超级用户或 security.SX 上得到解决,但我找不到一个好的骗子。您可以使用 openssl rsa <k1 >k2openssl pkey <k1 >k2 从现有 OpenSSL 私钥文件中删除密码。您可以通过在openssl req -new -x509 ... 命令上添加-nodes创建 没有密码的私钥。请注意,它是具有密码而不是证书的密钥,尽管像 nginx 这样的服务器需要两者,所以这种区别不太重要。

标签: ssl nginx https


【解决方案1】:

对于遇到此问题的其他任何人.. 如果您忘记将 ssl 添加到侦听指令中,也会发生这种情况。 Chrome 显示 ERR_SSL_PROTOCOL_ERROR,而 Firefox 显示 PR_END_OF_FILE_ERROR

server {
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     ...
}

【讨论】:

  • 1 小时后,一个简单的答案减轻了我的痛苦。谢谢
【解决方案2】:

错误通常与浏览器无关。在我们的例子中,这也不是 nginx 的配置问题,而是防火墙的错误设置。所以从逻辑上讲,当我说这通常与浏览器无关时,服务器端而不是客户端。因此,它不是代理或 VPN。

【讨论】:

    【解决方案3】:

    给自己的注意:-d

    其中一个虚拟主机定义中缺少 default_server 配置(带有 ssl 或/和不带 ssl),如下所示:

    server {
         listen 80 default_server;
         listen 443 default_server;
         ...
    

    【讨论】:

      猜你喜欢
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多