- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,在大多数情况下,此异常说明证书所有者 CN(公用名)与 url 中的主机名不匹配。但是在我的情况下,它们确实匹配,但仍然会出现异常。
远程服务器证书层次结构是:
CN=sms.main.ru
的自签名证书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
最佳答案
最后我要做的就是:
禁用主机名验证:
// 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);
确保使用默认的 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/
我是一名优秀的程序员,十分优秀!