我有一个可能绑定到ssl或plain http的Web服务。配置为知道服务器主机和端口的java客户端。当客户端连接时,我构建服务器端点,如http://host:port/service。客户端不知道服务器是否使用ssl - 服务器始终绑定到单个端口,以便它是安全的或不安全的。现在,问题是如何让客户端在不引入其他参数的情况下发现它?我是否可以挑战普通的http请求,然后在某个异常时回到ssl(或反之)?或者我必须为客户明确引入新的连接参数?
答案 0 :(得分:3)
在服务器端,您可以使用Grizzly's port unification实施等机制。这可用于在同一端口上提供HTTP和HTTPS。这取决于以下事实:在两种情况下,客户端首先进行会话,并发送HTTP请求或SSL / TLS客户端Hello消息。它在服务器端非常方便(虽然我不确定我是否建议在同一端口上运行两个协议)。
从客户的角度(这是你要问的),其后果是:
除了端口统一(毕竟这是一种罕见的情况),您可以尝试缓存过去尝试的结果。
从根本上讲,从安全角度来看,不知道应该使用哪种协议会引入漏洞:您的系统会对降级攻击开放(与blindly relying on automatic redirects类似将)。如果您的用户代理支持HSTS,那么值得研究一下(尽管这需要用户代理记住哪些网站将与HTTPS一起使用)。
无论哪种方式,如果您担心安全问题,必须配置客户端以了解何时使用https://
。