2017-02-22 128 views
0

有问题,需要社区的帮助。
现在Google data protection中的更改在Google Developer Console中收到警告。 “安全警告 您的应用使用不安全的HostnameVerifier实现。 有关详细信息,包括解决漏洞的最后期限,请参阅Google帮助中的这篇文章 适用于APK版本3。为多个主机和自签名证书自定义HostNameVerifier

我之所以没有正确使用HostnameVerifier,是因为我们公司不能为每位购买我们产品的客户提供带有CA证书的签名 。 (如果他愿意,这取决于他的目的) 我们的产品包含一个安全的Web服务(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客户端集成到您的产品中,并且所有服务器都将免费提供有效的证书。

无论如何,即使没有有效的CA,也可以通过简单的措施使SSL连接即使使用自签名证书也是安全的。结果将不如真正的SSL证书,但要好得多,因为“我们禁用SSL/TLS的安全性”方法:

“首次使用时的信任”(类似于SSH的工作方式)。在第一次连接时(可信赖的环境中可以保存)保存服务器提供的SHA-256哈希(或证书本身)并保存。下一次建立连接并执行TrustManager的checkServerTrusted时,您会将叶证书与保存的证书进行比较。

+0

感谢罗伯特的详细解答,我调查了一下。希望这对任何有同样问题的人都有帮助。 – Artiom