[记录]httpclient or httpurlconnection 出现no peer certificate错误的解决方法

最近在android上使用httpclient和httpurlconnection访问https网站时,出现了no peer certificate错误。查看log,提示ssl方面的错误,经网上搜索,baidu了一下,大部分的解决方法简单总结起来就是“信任所有https网站”,而这个不是我想要的答案(或者说这个根本不算是答案)。

经过google,发现了另外一个比较好的答案,就是“把证书加到信任库中”。大致流程如下:

1、准备需要的工具;

1、创建信任库;

2、加入信任的证书信息;

3、使用信任库

准备需要的工具

这里会用到的工具是keytool,可以keytool --help查看其用法;

 

创建信任库

信任库,其实就是放证书信息的文件,这里也没有这个过程,信任库是在下面导入证书的时候一起创建了;

 

加入信任的证书信息

使用keytool的语法为:

keytool -importcert -v -trustcacerts -file "证书所在位置" -alias "想用在信任库里的别名"  -keystore "信任库要存放在哪里,不存在就会新建" -storetype jks -storepass "要使用的密码"

用上面的语句就可以把所有需要信任的证书都导入到信任库中。

 

使用信任库

我是在android中的httpclient使用这个信任库的,部分代码如下:

public static boolean trustKeyStore(InputStream keyStoreInputStream , String storePass,HttpClient httpClient) {
try {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(keyStoreInputStream,storePass.toCharArray());//使用信任库
SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore);
Scheme sch = new Scheme("https", socketFactory, 443);
httpClient.getConnectionManager().getSchemeRegistry()
.register(sch);
return true;
} catch (Exception e) {
Log.d(TAG, "trustKeyStore", e);
}
return false;
}

 

 

注意:

在导入信任库时,指定了storetype,这个与使用时KeyStore的类型需要一致,因为KeyStore.getDefaultType()是jks,所以我在导入时也指定为jks。(在android上好像是BKS)

 

参考的文章,不过是英文版本,在这里

» 本文链接地址:https://www.xidige.com/783

打开支付宝扫一扫,即可进行扫码打赏哦

扫码支持
扫码打赏,你说多少就多少

标签:

分享到:

扫一扫 在手机阅读、分享本文

上一篇: 下一篇:
评论区0人评论539人参与

电子邮件地址不会被公开。 必填项已用*标注

*

loading

赞助商广告