2012-04-27 45 views
4

我有一个web服务可能绑定到ssl或纯http。 Java客户端配置为了解服务器主机和端口。当客户端连接时,我构建了服务器端点,如http://host:port/service。客户端不知道服务器是否使用ssl - 服务器始终绑定到单个端口,以使其安全或不安全。现在,问题是如何让客户端在不引入其他参数的情况下发现这一点?我可以质疑纯HTTP请求,然后回退到ssl(或反过来)在某个异常?或者我必须明确地为客户端引入新的连接参数?如何正常检测SSL

回答

3

在服务器端,您可以使用像Grizzly's port unification实现的机制。这可以用于在同一端口上提供HTTP和HTTPS。这取决于这样一个事实,即在这两种情况下,客户端都会首先进行对话并发送HTTP请求或SSL/TLS客户端Hello消息。这在服务器端非常方便(尽管我不确定推荐在同一个端口上运行两个协议)。

但从客户的角度(这是你问什么),那的后果是:

  • 事实上,客户端先发言意味着它将总是首先尝试。如果您尝试将SSL/TLS转换为普通的HTTP服务,反之亦然,那么预计会出现某种异常。
  • 如果服务器使用端口统一,那么您将无法可靠地发现问题。

抛开端口统一(毕竟这是一种罕见的情况),您可以尝试缓存过去尝试的结果。

更为重要的是,从安全角度考虑,不知道应该使用哪种协议,引入了一个漏洞:系统将开放到降级攻击(以类似的方式为blindly relying on automatic redirects会)。如果您的用户代理支持HSTS,那么值得研究一下(尽管它需要用户代理记住哪些站点将与HTTPS一起使用)。

无论哪种方式,如果您关心安全性,您必须必须配置客户端知道何时使用https://

+0

这看起来像我以后的事情。安全是一个问题,否则首先不会有SSL。但是,在这种特殊情况下,这不是什么大问题,因为我们需要的只是加密流量,认证不是问题。事实上,在这种情况下,客户端实际上是一个服务器节点,它调用同一类型的另一个节点(这是群集中的某种谈话)。我只是需要一个很好的捷径来避免引入一个新的参数。听起来这样做没有可靠的方法,但我会玩弄港口统一thingy,听起来很有趣,谢谢! – Dima 2012-04-27 10:25:42

+0

服务器的身份验证(加密之前)始终是一个问题,除非您确定最多可以拥有无​​法根本改变流量的被动攻击者(窃听者)。 – Bruno 2012-04-27 10:42:31

+0

是的,就是这样,窃听者在我的情况下不是威胁 – Dima 2012-04-27 15:09:43