使用httpclient连接https 自签名也可以
16lz
2021-01-24
申请了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里。代码看上去是这样:
keystore可以是有密码也可以是没密码,只要在代码是没写错就行。
如果使用其他端口,就改443为其他端口。
在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为其他端口。
更多相关文章
- Android(五):Android(安卓)数字签名
- Android(安卓)studio 单元测试初探
- Android(安卓)Studio 3.1 正式版发布
- Android通过百度地图API用Service和Alarm在后台定时获取地理位置
- Android(安卓)代码混淆技术总结
- Android(安卓)GreenDao实现CRUD和升级详解
- Android-如何在代码中获取attr属性的值
- Android(安卓)判断网络状态,并且在没有网络的时候,打开网络设置对
- Android获取屏幕大小和设置无标题栏