2017-02-22 44 views
0

Имейте проблему и нуждайтесь в помощи сообщества.
Теперь с изменениями в Google data protection Я получил предупреждение в Google Developer Console. «Предупреждение о безопасности Приложение использует небезопасную реализацию HostnameVerifier. Для получения дополнительных сведений, включая крайний срок для устранения этой уязвимости, см. Эту статью в Справке Google. Применимо к версии APK 3."Настроить HostNameVerifier для нескольких хостов и самозаверяющего сертификата

Причина, по которой я не использую HostnameVerifier правильно, заключается в том, что наша компания не может предоставить подписанный с сертификатом CA каждому нашему покупателю, который купил наш продукт. (Это необходимо для его целей, если он этого захочет) Наш продукт содержит защищенный веб-сервис (Restful API) для связи с приложением. Так что на каждой установке там генерируется новый самозаверяющими сертификат, который я должен принять через приложение, и, очевидно, самым простым решением было отключить HostnameVerifier по:

private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 
}; 

И доверять всем хостам:

private static void trustAllHosts() { 
    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[] {}; 
     } 

     public void checkClientTrusted(X509Certificate[] chain, 
             String authType) throws CertificateException { 
     } 

     public void checkServerTrusted(X509Certificate[] chain, 
             String authType) throws CertificateException { 
     } 
    } }; 

    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

У кого был похожий опыт шифрования? Как мне следует продолжить в моем случае? Заранее спасибо!

ответ

1

Когда-либо слышал о Let's Encrypt CA? Если не проверить.

Следовательно, ваше заявление «наша компания не может предоставить подписанный сертификат CA нашему каждому клиенту» является неправильным. Вам просто нужно интегрировать клиент Let's Encrypt в ваш продукт, и все серверы будут иметь действующий сертификат без каких-либо затрат.

В любом случае даже без действительного ЦС есть простые меры для обеспечения безопасного соединения SSL даже с самозаверяющим сертификатом. Результат будет не таким хорошим, как реальный сертификат SSL, но гораздо лучше, чем ваш подход «отключить безопасность SSL/TLS»:

«Доверьтесь первому использованию» (аналогично тому, как работает SSH). При первом подключении (предположительно в доверенной среде) сохраняйте хэш SHA-256 (или сам сертификат), который будет представлен сервером, и сохраните его. В следующий раз, когда будет установлено соединение, и будет выполнено приложение TrustManager checkServerTrusted, вы сравниваете сертификат листа с сохраненным.

+0

Спасибо, Роберт за подробный ответ, я исследую его. Надеюсь, это поможет любому, у кого такая же проблема. – Artiom