2012-08-15 45 views
1

关于如何处理使用Java的自签名证书并经常提供实现,已经问了很多次问题。但是,我不确定这些实现是否会给我所需的安全/信任。需要关于自签名SSL和Java的建议

我的情况如下:我有一个客户端程序连接到我们的服务器应用程序。这两个我们都有完全的控制权。我们的客户帖子使用https到我们的服务器的URL,并且服务器响应。目前(这正是我想解决的问题)服务器有一个自签名证书。 Java并不喜欢这种情况,并且仅仅用于测试,我们几乎完全忽视了任何证书的认证。

我对SSL有一点了解。我的老板说我们可以使用我们的自签名证书,只要我们不加密,它就会安全。关键公众。这听起来对我来说是正确的,但很多帖子都说自签名证书会自动容易受到中间人攻击。这是否意味着SSL发送crypt。钥匙连同证书?

既然我们对两端都有控制权,那么我们是否应该用密钥对自己的数据进行加密,然后用密钥对它进行解密?还是有理由使用SSL?

+0

不是这方面的专家,但我相信如果您从证书中请求特定的公钥(而不是相信自签名或由特定发行者签署),您可以避免中间人攻击。 – antlersoft 2012-08-15 22:11:21

回答

3

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

可以在至少3种方式做到这一点(挑最简单的一个你,我建议子弹点#2):

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

你会在JSSE Reference Guide找到更多关于这一切的细节。

This answer to a similar question应该给你详细的做所有这些,特别是keytool -import ...。)

+0

使用keytool修改密钥库似乎并不现实,因为这不在代码库中。我想在运行时使用它,所以在运行时,证书不在密钥库中。 – Dave 2012-08-15 22:27:53

+0

您可以使用第三种方法(请参阅链接中的erickson答案),并从您的类路径中的输入流中加载的新密钥库加载您的信任库,如果您想将其与您的代码一起分发。第二种方法通常不是什么大问题,正如我所说的那样,创建'cacerts'的本地副本(或者创建一个新的密钥库)并仅为该应用程序设置系统属性。它不一定是影响所有应用程序的文件。这只是配置,无论如何你都必须配置这种或那种方式。 – Bruno 2012-08-15 22:45:37

0

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

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

0

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