如果要启用tomcat的https方式,首先要创建证书,使用的工具是jdk中的keytool ,用法不多说了,到处都有。
使用keytool创建证书的第一个问题是:您的姓名是什么(竟然是中文的!),这时候,理所应当的是回答自己的名字。配置完成后,用浏览器访问,一切正常。但使用http client 写程序访问的时候,问题就出来了。
一般表现形式是这样的:
javax.servlet.ServletException: HTTPS hostname wrong: should be <localhost>
root cause
java.io.IOException: HTTPS hostname wrong: should be <localhost>
看到这个问题就能猜到是证书问题。但无论如何也猜不到证书到底有什么毛病。事实上,令人难以置信的是错误就出在创建证书的第一个问题--你的姓名。其实这个“姓名”应该是域名。比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名不符,当然会出错。浏览器无所谓,d出一个对话框,用户按一下就行了。但http client就直接抛出了上面那个错误。
两篇文章的作者已经解释了出现 HTTPS hostname wrong 的原因及解决方案, 经过一番查证, 发现此异常可以用以下 hack 手段避免, 在使用 https 协议访问前, 加上以下代码 :
System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
return urlHostName.equals(session.getPeerHost());
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
这样既可正常访问, 注意导入的 HostnameVerifier 和 HttpsURLConnection 的 package 都是 javax.net.ssl, 而非 com.sun.net.ssl , 如果允许所有 ip 都可以通过认证, 甚至可以在 verify 中直接返回 true ! 当然这是不推荐的做法.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)