一、原因:
1.libcurl 不能读取到 android 下的证书 ;
2.libcurl 没有提供直接传过字符串的方式来传入证书内容;只能通过指定路径的方式,增加一个CA文件
这就产生一个问题,如果拿到证书,通过使用如:Charles, 哪么通过中间伪造证书,就可以拿到服务端返回客户端数据,和客户端发出的数据;可以参照:http://blog.devtang.com/2015/11/14/charles-introduction/
所以还是不安全,最好的办法是加密后写到so库中,so库再加壳,就安全的多了。
二、修改思路
从传入路径入手,因为路径也是字符串,正好可以利用;
通过windows工程调试,看哪里读取文件转成 BIO 再存入X509_STORE,
以及验证过程;
后来找到两个地方,需要修改;
一个在 openssl by_file.c,一个在libcurl openssl.c
by_file.c 中需要修改:
X509_load_cert_crl_file
in = BIO_new_mem_buf(file, -1);
此处 file 已经代表 ca证书内容
openssl.c
修改 servercert函数
/* get a BIO */
fp = BIO_new_mem_buf(SSL_SET_OPTION(issuercert), -1);
编译,直接传入字符串即可。安全性大大增高,也方便很多。这样我只需要提供so证一个文件即可。
后面我会传上github