nginx 反向代理到radicale SSL 错误

nginx 反向代理到radicale SSL 错误

继续尝试配置 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 处理用户密码。

相关内容