HTTP/HTTPS 混合代理目标站点的 PingAccess 问题

PingAccess issues with proxying target sites with HTTP/HTTPS mix

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

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

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

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

我想也许我需要将 "Use target host header" 关闭为 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 可能遇到意外主机 header...

在另一个变体中,我关闭了 PA 侦听器上的 SSL(我还必须将 PingFederate 客户端设置中的 PingAccess call-back 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)

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

如有任何帮助,我们将不胜感激。

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

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

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

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

仅供参考 - 您在描述底部看到的 "Invalid request protocol." 错误可能是由于您定义的应用程序上的 "Require HTTPS" 标志造成的。

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

您使用的是哪个应用程序服务器?所有应用程序服务器都是独一无二的,但我将提供有关如何使用 Tomcat.

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

def header = exc?.request?.header;

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

anything();

  1. 在Tomcat的server.xml中,添加scheme="https"连接:
<Connector port="8080" protocol="HTTP/1.1"

           connectionTimeout="20000"

           redirectPort="443" scheme="https" />

干杯, 谭