需要有关自签名SSL和Java的建议

时间:2012-08-15 22:04:58

标签: encryption ssl self-signed

多次询问有关如何使用Java处理自签名证书的问题,并且经常提供实现。但是,我不确定这些实现会给我提供我正在寻找的安全/信任。

我的情况如下:我有一个客户端程序连接到我们的服务器应用程序。这两个我们完全控制。我们的客户帖子是使用https到我们服务器上的URL的流,服务器响应。目前(这是我正在尝试修复的)服务器具有自签名证书。 Java不喜欢这样,只有通过测试任何证书,我们完全忽略了证书。

我对SSL知之甚少。我的老板说我们可以使用我们的自签名证书,只要我们不建立我们的地下室,它就是安全的。关键的公众。这听起来对我来说是正确的,但很多帖子都说自签名证书自动容易受到中间人攻击。这是否意味着SSL发送了密码。密钥和证书?

由于我们可以控制两端,我们是否应该使用密钥加密我们的数据,并使用我们的密钥在最后解密它?或者有理由使用SSL吗?

3 个答案:

答案 0 :(得分:3)

不要盲目地信任任何证书(这会使连接容易受到MITM攻击),而是将Java客户端配置为信任该特定证书。自签名证书本身并不会使SSL / TLS连接容易受到MITM攻击,它们只是使其分发和信任评估更具体地针对此特定部署(即您必须手动配置它)。

你可以通过至少3种方式做到这一点(为你挑选最简单的方法,我建议要点2#):

  • 将服务器证书导入客户端的全局信任存储区(JRE目录中的lib/security/cacerts)。这将使所有应用程序都使用此JRE运行此证书。
  • 将服务器证书导入另一个信任库(可能是lib/security/cacerts的本地副本),并使此特定应用程序使用此信任库。这可以使用javax.net.ssl.trustStore系统属性完成。
  • 使您的客户端应用程序使用SSLContext初始化,并X509TrustManager配置为信任该证书:手动编写的内容或来自TrustManagerFactory的信任管理器,通过加载本地密钥库来初始化包含该特定证书(如前一种方法)。

您可以在JSSE Reference Guide中找到有关所有这些内容的更多详细信息。

This answer to a similar question应该为您提供正确执行所有操作的详细信息,尤其是keytool -import ...。)

答案 1 :(得分:0)

针对自签名证书的论据主要适用于Web应用程序。由于使用当前的基础架构,浏览器将无法验证您的自签名证书。

由于您可以控制客户端,因此您只需将您期望的证书硬编码到客户端即可。例如,您可以计算证书的sha1哈希值,并检查它是否与预期值匹配。这样你甚至不需要信任数百个CA.

答案 2 :(得分:0)

要实现安全通信,您需要先确保与正确的计算机通话。当客户端首次尝试建立安全连接时,它会ping服务器,服务器会以其证书进行响应。此时,必须在继续之前验证服务器证书。证书包括公钥和签名,可用于确保证书有效。例如,在Web浏览器中,这意味着检查它是否已被浏览器设置中列为可信任的权限签名,如果该检查失败,您将在浏览器中看到红色警告。在您的情况下,这意味着您已手动(或在代码中)将服务器证书添加到信任存储区,以便它受信任。