使用httpclient连接https 自签名也可以

申请了ssl证书,总算搭起了https,但问题又来了,android和java居然不认这个证书,必须要用定制方式。问题就大了

在android的 httpclient 版本应该是4.0,几乎网上很少有讲到4.0的开发,定制ssl就更少了。

上官网查了一下,有个简单的例子是关于定制

http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/examples/client/ClientCustomSSL.java

异常简单,但实际上大量的内容是在keystore里,首先是格式问题,在jdk桌面版本里是jks格式,而在android里是bks格式。

从代码上看也就是注册了一个https协议,绑上自己定制的keystore。这个keystore制作也不复杂,当然要找对路。

如果使用桌面jdk测试,那么要创建jks格式的keystore。使用一个工具: http://www.brothersoft.com/keytool-iui-for-windows-90269.html

实际是用java写的工具,直接运行rc15ktl.jar就行了。

功能很多,就用create keystore创建keystore,然后用import导入证书,这个证书可以是根证书,也可以是自签名证书,一个简单的方法是访问https的网站,然后导出证书,用firefox可以导出pem格式。导入时不要忘了选对格式。

总的来说就是将pem格式的证书放入jks格式的keystore。另外如果是startssl的免费证书,那么可以导入startssl的根证书。

这样在pc机上可以测试成功。

如果在android上测试定制ssl证书,那么要创建bks格式的keystore,另外可以把keystore放sdcard也可以内置到R.raw里。代码看上去是这样:

		HttpClient httpclient = new DefaultHttpClient();

		KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
		InputStream instream = res.openRawResource(R.raw.keystore);
		try {  
			trustStore.load(instream, "passwordforkeystore".toCharArray());  
        } finally {  
            instream.close();  
        }
        SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
        Scheme sch = new Scheme("https", socketFactory, 443);
        httpclient.getConnectionManager().getSchemeRegistry().register(sch);

		HttpGet httpget = new HttpGet("https://server");
		HttpResponse response = httpclient.execute(httpget);
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			System.out.println(EntityUtils.toString(entity));
		}


keystore可以是有密码也可以是没密码,只要在代码是没写错就行。

如果使用其他端口,就改443为其他端口。

你可能感兴趣的:(jdk,android,SVN,Scheme,firefox)