美文网首页中年危机程序猿的日常网络安全
Android HTTPS证书验证的简单方式

Android HTTPS证书验证的简单方式

作者: SyncAny | 来源:发表于2017-11-07 11:44 被阅读1000次

1. 背景与需求

近期在做IP切换的HTTPS访问时,遇到了一些问题:客户端如何进行HTTPS的证书验证。
其实对于一般的项目基本都是做的单向验证,即在客户端证书或者HOST的验证;对于金融、银行相关的项目才会使用的双向验证,客户端与服务端之间都要对彼此进行验证,以防止中间人进行攻击。

2.实现目标

本文记录的是:客户端实现对HOST的验证,这样基本满足一般项目的需求,也不需要客户端内置证书,引起更新时候的麻烦。

3. 实现过程

  • 实现SSLSocketFactory ,获取SSLContext
    我们这里没有本地的证书,所以都是生成TrustManager 时都是空实现,如果需要通过内置证书来验证可以柴查看下面的链接。
public class SSLSocketFactoryImp extends SSLSocketFactory {
    private SSLContext sslContext = SSLContext.getInstance("TLS");
    private TrustManager trustManager = null;


    public SSLContext getSSLContext() {
        return sslContext;
    }

    public X509TrustManager getTrustManager() {
        return (X509TrustManager)trustManager;
    }

    public SSLSocketFactoryImp(KeyStore keyStore) throws NoSuchAlgorithmException, KeyManagementException {
        trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

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

        sslContext.init(null, new TrustManager[]{trustManager}, null);
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return new String[0];
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return new String[0];
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }

    @Override
    public Socket createSocket(Socket socket, String host, int post, boolean autoClose) throws IOException {
        return sslContext.getSocketFactory().createSocket(socket, host, post, autoClose);
    }

    @Override
    public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
        return null;
    }

    @Override
    public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
        return null;
    }
}
  • 关键步骤:验证HOST
    这里是基于OKHTTP来进行的验证操作,主要依靠:HttpsURLConnection.getDefaultHostnameVerifier().verify("你的域名", session)方法来验证域名是否一致
KeyStore trustStore;
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactoryImp ssl = new SSLSocketFactoryImp(KeyStore.getInstance(KeyStore.getDefaultType()));

            HostnameVerifier hostnameVerifier = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    boolean verify = HttpsURLConnection.getDefaultHostnameVerifier().verify("你的域名", session);
                    return verify;
                }
            };

builder.sslSocketFactory(ssl.getSSLContext().getSocketFactory(), ssl.getTrustManager()).hostnameVerifier
                    (hostnameVerifier);

4.一定要阅读的文章

上面只是简单的记录验证HOST的方式,下面的文章会让你收获更多。
1. 阿里移动安全:Android安全开发之安全使用HTTPS

2. 浅析HTTPS中间人攻击与证书校验

3. Android官方培训课程 : 使用HTTPS与SSL

相关文章

  • Android HTTPS证书验证的简单方式

    1. 背景与需求 近期在做IP切换的HTTPS访问时,遇到了一些问题:客户端如何进行HTTPS的证书验证。其实对于...

  • Android https 私有证书,不验证证书

    Https使用私有证书时,不验证证书: 自定义SSLContext,设置DefaultSSLSocketFacto...

  • [接口测试_B] 10 requests处理SSL证书验证

    requests支持的证书验证方式 SSL证书验证 客户端证书验证 CA证书验证 SSL证书验证 来个大写的问题,...

  • https证书验证

    废话开篇:https 证书是什么?如何进行认证呢?带着这些疑问来简单的实现一下验证过程 简单的了解一下 https...

  • AFNetworking - AFSecurityPolicy类

    简单来说,AFSecurityPolicy的作用就是证书认证。 在https请求中,客户端会验证服务端的证书,但是...

  • Android网络请求忽略https证书验证

    在使用Volley和OkHttp,Retrofit的时候,访问https的网站,经常会碰到一个异常就是javax....

  • 网络重试机制优化-关于https证书验证

    场景:Android端带一个HTTPS使用系统验证的需求,目前暂不需要对证书的验证。 关键核心类:HttpsUti...

  • iOS https证书验证

    因为苹果审核原因项目需要添加证书验证,下面写下实现过程 1.拿到服务器颁布的证书,cer证书。我们服务器用的是腾讯...

  • HTTPS--证书验证

    HTTPS 默认工作在 TCP 协议443端口,它的工作流程一般如以下方式: 1、TCP 三次同步握手 2、客户端...

  • https证书验证不过

    在做https服务器的时候,在本机调试没有问题,代码放到另一台机器上不能正常工作。查找原因是客户端的证书的证书没有...

网友评论

    本文标题:Android HTTPS证书验证的简单方式

    本文链接:https://www.haomeiwen.com/subject/ldgdmxtx.html