版权声明:版权声明 https://blog.csdn.net/duty_is_codeing/article/details/53610305
Https 接口使用环境,服务器端一个证书,生成一个客户端证书,在访问服务接口时使用客户端证书,访问服务器端https,增强对传输安全。
在开发过程中使用okhttp框架来实现https访问自签名的接口。首先拿到后台自签名证书sChat.cer 放在assets里面。通过getAssets().open("sChat.cer");来读取
以下为
OkHttpClient client=null;
InputStream in=getResources().getAssets().open("sChat.cer");
String result=null;
//生成工厂类实例
CertificateFactory certificateFactory=CertificateFactory.getInstance("x509");//一种普通的证书格式 符合ITU-T X 509国际标准
//获取到证书
Certificate ca = certificateFactory.generateCertificate(in);
in.close();
//这里面用的证书没有设置私钥,执行空加载
keyStore.load(null,null);
//将得到的证书存放到KeyStore里
keyStore.setCertificateEntry("ca", ca);
//请求安全套接字类 TLC请求协议
SSLContext sslContext = SSLContext.getInstance("TLS");
//初始化SSL
TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
//创建http客户端
client=new OkHttpClient();
Request request=new Request.Builder().url(url).build();
Log.d(ProjectAssist.TAG, "httpsCheckConnect "+url);
Response response=client.newCall(request).execute();
if(response.isSuccessful()){
result=response.body().string();
}
但是在运行的时候
javax.net.ssl.SSLPeerUnverifiedException: Hostname host not verified
SSL 验证服务器证书 Hostname 不匹配
向大神请教的是HostnameVerifier不设置的话,默认返回false,需要自定义实现一个HostnameVerifier
在clinet访问之前设置hostname认证 在里面添加需要的业务服务器地址,进行认证
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// 判断hostname 的合法性,是否是移动端访问的地址
return true;
}
});