【发布时间】:2015-01-03 17:55:54
【问题描述】:
据我了解,在大多数情况下,此异常表明证书所有者 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,如unixtippse 的答案中的How do you configure Apache/Tomcat to trust internal Certificate Authorities for server-to-server https requests 所示。
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 时,它说证书不受信任,我将其添加到浏览器例外列表中并且它工作正常。所以看起来我错误地将这些证书添加到cacerts,因此java无法使用它们。但我可以通过别名或 CN 轻松找到它们:
$JAVA_HOME/bin/keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | less
【问题讨论】:
-
如果它是自签名的,那么它将不被信任,因为层次结构不会一直到 TA
-
@Scary Wombat 但是我将它们都添加到
cacerts..并在那里将它们标记为受信任..这还不够吗?这难道不是让自签名证书受信任的方式吗? -
你使用了错误的类访问https
标签: java apache tomcat https solaris