Nginx 反向代理后面的 Tomcat - 收件人端点与 SAML 响应不匹配

Posted

技术标签:

【中文标题】Nginx 反向代理后面的 Tomcat - 收件人端点与 SAML 响应不匹配【英文标题】:Tomcat behind Nginx reverse proxy - Recipient endpoint doesn't match with SAML response 【发布时间】:2021-05-20 17:51:49 【问题描述】:

以下是组件:

    tomcat 上的 Spring MVC Web 应用程序 Azure AD IdP nginx 反向代理

SSO 无需 Nginx 反向代理即可工作,因此我认为我的应用程序和 AzureID 的配置已正确完成。 但是,当 nginx 反向代理发挥作用时,我遇到了一个错误。这是日志错误

2021-02-17 19:05:14,690 172.18.0.2 /saml/SSO/alias/my_app [错误] org.opensaml.common.binding.decoding.BaseSAMLMessageDecoder - SAML 消息预期目标端点 https://myapp.example.com/saml/SSO/alias/my_app 不匹配收件人端点@9​​87654322@

不知道为什么 http 而不是 https 被上游传递给 tomcat。我遵循最佳实践为 nginix 设置 SSL。这是 myapp 的配置

server 
    listen 80;
    server_name   _;
    return 301 https://$host$request_uri;


server 
    listen 443 ssl;

    server_name myapp.example.com;

    access_log logs/myapp.access;
    error_log logs/myapp.error error;

    location / 

        proxy_set_header    X-Forwarded-Host    $host;
        proxy_set_header    X-Forwarded-Server  $host;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   https;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    Host                $host;
        proxy_pass          http://myapp:8180/;
    

我有什么遗漏吗?任何 cmets 将不胜感激。

编辑:快速解决方案 问题是 tomcat 不会将 X-Forwarded-Proto 处理到 servlet。解决这个问题的方法很少。最简单的方法是将方案属性添加到 server.xml 中的

属性定义可以参考tomcat配置文档。 https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               proxyName="myapp.example.com"
               proxyPort="443"
               **scheme="https"** />

【问题讨论】:

【参考方案1】:

问题在于 tomcat 不会将 X-Forwarded-Proto 处理到 servlet。解决这个问题的方法很少。最简单的方法是在 server.xml 中的 Connector 标签中添加 scheme 属性

属性定义可以参考tomcat配置文档。 https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               proxyName="myapp.example.com"
               proxyPort="443"
               **scheme="https"** />

【讨论】:

以上是关于Nginx 反向代理后面的 Tomcat - 收件人端点与 SAML 响应不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理2--配置文件配置

Nginx反向代理400错误

Nginx反向代理均衡负载

Nginx反向代理400错误

nginx+tomcat简单反向代理+nginx监控

nginx反向代理多个tomcat服务