远程服务器证书的层次结构如下:
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
,如unixtippse的回答中所示,用于配置Apache/Tomcat信任内部证书颁发机构以进行服务器间的https请求。
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时,它会提示证书不受信任,我将其添加到浏览器的异常列表中,然后就可以正常工作了。所以看起来我没有正确地将这些证书添加到中,导致Java无法使用它们。但我可以很容易地通过别名或CN找到它们:
$JAVA_HOME/bin/keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | less
cacerts
中,并在那里标记为受信任的。这不够吗?这不是让自签名证书得到信任的正确方法吗? - horgh