【问题标题】:Verifying SSL Certificate's Common Name in Java在 Java 中验证 SSL 证书的通用名称
【发布时间】:2010-12-23 03:43:44
【问题描述】:

我正在为我的服务器上的端口 12345 打开一个安全 SSL 套接字。我现在使用的是自签名证书。我将证书安装到我的服务器密钥库和客户端信任库中;很好,废话。

我正在构建这个例子:http://www.exampledepot.com/egs/javax.net.ssl/Client.html

客户端正确验证服务器是否有签名证书。客户端似乎没有验证提供的证书 CN(通用名称)是否与我正在连接的服务器的主机名匹配。显然,如果不要求它与请求的域匹配,那么获得签名证书并不难。

当我安装我的证书(使用 keytool --import)时,我是否将它安装为根级证书?我是否需要使用第一个证书的主密钥签署第二个证书?为什么 TrustManager 不验证公用名?

我希望这是有道理的,我并没有想太多。

谢谢!

更新:Java SSL 似乎需要手动验证证书? (http://www.java2s.com/Open-Source/Java-Document/Net/Apache-common-HttpClient/org/apache/commons/httpclient/contrib/ssl/StrictSSLProtocolSocketFactory.java.htm) 这真的是真的吗?我本来希望默认值是安全的,而任何更少的东西都需要显式覆盖。我很惊讶。有人可以确认吗?

【问题讨论】:

  • 默认是遵守 RFC(s)。

标签: java sockets ssl-certificate


【解决方案1】:

验证主机名取决于应用程序。在 HTTPS 的情况下,它通过 HttpsURLConnectionHostnameVerifier 类内置到 Java 中。如果您直接使用SSLSocket,这取决于您,通常通过HandshakeCompletedListener.

【讨论】:

    【解决方案2】:

    你可能有这样的代码吗?这将忽略您提到的主机名不匹配。

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

    否则,正如this link 中的一位 cmets 所说,你会得到一个异常 HTTPS hostname wrong: should be...

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 2019-06-28
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多