OkHttp中的证书锁定

4
我的Android项目(OkHttp 3.3.1)目前与我的HTTPS Web服务(我的PC,IIS Web服务器,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();

阅读完这个 CertificatePinner 指南后,我也成功地将以下代码添加了 .certificatePinner(certificatePinner)

代码 B:

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

根据这篇 Wiki的介绍,证书锁定可以提高安全性
然而,实际上我还没有完全理解这个概念。我的问题是,当我的应用程序仍在使用 Code A 时,是否需要或必须使用 certificatePinner 。换句话说, Code B 是否比 Code A 更安全?

1
有很多好的文章,请查看这里 - Madhukar Hebbar
1
@MadhukarHebbar 非常感谢您的链接,我正在阅读,也许我需要多读几遍才能理解,安全知识太多了,我不擅长英语 :) - BNK
1个回答

2
证书绑定应该有助于某些攻击类型:
  1. 任何受信任的证书颁发机构被黑客攻击并为您的域生成有效证书,例如被侵入性政府进行的中间人攻击。
  2. 您的应用正在运行在具有额外受信任证书的设备上,例如由提供手机的公司安装的证书。
我认为通常情况下,如果您从两个主要CA(例如verisign)颁发了证书,您应该将其绑定到其签名证书而不是您自己的证书。这是因为您很可能会定期为您的服务器生成新证书。

1
如果有人可以在您的手机上安装新证书,例如您的公司管理员,那么他们可以读取所有未使用类似证书固定的手机流量。 - Yuri Schimke
1
好的,假设你已经成功地安装了证书并且流量已经通过Charles正常运行。使用证书固定技术,你应该能够拒绝连接并避免对用户造成安全风险。 - Yuri Schimke
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - BNK
你的应用程序不应该仍然工作。主机名验证器应该拒绝它。如果没有,那就是一个错误。 - Yuri Schimke
1
抱歉,我误解了您的意思。我以为您是指服务器返回了错误的证书。一个OkHttpClient可以连接多个http主机,例如,如果您通过url缩短程序进行重定向或在下载HTML后获取远程图像,那么它只适用于模式完全匹配主机或*.host.com等的情况。所以这是可以预期的。但是除非您控制主机,否则您可能不应该固定其证书。Github确实返回“Public-Key-Pins”标头,但如果出现问题,这种事情会让我感到紧张,所以我不会提供更多建议。 - Yuri Schimke
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接