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 中。