2016-06-10 124 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