Android 使用httpclient对self-signed certificate网站进行SSL连线

简介:

Android SDK 在进行 https 连线时,对于自签署的凭证是会拒绝连线的,会得到 Not trusted server certificate 的例外。如果使用 HttpsURLConnection 来连线,网络上可以找到一些破解方法,在此不多谈。使用 apache httpclient 其实执行效率比较差一点,但是他最大的好处就是有内建的机制储存cookie,并且也可以跟随 server 作自动转址。网络上资料比较多的是 httpclient 3.x版,Android 使用 httpclient 4 (而且还有些实作被拿掉唯一找到比较可信的来源是 apache httpclient 官方的 example。节录重点段落如下:

        KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());         FileInputStream instream = new FileInputStream(new File("my.keystore"));         try {             trustStore.load(instream, "nopassword".toCharArray());         } finally {             instream.close();         }          SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);         Scheme sch = new Scheme("https", socketFactory, 443);         httpclient.getConnectionManager().getSchemeRegistry().register(sch);


直接把这段拿去用当然只有一个死字。本来看讨论以为是要制造一个假的空凭证骗过 httpclient,从 Android 档案系统有点微妙开始改来改去,一连串不同的例外或直接crash就不多谈了。解决了档案路径,到底有没有建立等等方面的问题之后才终于发现,假凭证是不行的

1. 所以首先,开启你PCMac上的浏览器连上目标网站,从凭证管理的地方把该网站的凭证汇出。每个浏览器做法都不同,请各位发挥正常工程师的水准做完这件事。以Firefox为例,找到site名后选汇出,多半是会得到一个档名为 your_site_name.crt 的 X509(PEM) 凭证档。为了之后使用方便,先把这档案复制一份并把档名改为 your_site_name.pem

2. 将这个凭证格式从 PEM 转为 BKS 格式。 这是关键性的一步啊。

KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());


 

这行中的 getDefaultType 到底会get到什么type 呢?答案:在 Android 中是 BKS。有 J2ME 经验的人会想说,我看多半是跟J2ME 一样的 Sun JKS 格式吧,而且,我不要用 getDefaultType 就好了,我可以自己指定为 PEM, JKS格式啊。是的,你可以。只是你会得到错误讯息说 KeyStore JKS implementation not found。测了半天,看起来 Android 的 httpclient 只吃 BKS 就对了,其他都没实作。

3. 那格式要怎么转?根据网路上找到的资料,可以使用 KeyTool IUI 这个Java工具。打开后从介面选 create → KeyStore,格式选 BKS,自己命名一下,要不要设密码都可。接着选 import → Keystore’s entry → Trusted certificate → Regular certificate。 Source 的部分选 PEM 并选到刚刚浏览器得到的那个档,Target 当然选 BKS 和刚 create 出来的档。按OK之后会跳出Entries视窗,下方提示你enter new alias,随便取个名字后ok连打,顺利的话你应该就会有一个 your_keystore.bks 之类的档案了。


4. 要把凭证档放在 Android app 能读到的地方,做法有两种,放在 SD card 中,或直接放在 resources 中。


 

[方案一放在 SD card 的情形:首先模拟器要挂上SD card,这在 Eclipse 用 AVD 工具产生 avd 时就可以顺便指定SD了。如果习惯用指令的话,也可以用如下指令产生 image 并 mount 上:

$ mksdcard 512M my_sdcard.so

$ emulator -sdcard ./my_sdcard.so

再来要把凭证档 copy 到 SD card 中,目前只知道指令的做法:

$ adb push file_path/your_keystore.bks /sdcard

如果有显示类似 ftp 传输速度之类的讯息应该就是成功了。

接着把 android 程式码中档案部分改一改

FileInputStream instream = new FileInputStream(new File("/sdcard/your_keystore.bks"));  trustStore.load(instream, null);


 

如果没设密码,可以把 keystore load 的第二个密码参数改成 null,有设的话当然就改成你的密码。

基本上这样应该就大功告成了


[方案二再讲讲凭证放在 resources 的方法。

首先把档案复制到专案下的 res/raw/your_keystore.bks 

Eclipse 没有错误的话就 ok,否则多半是你档名不合规格,稍微改改。接着取用方法是把 android 程式码改成:

InputStream instream = getResources().openRawResource(R.raw.your_keystore);


 

其它同SD card


5. 还有一个地方要注意,就是 SSL port

Scheme sch = new Scheme("https", socketFactory, 443);

如果你要连的网站不是用 port 443,这边请记得改掉。


6. 另外如果要使用档案放在 resources 的做法,getResources() 应该只能在 Activity class 中执行,如果另外包装连线类别的话请不要直接服用上面的程式码,要自行从 context 抓到资源再传过去。

 




     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230809,如需转载请自行联系原作者


相关文章
|
5月前
|
安全 网络安全
如何给网站添加ssl安全证书
如何给网站添加ssl安全证书
|
6月前
|
安全 搜索推荐 数据建模
解决网站“不安全”、“不受信”、“排名下降”,你需要——「SSL证书」
SSL证书是网络安全的关键,用于加密和验证网站身份,保护用户数据安全,防止信息被窃取。它分为DV、OV、EV和IV四种类型,每种验证网站身份的程度不同。DV证书快速签发,OV和EV证书提供更高级别的身份验证,EV证书曾在浏览器地址栏显示绿色。目前,DV证书占据市场大部分份额。SSL证书还有单域、通配符和多域之分,有效期曾从多年逐渐缩短至90天,以增强安全性。部署SSL证书能提升用户信任,优化SEO排名,并符合网络安全法规要求。
解决网站“不安全”、“不受信”、“排名下降”,你需要——「SSL证书」
|
6月前
|
JavaScript Android开发
手机也能搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站
手机也能搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站
77 0
|
10天前
|
网络安全
给网站免费申请SSL证书
为网站申请免费SSL证书是提升安全性的关键步骤。本文简要介绍如何通过JoySSL申请并部署免费SSL证书,包括选择证书类型、提交申请、验证域名、下载及安装证书等步骤,同时提醒注意备份证书、定期检查状态和更新服务器配置。
|
1月前
|
存储 网络协议 网络安全
开源、自建,网站与ssl证书管理
【10月更文挑战第1天】
214 3
|
3月前
|
搜索推荐 安全 网络协议
如何免费申请SSL证书并保护您的网站
通过使用 SSL 证书,您可以保护您的网站并提高用户的信任度,同时提升在搜索引擎中的排名
108 0
|
3月前
|
Android开发
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
386 0
|
6月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
285 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能
|
6月前
|
Android开发
android中出现javax.net.ssl.SSLPeerUnverifiedException
android中出现javax.net.ssl.SSLPeerUnverifiedException
222 3
|
6月前
|
安全 网络安全 数据安全/隐私保护
SSL证书过期后网站还能正常访问吗
SSL证书过期后,网站仍可访问,但浏览器会出现警告,降低用户信任度,增加数据安全风险。过期可能导致安全性下降、信任问题、浏览器限制及合规性风险。管理员需关注证书有效期,及时续费或更换,并选择可靠提供商。
SSL证书过期后网站还能正常访问吗
下一篇
无影云桌面