Android 端Https 访问

版权声明:版权声明 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;
                }
            });

猜你喜欢

转载自blog.csdn.net/duty_is_codeing/article/details/53610305