在Java中防止SSL证书验证

时间:2016-01-07 21:51:01

标签: java security ssl encryption

我一直在开发一个Client-Server应用程序,现在只使用标准的Sockets / ServerSockets。但是,我需要通过安全连接发送数据。我不认为SSL是一种选择,因为我将在线公开发布客户端/服务器应用程序,因此任何想要托管服务器的人都可以,他们用于使SSL的证书验证不相关,因为我必须捆绑证书在分布式服务器中。

所以我的问题是:处理这样的事情的正确方法是什么?我听说他们是禁用SSL验证的方法,但据我所知,这些方法在某种程度上被认为是hacky / deprecated(如果我错了,请纠正我)。

另一个想法是在任一端手动实施加密/解密(类似于SSL的工作方式,只是没有证书验证)。

或者,是否有他们为此设计的另一种方式/协议(或类似的东西)?

1 个答案:

答案 0 :(得分:2)

您要求使用SSL的替代方案,但是在安全性/加密方面,通常最好坚持使用标准方法 - 自制一个解决方案太容易了,因为它有很大的缺点。

话虽如此,您可以非常轻松地配置SSL以不对证书进行验证(主要是通过信任所有证书)。这通常是一个坏主意。

SSL通信有两件事;

  1. 加密通信,因此任何第三方都无法查看正在发送的内容。
  2. 建立服务器所有者的身份。
  3. 不验证证书意味着您不知道谁正在运行您刚刚连接到的服务器。一般来说,如果您担心加密与服务器的通信,您必须关心谁在套接字的另一端。如果您不确定服务器是否由您希望与之进行敏感通信的人员运行,则不应发送敏感数据,因为您试图隐藏的任何人可能正在读取套接字的另一端。

    如果您想要的只是加密通信,那么您应该将SSL与自签名证书一起使用。为了让客户满意,请调整客户端中的SSLContext以信任此类证书。

    如果你走这条路线,客户端应用程序将无法判断它正在与之交谈的服务器是真实的还是坏人设置的冒名顶替者。

    如果您想要完全保护SSL,您应该让每个服务器的运营商提供自己的证书来识别自己,并且您的客户端应该设置为仅与受信任的服务器通信。如果这是由公认的证书颁发机构(CA)颁发的证书,则最容易配置。但是,您可以使用自签名证书,但每个客户端都需要在cacerts文件中包含证书(或证书链的根目录)(或者您可以调整SSLContext以信任特定的自签名证书并使这部分客户端配置)。