gpt4 book ai didi

java - 为什么我得到 "No name matching found"CertificateException?

转载 作者:行者123 更新时间:2023-11-28 21:53:27 26 4
gpt4 key购买 nike

据我所知,在大多数情况下,此异常说明证书所有者 CN(公用名)与 url 中的主机名不匹配。但是在我的情况下,它们确实匹配,但仍然会出现异常。

远程服务器证书层次结构是:

  1. 带有 CN=sms.main.ru 的自签名证书
  2. 用第一个和 CN=client.sms.main.ru 签名的证书

我的 java 客户端在 apache-tomcat 6 下启动并尝试连接到 https://client.sms.main.ru/ 并抛出以下异常:

No name matching client.sms.main.ru found

两个证书都通过 $JAVA_HOME/bin/keytool 添加到 $JAVA_HOME/jre/lib/security/cacerts,如 How do you configure Apache/Tomcat to trust internal Certificate Authorities for server-to-server https requests 所示在 unixtippse 的回答中。

Java 代码非常简单:

URL url = new URL(strurl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Connection", "close");
con.setDoOutput(true);
con.connect();

我错过了什么?


有趣的是,当我尝试在 Windows PC 上使用浏览器访问此 url 时,它说该证书不受信任,我将其添加到浏览器异常(exception)列表中并且工作正常。所以看起来我将这些证书错误地添加到 cacerts 中,因此 java 无法使用它们。但我可以通过别名或 CN 轻松找到它们:

$JAVA_HOME/bin/keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | less

最佳答案

最后我要做的就是:

  1. 禁用主机名验证:

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
    return true;
    }
    };
    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
  2. 确保使用默认的 cacerts 文件,因为在研究时我试图禁用 ssl 证书验证并使用了可以在 SO 上的大量线程中找到的代码(实现拥有 X509TrustManager),即在 Java: Overriding function to disable SSL certificate check 中.此代码替换了我需要的默认 SSLSocketFactory。所以我不得不删除所有这些东西并使用代码仅禁用主机名验证。

我离开了 HttpURLConnection。无需将其替换为 HttpsURLConnection

当然,如果我设法避免禁用主机名验证,那肯定会好得多,但我做不到。证书可能有问题..

关于java - 为什么我得到 "No name matching found"CertificateException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com