【问题标题】:Ignoring "wrong name on certificate" type error in Java ssl connection忽略 Java ssl 连接中的“证书上的错误名称”类型错误
【发布时间】:2011-12-08 13:38:02
【问题描述】:

我正在尝试建立与 https url 的连接,但由于它仍在测试中,因此 url 会重定向到测试环境,导致浏览器向用户提示一条消息,粗略地说证书是受信任的,有效,但与域名不匹配,如果他们想继续。我很难在 Java 中处理这个问题。我找到的所有答案都建议使用这样的 TrustManager

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(X509Certificate[] certs, String authType) {
        return;
    }

    public void checkServerTrusted(X509Certificate[] certs, String authType) {
        return;
    }
}};

sslContext.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom());

但这并没有改变任何东西。

身份验证涉及在读取客户端证书的私钥时输入密码,这在浏览器和我的应用程序中的工作方式相同且正确,在此身份验证之后,浏览器中会弹出提示或连接返回'我的应用程序中的 bad_certificate' 错误。是否有其他方法可以完全忽略域验证或出现相同的提示?

为了清楚起见,我的应用程序不会导致出现密码提示,因为我对其进行了编程或其他任何东西,我认为它只是源于 Windows 检测到我的应用程序试图访问证书的私钥,所以我假设第二个prompt 将以类似的方式工作,但我还没有找到任何参数来实现这一点。

【问题讨论】:

    标签: java ssl x509certificate


    【解决方案1】:

    让我警告你,如果你这样做是为了测试你的代码,那么这不是正确的做法。浏览器通常会忽略错误并提示用户是否愿意尽管出现问题继续。如果他决定继续,那么他拥有决定权。 在您的 java 应用程序中,如果您使用的是 JDK 提供的默认 SSLSocketFactory,那么 SSL 会话仅在 SSL 握手成功时才建立。这是出于安全原因。如果您需要像浏览器这样的功能;要不考虑安全问题继续进行,那么您需要拥有自己的自定义实现。或者最好不要使用 SSL。

    【讨论】:

    • 这是一个有效的警告。但是,我认为这不是一个答案:在某些情况下,Java 代码需要连接到合法的 HTTPS URL,Java 代码(就像任何好的浏览器一样)告诉用户“证书中的名称 X 不匹配URL 中的主机名 Y”,以及用户希望在哪里建立连接。
    【解决方案2】:

    是否有其他方法可以忽略域验证...

    是的。见 Java 的HostnameVerifier 接口:

    在握手期间,如果 URL 的主机名和服务器的 识别主机名不匹配,验证机制可以调用 返回此接口的实现者以确定此连接是否 应该允许。

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 2015-04-22
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 2019-07-14
      • 2014-05-06
      • 2017-03-28
      相关资源
      最近更新 更多