【问题标题】:Need advice on Self-Signed SSL and Java需要关于自签名 SSL 和 Java 的建议
【发布时间】:2012-08-12 06:17:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不是这方面的专家,但我相信如果您要求证书中的特定公钥(而不是信任自签名或由特定的发行人)。

标签: encryption ssl self-signed


【解决方案1】:

不要盲目地信任任何证书(这会使连接容易受到 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 ...。)

【讨论】:

  • 使用keytool 来修改keystore 似乎不太现实,因为这在代码库之外。我想在运行时拥有它,所以在运行后证书不在密钥库中。
  • 您可以使用第 3 种方法(请参阅链接中的 erickson 的答案),如果您想将其与您的代码一起分发,则可以从从来自您的类路径的输入流中加载的新密钥库加载您的信任库。第二种方法通常没什么大不了的,正如我所说,制作cacerts 的本地副本(或创建新的密钥库)并仅为该应用程序设置系统属性。它不一定是影响所有应用程序的文件。这只是配置,无论如何您都必须以一种或另一种方式进行配置。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多