我已经得到了其可以连接到任何SSL或纯HTTP web服务。 在Java客户端配置为知道服务器的主机和端口。 当客户端连接,我构建服务器端点喜欢的http://主机:端口/服务 。 服务器是否使用SSL客户端没有知识 - 服务器总是绑定到一个单一的端口,因此它的安全或没有。 现在的问题是如何让客户发现此不引入另一个参数? 我可以挑战普通HTTP请求,然后回落到SSL(或反之亦然)上有一定的例外? 或者,我必须明确地为客户推出新的连接参数?
Answer 1:
在服务器端,你可以使用这样的机制灰熊的港口统一实施。 这可以用来服务于HTTP和HTTPS的同一端口上。 这依赖于这样的事实,在这两种情况下,客户会谈第一,要么发送一个HTTP请求或SSL / TLS客户端Hello消息。 这是这个在服务器端很方便(虽然我不知道我会一般在同一端口上建议运行两个协议)。
但从客户的角度(这是你问什么),则后果是:
- 客户端先发言,这意味着它总是要首先尝试。 如果你试图说服SSL / TLS为纯HTTP服务,反之亦然期望某种异常。
- 如果服务器使用的端口统一,也没有办法你要能够找出可靠。
端口统一预留(这是一个罕见的情况毕竟),你可以尝试过去尝试的缓存结果。
更为重要的是,从安全角度考虑,不知道应该使用哪种协议,引入了一个漏洞:系统将开放到降级攻击 (类似的方式一味地依赖于自动重定向会)。 如果您的用户代理支持HSTS ,这将是值得期待成(尽管它会要求用户代理来记住哪些网站是与HTTPS使用)。
无论哪种方式,如果你担心安全,您必须配置客户端知道什么时候使用https://
。
文章来源: How to detect SSL gracefully