我有一个 Web 服务,可以绑定到 ssl 或普通 http。 Java 客户端配置为了解服务器主机和端口。当客户端连接时,我构建服务器端点,例如http://主机:端口/服务。客户端不知道服务器是否使用 ssl - 服务器始终绑定到单个端口,因此它要么安全,要么不安全。现在的问题是如何让客户端在不引入其他参数的情况下发现这一点?我可以挑战普通的 http 请求,然后在出现特定异常时回退到 ssl(或反之亦然)吗?或者我必须明确为客户端引入新的连接参数?
在服务器端,您可以使用类似的机制Grizzly 的港口统一执行。这可用于在同一端口上提供 HTTP 和 HTTPS 服务。这依赖于这样一个事实:在这两种情况下,客户端首先进行对话,然后发送 HTTP 请求或 SSL/TLS 客户端 Hello 消息。这在服务器端非常方便(尽管我不确定我是否建议通常在同一端口上运行两个协议)。
从客户的角度来看(这就是您所问的问题),其后果是:
- 客户先说话的事实意味着它总是必须先尝试。如果您尝试将 SSL/TLS 与普通 HTTP 服务进行对话,则可能会出现某种异常,反之亦然。
- 如果服务器使用端口统一,您将无法可靠地找到答案。
除了端口统一之外(毕竟这种情况很少见),您可以尝试缓存过去尝试的结果。
更根本的是,从安全角度来看,不知道应该使用哪种协议会引入漏洞:您的系统将容易受到降级攻击(以类似的方式盲目依赖自动重定向会)。如果您的用户代理支持HSTS,值得研究一下(尽管它需要用户代理记住哪些站点将与 HTTPS 一起使用)。
无论哪种方式,如果您担心安全性,您must配置客户端以了解何时使用https://
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)