`
forsecond
  • 浏览: 46528 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Https HttpClient

阅读更多
呵呵,弄了一早上,头都大了。说说自己的一点心得体会。

首先自己在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

会提示输入密码,输入刚才建立证书时输入的密码

测试代码:
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。就为这个问题弄了一早上。在此提醒下大家,开发环境最好是自己定义的。这个很关键,不能图省事,这个会让你忽略很多问题。

1
0
分享到:
评论
1 楼 forsecond 2010-01-29  
     

相关推荐

Global site tag (gtag.js) - Google Analytics