【问题标题】:PingAccess issues with proxying target sites with HTTP/HTTPS mix使用 HTTP/HTTPS 混合代理目标站点的 PingAccess 问题
【发布时间】:2015-11-20 00:59:27
【问题描述】:

我正在尝试将 PingAccess 设置为代理(让我们调用 PA 主机 pagateway) 用于共享 Web 会话的几个应用程序。我希望所有访问都通过 PA 网关并使用 HTTPS,但后端系统不是 HTTPS。

我定义了两个站点,app1:8080app2:8080。两者都设置为 "secure" = no 和 "use target host header" = yes。

我在端口 5000 和 5001 上定义了侦听器,它们都设置为“安全”= yes。

我发现的第一个问题是,当我以这种方式访问​​任一应用程序时(例如转到 https://pagateway:5000),在成功使用 PingFederate 进行身份验证后,我最终会被重定向到实际的底层主机名(例如 http://app1:8080),这意味着与应用程序的任何后续交互都不是通过 PingAccess。对于网络外的用户,他们甚至无法做到这一点,因为 app1 主机甚至不可见或不可访问。

我想也许我需要将“使用目标主机标头”关闭为 false,但 Chrome 提示我下载一个包含 NAK、ETX、ETX、NUL、STX、STX 代码的文件,并且在 PA 日志中我得到一个SSL 错误:

2015-11-20 11:13:33,718 DEBUG [6a5KYac2dnnY0ZpIl-3GNA] com.pingidentity.pa.core.transport.http.HttpServerHandler:180 - IOException reading sourceSocket
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710)
    ...

我不确定 SSL 错误究竟来自进程的哪一部分(在浏览器和 pagateway 之间,或在 pagatewayapp1 之间)。我猜可能app1 遇到了意外的主机头问题...

在另一个变体中,我关闭了 PA 侦听器上的 SSL(我还必须将 PingFederate 客户端设置中的 PingAccess 回调 URL 更改为 http)。但是当我通过http://pagateway:5000 访问它时,我在浏览器中收到了一条通用的 PingFederate 错误消息,并且在 PA 日志中出现了另一个错误:

2015-11-20 11:37:25,764 DEBUG [DBxHnFjViCgLYgYb-IrfqQ] com.pingidentity.pa.core.interceptor.flow.InterceptorFlowController:148 - Invoking request handler: Scheme Validation for Request to [pagateway:5000] [/]
2015-11-20 11:37:25,764 DEBUG [DBxHnFjViCgLYgYb-IrfqQ] com.pingidentity.pa.core.interceptor.flow.InterceptorFlowController:200 - Exception caught.  Invoking abort handlers
com.pingidentity.pa.sdk.policy.AccessException: Invalid request protocol.
    at com.pingidentity.pa.core.interceptor.SchemeValidationInterceptor.handleRequest(SchemeValidationInterceptor.java:61)

有人知道我做错了什么吗?老实说,我对重定向到实际服务器名称感到有些惊讶,但在那之后,我不知道从哪里开始。

任何帮助将不胜感激。

【问题讨论】:

    标签: ssl https proxy pingaccess


    【解决方案1】:

    您是否就此联系过our support?这听起来像是需要深入挖掘的东西 - 但我可以提出一些高级建议:

    查看浏览器跟踪以确定重定向何时发生到后端站点。通常这是因为来自后端 Web 服务器的重定向中有一个 Location 标头,该标头(本质上)是一个绝对 URL,但指向它而不是面向外部的主机名。

    一个常见的解决方案是将 Target Host Header 设置为 False - 这样它就会从浏览器接收未经修改的请求,并且后端服务器应该知道将自己表示为那个(如果它在代理后面表现得很好)。

    如果后端服务器不能这样做(听起来好像不能) - 您应该考虑为该应用程序分配重写规则。有关它们的更多详细信息,请访问:https://support.pingidentity.com/s/document-item?bundleId=pingaccess-52&topicId=reference%2Fui%2Fpa_c_Rewrite_Rules_Overview.html。特别是“重写响应头规则”将重写 HTTP 重定向中的 Location 头。

    仅供参考 - “无效的请求协议”。您在描述底部看到的错误可能是由于您定义的应用程序上的“需要 HTTPS”标志。

    【讨论】:

    • 谢谢@Scott T。我还没有联系支持,因为我们正在试用许可证,订单正在进行中,产品支持将于 12 月 1 日开始。启用“使用目标主机头”后,浏览器跟踪显示重定向到https://pagateway:5000/webapp,然后重定向到http://app1:8080。如果我关闭“使用目标主机头”,它会显示相同的重定向到https://pagateway:5000/webapp,然后重定向到http://pagateway:5000/webapp。这里的问题是 PA 侦听器需要 HTTPS,但是因为它正在从 HTTPS 重定向到 HTTP,所以它失败了。
    • 感谢有关 URL 响应重写的提示 - 如果我启用“使用目标主机标头”并输入 URL 重写规则,它会成功处理 HTTPS 和 HTTP 之间的协议更改,并且还会留下指向 PA 代理的浏览器!不过,我仍会跟进 Ping 支持,因为我认为这有点奇怪——它不应该采用重写规则来完成这项工作。
    【解决方案2】:

    如果您在末尾添加斜杠 (https://pagateway:5000/webapp/),您是否会遇到同样的问题?您的应用程序服务器将根据它认为是真正的主机来重写 URL。这是为了解决一些与目录列表相关的安全问题。

    您使用的是哪个应用程序服务器?所有应用服务器都是唯一的,但我将提供有关如何使用 Tomcat 解决此问题的说明。

    1. 添加强制应用程序服务器使用面向外部的主机名的全局规则。这是一个示例 Groovy 脚本:

    def header = exc?.request?.header;

    header?.setHost("pf.pingdemo.com:443");

    任何东西();

    1. 在 Tomcat 的 server.xml 中,将 scheme="https" 添加到连接中:
    <Connector port="8080" protocol="HTTP/1.1"
    
               connectionTimeout="20000"
    
               redirectPort="443" scheme="https" />
    

    干杯, 谭

    【讨论】:

    • 当我说“添加全局规则”时,我的意思是“向应用程序添加全局 PingAccess 规则”
    • 嗨,谭,据我所知,斜杠似乎并没有改变行为。事实上,当 PingAccess 回调 URL 响应重定向时,尾部斜杠似乎消失了,例如带有/webapp1/ 的初始请求从PA 回调变为/webapp1。此外,您的 Groovy 脚本是否与未选中“使用目标主机头”框有效地做同样的事情?不过我同意,似乎底层应用服务器需要是 HTTPS,或者我需要 URL 和响应重写规则来进行映射。
    猜你喜欢
    • 2010-10-20
    • 2012-05-31
    • 1970-01-01
    • 2016-09-04
    • 2015-08-13
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多