2024年6月9日发(作者:)
一、 在做ssl开发时,要注意的是android端与服务器端的
keystore类型是不一致的:如如下代码:
KeyStore trustStore = tance(aultType());
,在android
中代码默认拿到的是android的BKS类型.所以需要相应的
工具转换:资料如下:
Android SDK 在进行 https 联机时,对于自签署的凭证是会拒绝联机的,会得
到 Not trusted server certificate 的例外。如果使用 HttpsURLConnection
来联机,网络上可以找到一些破解方法,在此不多谈。使用 apache httpclient
其实执行效率比较差一点,但是他最大的好处就是有内建的机制储存cookie,
并且也可以跟随 server 作自动转址。网络上数据比较多的是 httpclient 3.x
版,Android 使用 httpclient 4 (而且还有些实作被拿掉) 唯一找到比较可信
的来源是 apache httpclient 官方的 example。节录重点段落如下:
1. KeyStore trustStore = tance(ault
Type());
2. FileInputStream instream = new FileInputStream(new File("
store"));
3. try {
4. (instream, "nopassword".toCharArray());
5. } finally {
6. ();
7. }
8.
9. SSLSocketFactory socketFactory = new SSLSocketFactory(trustStor
e);
sch = new Scheme("https", socketFactory, 443);
nectionManager().getSchemeRegistry().register(
sch);
1. KeyStore trustStore = tance(ault
Type());
2. FileInputStream instream = new FileInputStream(new File("
store"));
3. try {
4. (instream, "nopassword".toCharArray());
5. } finally {
6. ();
7. }
8.
9. SSLSocketFactory socketFactory = new SSLSocketFactory(trustStor
e);
sch = new Scheme("https", socketFactory, 443);
nectionManager().getSchemeRegistry().register(
sch);
直接把这段拿去用当然只有一个死字。本来看讨论以为是要制造一个假的空凭证
骗过 httpclient,从 Android 文件系统有点微妙开始改来改去,一连串不同的
例外或直接crash就不多谈了。解决了档案路径,到底有没有建立等等方面的问
题之后才终于发现,假凭证是不 行的„
1. 所以首先,开启你PC或Mac上的浏览器连上目标网站,从凭证管理的地方把
该网站的凭证汇出。每个浏览器做法都不同,请各位发挥正常工程师的水平做完
这件 事。以Firefox为例,找到site名后选汇出,多半是会得到一个档名为
your_site_ 的 X509(PEM) 凭证档。为了之后使用方便,先把这档案复
制一份并把档名改为 your_site_。
2. 将这个凭证格式从 PEM 转为 BKS 格式。 这是关键性的一步啊。
1. KeyStore trustStore = tance(ault
Type());
1. KeyStore trustStore = tance(ault
Type());
这行中的 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_ 之类的档案了。
4. 要把凭证档放在 Android app 能读到的地方,做法有两种,放在 SD card 中,
或直接放在 resources 中。
发布评论