2016-06-10 131 views
4

我的Android项目(OkHttp 3.3.1)目前与我的HTTPS web服务(我的电脑,IIS Web服务器,Asp.Net的Web API,自签名证书)OkHttp与证书钢钉

的辅助方法:

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,我的工程中的后

代码B:

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

this Wiki证书钉扎增加了安全性如下添加.certificatePinner(certificatePinner)当t也是行之有效的。

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

任何说明所理解的,由于提前。

+1

有很多很好的文章,请[点击这里](http://blog.lumberlabs.com/2012/04/why-app-developers-should-care-about.html)。 –

+1

@MadhukarHebbar为你的链接非常感谢,我读书,也许我需要阅读很多次明白,太多的安全知识,知道什么时候我的英语也不好:) – BNK

回答

2

证书钢钉应该帮助某些类型的攻击

  1. 任何可信证书颁发机构被黑,并生成您的域名这一个MITM攻击如有效证件由一个有创性的政府。
  2. 您的应用程序正在使用其他可信证书的设备上运行,例如由提供电话的公司安装。

我普遍认为,如果你有两个主要CA颁发的证书,你如verisign,你会固定他们的签名证书而不是你自己的。这是因为您很可能会为您的服务器生成新的证书作为例行事项。

+0

谢谢您的回答,与2号(' ...额外的可信证书,例如由提供手机的公司安装的)您的意思是即使我的应用程序仅供内部使用也是一种风险? – BNK

+1

只是,如果有人可以在手机上安装新证书,例如您的公司管理员,然后他们可以读取手机上不使用证书锁定等所有流量。 http://www.8bitavenue.com/2015/05/debugging-ios-and-android-ssl-connections-using-charles-proxy/ –

+0

我已经试过我的应用程序有2个WiFi网络(一个具有查尔斯代理,另一个没有)。对于具有Charles代理的wifi,'java.security.cert.CertPathValidatorException:未找到认证路径的信任锚点'尽管总是抛出'。certificatePinner(certificatePinner)'是否使用过 – BNK