Nitro's

Jun 29, 2014 - Comments - dev tech

Android 读取classpath路径下的文件流&证书问题

今天在读取HTTPS证书时遇到的一个问题,src文件夹下的cer证书读取始终为空。

经过对APK包反编译发现cer证书竟然一直没有打包进去,怎么可能?!之前一直都很正常的。最后把问题聚焦在了Android Studio使用的Gradle编译环境上,因为之前Eclipse下的编译环境都可以将src文件夹下的XML、CER等文件一并打包进去,但是Gradle却不是这么做的。

由于刚刚切换到Android Studio,对Gradle编译系统还不是特别熟悉,从Intellij工程配置到Gradle编译配置没有发现对src下*.class以外文件的特殊配置,无奈只能选择其他方法。

解决方法:

将cer证书文件放在assets文件夹下,assets文件夹会被编译系统打包到APK包内,并且处于Root Path级别。

InputStream caInput = this.getClass().getClassLoader().getResourceAsStream("assets/d.com.cer");

这样就可以读取到证书文件。

可能还有其他方式读取类似这种文件,比如通过context.getRaw().open(“”),但是这样在独立模块中会引入Activity的context,不符合模块解耦的原则,对代码复用不友好。

=

之前看到很多使用HTTPClient与API进行交互时默认信任所有证书,这样开发确实方便,但是却会大开安全之门。

Android 证书的导入没有公开的API,需要自己手动导入,像12306那种自己做证书No Zuo No Die的方式直接让很多小白感觉那是个冒牌网站。

关于Android导入证书的教程,移步Google Help