1

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

我的情况如下:我有一个客户端程序连接到我们的服务器应用程序。这两个我们都可以完全控制。我们的客户端使用 https 将流发布到我们服务器上的 URL,然后服务器响应。目前(这是我正在尝试解决的问题)服务器有一个自签名证书。Java 不喜欢这样,仅用于测试,我们通过信任任何证书几乎完全忽略了证书。

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

既然我们可以控制两端,我们是否应该自己用密钥加密我们的数据,并在最后使用我们的密钥解密?还是有理由使用 SSL?

4

3 回答 3

3

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

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

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

您将在JSSE 参考指南中找到有关所有这些的更多详细信息。

这个对类似问题的回答应该为您提供正确执行所有这些操作的详细信息,尤其是keytool -import ...。)

于 2012-08-15T22:18:24.393 回答
0

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

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

于 2012-08-15T22:12:10.323 回答
0

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

于 2012-08-15T22:40:01.593 回答