Java 如何优雅地检测SSL

Java 如何优雅地检测SSL,java,http,ssl,Java,Http,Ssl,我有一个可以绑定到ssl或普通http的web服务。配置为了解服务器主机和端口的java客户端。当客户端连接时,我会像这样构造服务器端点。客户端不知道服务器是否在使用ssl-服务器总是绑定到单个端口,这样它要么安全,要么不安全。现在的问题是,如何让客户机在不引入其他参数的情况下发现这一点?我是否可以质询普通http请求,然后在某个异常上退回到ssl(或相反)?或者我必须为客户端显式引入新的连接参数?在服务器端,您可以使用类似于实现的机制。这可用于在同一端口上提供HTTP和HTTPS服务。这取决于

我有一个可以绑定到ssl或普通http的web服务。配置为了解服务器主机和端口的java客户端。当客户端连接时,我会像这样构造服务器端点。客户端不知道服务器是否在使用ssl-服务器总是绑定到单个端口,这样它要么安全,要么不安全。现在的问题是,如何让客户机在不引入其他参数的情况下发现这一点?我是否可以质询普通http请求,然后在某个异常上退回到ssl(或相反)?或者我必须为客户端显式引入新的连接参数?

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

从客户的角度(这就是你所问的),其后果是:

  • 客户先说话这一事实意味着它总是要先尝试。如果您试图将SSL/TLS与普通HTTP服务通信,则可能会出现某种异常,反之亦然
  • 如果服务器使用端口统一,您将无法可靠地发现
撇开端口统一不谈(毕竟这是一种罕见的情况),您可以尝试缓存过去尝试的结果

更根本的是,从安全的角度来看,不知道应该使用哪种协议会引入漏洞:您的系统将面临降级攻击(以类似的方式)。如果您的用户代理支持,则值得研究一下(尽管这需要用户代理记住哪些站点将与HTTPS一起使用)


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

这看起来像是我想要的。安全性是一个问题,否则首先就不会有SSL。然而,在这种特殊情况下,这并不是什么大问题,因为我们只需要对流量进行加密,身份验证不是问题。实际上,本例中的客户机实际上是一个服务器节点,它调用另一个同类节点(这是集群中的某种对话)。我只是需要一条很好的捷径来避免引入新参数。听起来没有可靠的方法可以做到这一点,但我会玩统一端口的东西,听起来很有趣,谢谢!服务器的身份验证(在加密之前)始终是一个问题,除非您确定最多只能有被动攻击者(窃听者)无法改变流量。是的,就是这样,窃听者在我的情况下不是威胁