继续尝试配置 nginx 以使用反向代理激进派在本地主机上运行,我现在收到 SSL 错误,因为我遵循了代理文件我创建了自己的 SSL 证书。
我的 nginx 配置的相关部分是
location /radicale/ {
proxy_pass http://127.0.0.1:9468/;
#proxy_pass http://46.105.31.182:9468/;
proxy_set_header X-Script-Name /radicale;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Remote-User $remote_user;
auth_basic "Radicale - Password Required";
auth_basic_user_file /etc/radicale/users;
proxy_ssl_verify on;
proxy_ssl_certificate /etc/radicale/client_cert.pem;
proxy_ssl_certificate_key /etc/radicale/client_key.pem;
proxy_ssl_trusted_certificate /etc/radicale/server_cert.pem;
}
...我对 SSL 证书的基本配置是...
[server]
hosts = 127.0.0.1:9468
ssl = true
certificate = /etc/radicale/server_cert.pem
key = /etc/radicale/server_key.pem
certificate_authority = /etc/radicale/client_cert.pem
[auth]
type = http_x_remote_user
htpasswd_filename = /etc/radicale/users
htpasswd_encryption = bcrypt
如果我去网站https://####/radicale我被提示输入用户名和密码进行身份验证,但 nginx 返回以下错误...
upstream prematurely closed connection while reading response header from upstream, client: 62.253.154.162, server: #####, request: "GEET /radicale/ HTTP/2.0", upstream: "http://127.0.0.1:9468/", host: "####"
...以及上游 Radicale 报告...
ERROR: An exception occurred during request: SSL handshake failed: [SSL: HTTP_REQUEST] http request (_ssl.c:1076)
如果我禁用 Radicale 和 nginx 上的反向代理之间的 SSL,那就没问题了,我可以访问 WebUIhttps://####/radicale我可以登录。但如果我启用它,那么https://####/radicale然后出现一个弹出框要求我输入用户名/密码,浏览器报告502 Bad Gateway
上述错误再次出现。
我确实拥有 LetsEncrypt 证书,并且在我的域上运行,这会与用于反向代理的 SSL 证书造成某种冲突吗?
答案1
根据Nginx 文档 proxy_ssl_certificate
proxy_ssl_certificate_key
如果你想要NGINX 使用提供的 SSL 客户端证书向上游服务器表明自己的身份。您还需要配置上游服务器,要求所有传入 SSL 连接都使用客户端证书
我相信 Radicale 没有通过客户端证书处理身份验证,并且您的 Radicale 服务器正在监听,127.0.0.1
因此通过在 Radicale 上配置 SSL,您基本上是在尝试加密本地主机上的流量。
您的配置中还有另一点。
location /radicale/ {
...
auth_basic "Radicale - Password Required";
auth_basic_user_file /etc/radicale/users;
...
}
您的身份验证部分已由 Radicale 本身处理。在反向代理上添加这些行毫无意义。
我建议:
- 在 Radicale 上禁用 SSL 并让反向代理使用 LetsEncrypt 处理 SSL。
- 禁用反向代理上的“基本身份验证”并让 Radicale 处理用户身份验证。
如果你仍然想加密反向代理和 Radicale 之间的流量,只需删除客户端证书部分并添加proxy_ssl_name
location /radicale/ {
proxy_pass http://127.0.0.1:9468/;
#proxy_pass http://46.105.31.182:9468/;
proxy_set_header X-Script-Name /radicale;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Remote-User $remote_user;
proxy_ssl_name "####";
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/radicale/server_cert.pem;
}
proxy_ssl_name
是为了避免错误
upstream prematurely closed connection while reading response header from upstream, client: 62.253.154.162, server: #####, request: "GEET /radicale/ HTTP/2.0", upstream: "http://127.0.0.1:9468/", host: "####"
这是因为默认情况下用于验证 SSL 证书名称的名称是 $proxy_host。
答案2
我知道这是一个老话题,但根据记录,我是这样做的......
我使用一个单独的子域,如radicale.example.com,脚本位于/
其中,因此X-Script-Name
设置就是这样。我使用 letsencrypt/certbot 作为证书。
nginx 节为:
server {
server_name radicale.example.com;
# (all :80 connections are being redirected to :443)
listen 443 ssl;
listen [::]:443 ssl;
access_log /var/log/nginx/radicale/access.log main;
error_log /var/log/nginx/radicale/error.log info;
location / {
proxy_pass http://localhost:5232/;
proxy_set_header X-Script-Name /;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass_header Authorization;
}
ssl_certificate /etc/letsencrypt/live/radicale.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/radicale.example.com/privkey.pem; # managed by Certbot
}
Radicale 配置中不需要 SSL 设置,我让 Radicale 处理用户密码。