android ssl证书校验方法与教程

[复制链接]
查看: 615|回复: 0

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2020-9-22 23:22:24 | 显示全部楼层 |阅读模式
android SSL证书校验方法与教程

福利推荐:阿里云企业SSL证书限时优惠,还有免费SSL证书申请:点击这里立即进入了解;腾讯云企业SSL证书优惠活动也在进行中:点击这里立即参加,同样有免费企业SSL证书申请哦!)

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

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

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


  4.     public SSLContext getSSLContext() {
  5.         return sslContext;
  6.     }

  7.     public X509TrustManager getTrustManager() {
  8.         return (X509TrustManager)trustManager;
  9.     }

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

  14.             }

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

  17.             }

  18.             @Override
  19.             public X509Certificate[] getAcceptedIssuers() {
  20.                 X509Certificate[] x509Certificates = new X509Certificate[0];
  21.                 return x509Certificates;
  22.             }
  23.         };

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

  26.     @Override
  27.     public String[] getDefaultCipherSuites() {
  28.         return new String[0];
  29.     }

  30.     @Override
  31.     public String[] getSupportedCipherSuites() {
  32.         return new String[0];
  33.     }

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

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

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

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

  50.     @Override
  51.     public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
  52.         return null;
  53.     }

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

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

  12. builder.sslSocketFactory(ssl.getSSLContext().getSocketFactory(), ssl.getTrustManager()).hostnameVerifier
  13.                     (hostnameVerifier);
复制代码




腾讯云
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文



在线客服(工作时间:9:00-22:00)
400-600-6565

内容导航

微信客服

Copyright   ©2015-2019  云服务器社区  Powered by©Discuz!  技术支持:尊托网络     ( 湘ICP备15009499号-1 )