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

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

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

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

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

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

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

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

实际是用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为其他端口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值