【问题标题】:SSL Certificate without host name in it没有主机名的 SSL 证书
【发布时间】:2011-01-25 09:34:44
【问题描述】:

我已经使用 keytool 实现了一个带有服务器和客户端身份验证的 Web 服务。问题是如果我没有在其中包含主机名,则此身份验证不起作用。例如:

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost"

但我不需要,也不喜欢通过主机或 IP 进行验证。有什么办法可以避免吗?

谢谢。

【问题讨论】:

  • 对于其他所有人,我想指出,据我了解,证书固定是一个用例,您无需知道主机名即可保持安全性。 (但是,我仍然难以说服我的客户端应用程序。)

标签: java certificate x509certificate keytool


【解决方案1】:

作为其要求的一部分,SSL 必须验证证书 CN 是否与您要连接的主机名匹配。如果 CN 不匹配,则浏览器将假定您连接到错误的主机和对象。

没有办法解决这个问题。

【讨论】:

  • 严格来说这不是 SSL/TLS 要求(不在 SSL/TLS 规范中)。然而,它在RFC 2818(HTTPS)中,并在RFC 6125(比这个答案更新)中推广到使用 SSL/TLS 和 X.509 证书(即最常见的使用模式)的其他协议。使用主题备用名称扩展也优于使用主题可分辨名称的 CN RDN。
【解决方案2】:

我同意其他发帖者的观点:如果您使用 SSL,您几乎肯定想要将主机名验证作为 SSL 安全功能集的一部分。

也就是说,根据您使用的客户端,很可能有办法解决这个问题。工程师会绕过测试环境中的主机名验证,用于调试、原型设计等。如果您使用的是通过 HttpsURLConnection 连接的 Java 客户端,只需将以下内容添加到客户端类中即可:

static {
    HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){
            public boolean verify(String string,SSLSession ssls) {
            return true;
        }
    });
}

【讨论】:

    【解决方案3】:

    标准逻辑是:如果您不需要保护您的数据,请不要使用 SSL。如果您确实需要保护它,那么您需要知道您正在连接的主机。中间不应该有。

    但是在某些内部环境中,您可能对网络和配置有足够的控制权,不必担心。

    如果您是后一种情况,则解决方案取决于您使用的客户端库。如果您使用的是 HTTP 客户端,请阅读SSL config guide。可能你不需要实现自己的SecureProtocolSocketFactory,直接使用EasySSLProtocolSocketFactory即可。

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2020-02-12
      • 2020-06-01
      • 2020-04-22
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多