2016-06-10 8 views
4

Мой Android проекта (OkHttp 3.3.1) в настоящее время работает с моей веб-службы HTTPS (мой компьютер, IIS веб-сервер, ASP.NET Web API, самозаверяющими сертификат)OkHttp с Сертификат Закрепление

методы Helper:

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, мой Projec т также хорошо работает при добавлении .certificatePinner(certificatePinner), как показано ниже:

Код B:

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

Согласно this Wiki, сертификат пиннинга повышает безопасность.

Однако на самом деле я не совсем понял эту идею. Поэтому мой вопрос заключается в том, нужно ли мне или нужно использовать certificatePinner или нет, когда мое приложение все еще работает с кодом A. Другими словами, делает Код B имеет лучшую безопасность, чем Код A?

Любые объяснения, спасибо заранее.

+1

Есть много хороших статей, проверьте [здесь] (http://blog.lumberlabs.com/2012/04/why-app-developers-should-care-about.html). –

+1

@MadhukarHebbar большое спасибо за вашу ссылку, я читаю, возможно, мне нужно много раз прочесть ее, чтобы понять, слишком много знаний о безопасности, чтобы знать, когда я плохо разбираюсь в английском :) – BNK

ответ

2

Свидетельство Закрепление должно помочь с некоторыми классами атак

  1. Любой доверенный сертификат получает взломаны и генерирует действительные сертификаты для домена которых атаки MITM например с помощью инвазивного правительства.
  2. Приложение работает на устройстве с дополнительными доверенными сертификатами, например. установленной корпорацией, которая предоставила телефон.

Я думаю, что в целом, если вы выдали свои сертификаты от двух крупных СА, например. verisign, вы будете привязываться к своим подписывающим сертификатам, а не к своим собственным. Это связано с тем, что вы, скорее всего, создадите новые сертификаты для своего сервера как обычные вещи.

+0

Спасибо за ваш ответ, со вторым (' ... дополнительные доверенные сертификаты, например, установленные корпорацией, предоставившей телефон), вы имеете в виду, что это также является риском, хотя мое приложение используется только для внутреннего использования? – BNK

+1

Просто, если кто-то может установить новые сертификаты на вашем телефоне, например. администратор вашей компании, тогда они смогут прочитать весь трафик на вашем телефоне, который не использует что-то вроде фиксации сертификата. http://www.8bitavenue.com/2015/05/debugging-ios-and-android-ssl-connections-using-charles-proxy/ –

+0

Я пробовал свое приложение с двумя Wi-Fi-сетями (у одного есть прокси-сервер Charles, другой - нет). С wifi с прокси-сервером Charles, 'java.security.cert.CertPathValidatorException: Trust anchor для пути сертификации не найден, всегда выбрасывается, хотя'.certificatePinner (certificatePinner) 'используется или нет – BNK

Смежные вопросы