OkHttp与证书固定

时间:2016-06-10 06:52:24

标签: android ssl okhttp self-signed okhttp3

我的Android项目(OkHttp 3.3.1)目前适用于我的HTTPS网络服务(我的电脑,IIS网络服务器,Asp.Net Web API,自签名证书)

帮助方法:

private SSLSocketFactory getSSLSocketFactory()
        throws CertificateException, KeyStoreException, IOException,
        NoSuchAlgorithmException, KeyManagementException {
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = getResources().openRawResource(R.raw.iis_cert);
    Certificate ca = cf.generateCertificate(caInput);
    caInput.close();
    KeyStore keyStore = KeyStore.getInstance("BKS");
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, tmf.getTrustManagers(), null);
    return sslContext.getSocketFactory();
}

private HostnameVerifier getHostnameVerifier() {
    return new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {            
            HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
            return hv.verify("BNK-PC.LOCALHOST.COM", session);
        }
    };
}

代码A:

OkHttpClient client = new OkHttpClient.Builder()
        .sslSocketFactory(getSSLSocketFactory())
        .hostnameVerifier(getHostnameVerifier())
        .build();

阅读this CertificatePinner guide后,我的项目在添加.certificatePinner(certificatePinner)时也能正常运行,如下所示:

代码B:

OkHttpClient client = new OkHttpClient.Builder()
        .sslSocketFactory(getSSLSocketFactory())
        .certificatePinner(certificatePinner)
        .hostnameVerifier(getHostnameVerifier())
        .build();

根据this Wiki证书锁定可提高安全性

然而,实际上我还没有清楚地理解这个想法。所以我的问题是,当我的应用仍然使用代码A 时,我是否需要或必须使用certificatePinner。换句话说,代码B 的安全性是否高于代码A

1 个答案:

答案 0 :(得分:2)

证书固定应该有助于某些类别的攻击

  1. 任何受信任的证书颁发机构都会被黑客入侵并为您的域生成有效的证书,例如MITM攻击由一个侵入性政府。
  2. 您的应用正在具有其他可信证书的设备上运行,例如由提供电话的公司安装。
  3. 我认为一般来说,如果您从两个主要的CA颁发了证书,例如verisign,你会签署他们的签名证书而不是你自己的签名证书。这是因为您可能会为您的服务器生成新证书作为例行事项。