Android Volley - SSL固定实施中的意外行为

时间:2016-08-31 19:18:47

标签: android ssl https android-volley pinning

在SO上询问一个SSL固定问题似乎是在呼喊空洞,但这里有......

我需要在Android上实施SSL固定,并且我正在使用一些要求/约束​​:

  1. 它应该验证整个证书链,而不仅仅是叶子。
  2. 需要使用Volley库
  3. 根据Google的教程,我提出了以下用于创建SSLSocketFactory的实现:

    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    
    final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, null);    
    keyStore.setCertificateEntry("leaf_cert", getCertificate(factory, R.raw.leaf_cert));
    keyStore.setCertificateEntry("interm_cert1", getCertificate(factory, R.raw.interm_cert1));
    keyStore.setCertificateEntry("interm_cert2", getCertificate(factory, R.raw.interm_cert2));
    keyStore.setCertificateEntry("root_cert", getCertificate(factory, R.raw.root_cert));
    
    final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);
    
    final SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
    
    return sslContext.getSocketFactory();
    

    当我创建新的HttpStack实例时,将使用此SSLSocket工厂。请注意,我按照他们在链上的位置顺序列出了证书。

    要验证此代码,我通过修改nogotofail中的代码来利用Google的NoSslCertificateChainOfTrustCheckTest Android演示应用。似乎钉扎工作正常,但实际上我只需要在leaf_cert中加入KeyStore。使用openssl,我验证了服务器只发回了叶证书。在这一点上,事情变得非常奇怪:

    • 我的团队建立的姐妹iOS应用程序使用AFNetworking来完成证书,并且实际上强制执行所有四个证书。换句话说,它正在验证整个链,尽管只获得了叶子证书
    • 当我实际尝试使用项目中的代码(再次使用Volley)时,我发现我不仅需要整个证书链,而且只需要包含leaf_cert 或者 iterm_cert1

    总而言之,我需要回答以下问题:

    • 我的钉扎实施是否真的能够完成它的工作?
    • 验证整个链条需要什么样的巫术?
    • 为什么我能用中间证书替换叶子证书,为什么我只能使用Volley而不是nogotofail

0 个答案:

没有答案