HTTP/HTTPS 混合代理目标站点的 PingAccess 问题
PingAccess issues with proxying target sites with HTTP/HTTPS mix
我正在尝试将 PingAccess 设置为代理(让我们调用 PA 主机
pagateway
) 用于共享 Web Session 的几个应用程序。我希望所有访问都通过 PA 网关并使用 HTTPS,但后端系统不是 HTTPS。
我定义了两个站点,app1:8080
和 app2: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
之间,或者 pagateway
和 app1
之间)。我猜 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.
解决此问题的说明
- 添加强制应用程序服务器使用面向外部的主机名的全局规则。这是一个示例 Groovy 脚本:
def header = exc?.request?.header;
header?.setHost("pf.pingdemo.com:443");
anything();
- 在Tomcat的server.xml中,添加scheme="https"连接:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" scheme="https" />
干杯,
谭
我正在尝试将 PingAccess 设置为代理(让我们调用 PA 主机
pagateway
) 用于共享 Web Session 的几个应用程序。我希望所有访问都通过 PA 网关并使用 HTTPS,但后端系统不是 HTTPS。
我定义了两个站点,app1:8080
和 app2: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
之间,或者 pagateway
和 app1
之间)。我猜 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.
解决此问题的说明- 添加强制应用程序服务器使用面向外部的主机名的全局规则。这是一个示例 Groovy 脚本:
def header = exc?.request?.header;
header?.setHost("pf.pingdemo.com:443");
anything();
- 在Tomcat的server.xml中,添加scheme="https"连接:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" scheme="https" />
干杯, 谭