Android中的HTTPS问题

1、WebView中的HTTPS问题

在HTTPS协议中,客户端如果要获取服务器的公钥,必须首先获取服务器的数字证书(包含公钥和数字签名)。

在Android App中我们使用WebVIew来加载网页,在加载https的网页时,会出现如下问题:

Q1:开发调试时,网站未使用第三方认证的证书部署,使用自证书进行部署,此时,WebView显示空白。

A:解决办法有两种:
一、继承 WebViewClient 重写 onReceivedSslError 方法,然后直接使用 handler.proceed(),如下:

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();
            }

二、当出现了证书问题的时候,读取 asserts 中保存的的根证书,然后与服务器校验,假如通过了,继续执行 handler.proceed(),否则执行 handler.cancel()。

第二种方案是网上别人提的,但我觉得第二种方案是个伪命题,只适合开发阶段临时使用。因为当你的证书校验出现问题时,本身就意味着你可能遭受了拦截篡改,这种情况本身就不应该访问网站了,如果方案二只是为了解决自证书的问题,那为什么不使用第一种,因为第一种更简洁。

2、OKHttp中的Https问题

OKHttp本身支持Https,但在实际开发中经常会遇到自证书的问题,即使用自己生成的证书部署后台时,OKHttp会请求失败,经常会报如下错误:

 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

解决办法同WebView,强迫OKHttp信任自证书,代码如下:
1、创建工具类HttpsTrustManager

public class HttpsTrustManager implements X509TrustManager
{
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[0];
    }


    public static SSLSocketFactory createSSLSocketFactory() {
        SSLSocketFactory sSLSocketFactory = null;
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, new TrustManager[]{new HttpsTrustManager()},
                    new SecureRandom());
            sSLSocketFactory = sc.getSocketFactory();
        } catch (Exception e) {
        }
        return sSLSocketFactory;
    }


    public   static  class  TrustAllHostnameVerifier implements  HostnameVerifier
    {
        @Override
        public boolean verify(String s, SSLSession sslSession) {
         return   true;
        }
    }
}

2、OKHttp设置

        OkHttpClient  mOkHttpClient = client.newBuilder()
                .sslSocketFactory(HttpsTrustManager.createSSLSocketFactory())
                .hostnameVerifier(new HttpsTrustManager.TrustAllHostnameVerifier())
                .build();




好家伙,随手就是一个赞~

在这里插入图片描述
给作者买瓶咖啡提提神~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不死鸟JGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值