我正试图通过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;
有什么方法可以避免在文件中写入密码吗?
对于其他有此问题的人。。如果您忘记将ssl
添加到侦听指令中,也可能发生这种情况。Chrome显示ERR_SSL_PROTOCOL_ERROR
,而Firefox显示PR_END_OF_FILE_ERROR
。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
...
}
错误通常与浏览器无关。在我们的案例中,这也不是nginx的配置问题,而是防火墙的错误设置。所以从逻辑上讲,当我说这通常与浏览器无关时,服务器端而不是客户端。因此,它不是一个代理或VPN。
注意:-d
其中一个虚拟主机定义中缺少default_server配置(带ssl或/和不带ssl(,如下所示:
server {
listen 80 default_server;
listen 443 default_server;
...
在运行Apache和Nginx服务器时,我在Firefox中获得了PR_END_OF_FILE_ERROR,这两次都是因为我忘记在配置中监听端口443。始终仔细检查端口。