Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl 使用HTTP/HTTPS混合代理目标站点时的PingAccess问题_Ssl_Https_Proxy_Pingaccess - Fatal编程技术网

Ssl 使用HTTP/HTTPS混合代理目标站点时的PingAccess问题

Ssl 使用HTTP/HTTPS混合代理目标站点时的PingAccess问题,ssl,https,proxy,pingaccess,Ssl,Https,Proxy,Pingaccess,我正在尝试将PingAccess设置为代理(让我们调用PA主机) pagateway),用于共享Web会话的两个应用程序。我希望所有访问都通过PA pagateway并使用HTTPS,但后端系统不是HTTPS 我定义了两个站点,app1:8080和app2:8080。两者都设置为“安全”=否,“使用目标主机头”=是 我在端口5000和5001上定义了侦听器,它们都设置为“安全”=是 我发现的第一个问题是,当我以这种方式访问任一应用程序时(例如,转到https://pagateway:5000),

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

我定义了两个站点,
app1:8080
app2:8080
。两者都设置为“安全”=否,“使用目标主机头”=是

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

我发现的第一个问题是,当我以这种方式访问任一应用程序时(例如,转到
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
遇到了意外主机头的问题

在另一个变体中,我关闭了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)
有人知道我做错了什么吗?老实说,我对重定向到实际的服务器名称感到有点惊讶,但在那之后,我对从这里走到哪里感到困惑

任何帮助都将不胜感激。

您就此联系过吗?这听起来像是需要深入挖掘的东西——但我可以提出一些高层次的建议:

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

一个常见的解决方案是将目标主机头设置为False,这样它将从浏览器接收未经修改的请求,并且后端服务器应该知道将自己表示为False(如果它在代理后表现良好)

如果后端服务器不能做到这一点(听起来好像不能做到),您应该考虑为该应用程序分配重写规则。有关它们的更多详细信息,请访问:。“重写响应头规则”尤其会重写HTTP重定向中的位置头


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

如果在末尾添加一个尾随斜杠(),是否存在相同的问题?您的应用程序服务器将根据它认为是真实主机的内容重写URL。这是为了解决一些与目录列表相关的安全问题

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

  • 添加强制应用程序服务器使用外部主机名的全局规则。下面是一个示例Groovy脚本:
  • def头=exc?请求?头

    header?.setHost(“pf.pingdemo.com:443”)

    任何事

  • 在Tomcat的server.xml中,向连接添加scheme=“https”
  • 
    
    干杯,
    Tam

    谢谢@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支持,因为我认为这有点奇怪——不应该使用重写规则来实现。当我说“添加全局规则”时,我的意思是“向应用程序添加全局PingAccess规则”Hi Tam,从我可以看出,尾部斜杠似乎没有改变行为。事实上,当PingAccess回调URL响应重定向时,尾部斜杠似乎消失了,例如,带有
    /webapp1/
    的初始请求从PA回调变为
    /webapp1
    。另外,Groovy脚本是否有效地完成了与取消选中“使用目标主机头”框相同的事情?不过我同意,底层应用服务器似乎需要HTTPS,或者我需要URL和响应重写规则来进行映射。
    <Connector port="8080" protocol="HTTP/1.1"
    
               connectionTimeout="20000"
    
               redirectPort="443" scheme="https" />