4

我有一个可以绑定到 ssl 或纯 http 的 Web 服务。配置为知道服务器主机和端口的 java 客户端。当客户端连接时,我构建了像http://host:port/service这样的服务器端点。客户端不知道服务器是否使用 ssl - 服务器始终绑定到单个端口,因此它是否安全。现在,问题是如何让客户端在不引入其他参数的情况下发现这一点?我可以挑战普通的 http 请求,然后在某个例外情况下回退到 ssl(反之亦然)吗?或者我必须明确地为客户端引入新的连接参数?

4

1 回答 1

3

在服务器端,您可以使用像Grizzly 的端口统一实现这样的机制。这可用于在同一端口上提供 HTTP 和 HTTPS。这依赖于这样一个事实,即在这两种情况下,客户端首先交谈,然后发送 HTTP 请求或 SSL/TLS 客户端 Hello 消息。这在服务器端非常方便(尽管我不确定我是否建议在同一个端口上运行两个协议)。

从客户的角度来看(这就是您要问的),其后果是:

  • 客户先说话的事实意味着它总是必须先尝试。如果您尝试将 SSL/TLS 与纯 HTTP 服务通信,反之亦然,预计会出现某种异常。
  • 如果服务器使用端口统一,那么您将无法可靠地找出答案。

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

更根本的是,从安全的角度来看,不知道应该使用哪种协议会引入一个漏洞:您的系统将对降级攻击开放(与盲目依赖自动重定向类似)。如果您的用户代理支持HSTS,那么值得研究一下(尽管它需要用户代理记住哪些站点将与 HTTPS 一起使用)。

无论哪种方式,如果您担心安全性,您必须配置客户端以了解何时使用https://.

于 2012-04-27T10:00:56.147 回答