[/code]呵呵,弄了一早上,头都大了。说说自己的一点心得体会。
首先自己在tomcat开启https,网上资料很多,基本就是把server.xml相应的8443 connector注释放开就OK了。然后用jdk的自带的工具keytool生成自定义的证书也没啥问题:
HttpClient连接tomcat https(使用私有证书)
步骤一:
在www.apache.org下载所需的类包
commons-codec-1.3.jar
commons-httpclient-3.1-rc1.jar
commons-logging.jar
步骤二:
制作证书:
keytool -genkey -alias tomcat -keyalg RSA
任意输入,最后一个提示输入回车(保证两个密码相等)否则tomcat不能启动.
步骤三:
配置tomcat
更改tomcat配置文件server.xml
加入
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="C:\.keystore" keystorePass="123456"
/>
其中keystoreFile是刚生成文件的带全路径的名字
keystorePass是刚才建立证书时候的名字
启动tomcat,访问https:\\localhost:8443/如果能正常看到,说明tomcat的https配置成功.
步骤四:
生成jdk能使用的证书
1,用ie导出证书(导出方法:http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#N10114)
2,假设上边导出文件的名字叫tt.cer
执行(确保配置了java home)
cmd下先到你的jdk的security目录下,这个换成你的cer文件的绝对路径吧(tt.cer)
keytool -import -noprompt -keystore \carcert -alias tomcat -file tt.cer
会提示输入密码,输入刚才建立证书时输入的密码
测试代码:[code="java"]package testHttpClient;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class Test {
public static void main(String[] args) throws Exception{
// normal();
ssl();
}
public static void ssl()throws Exception{
String url = "https://localhost:8443/test_https/";
get(url);
}
public static void normal()throws Exception{
String url = "https://localhost:8443/test_https/";
get(url);
}
public static void get(String url) throws Exception{
HttpClient client = new HttpClient();
GetMethod getMethod = new GetMethod(url);
//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + getMethod.getStatusLine());
}
byte[] responseBody = getMethod.getResponseBody();
System.out.println(new String(responseBody));
getMethod.releaseConnection();
}
}
然后就是我出现的问题了:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
其实这个不算什么技术问题:
我的原因是这样的:第一我以为是部署的web https 在tomcat的jdk的问题,后来想想那个事作为server的,之前的步骤已经OK,跟tomcat配置的哪个jdk,对证书认证应该没有关联的。
真正的原因很简单,就是在你编写的测试类所在的客户端。这个采用的jdk才是问题关键,我用的是Myeclipse8.0.一直采用的默认的jdk 1.6_13,哎。而我导入的证书是我另外安装的jdk。就为这个问题弄了一早上。在此提醒下大家,开发环境最好是自己定义的。这个很关键,不能图省事,这个会让你忽略很多问题。