为多个主机和自签名证书自定义HostNameVerifier

时间:2017-02-22 10:43:32

标签: android security ssl ssl-certificate

有问题需要社区帮助 现在Google data protection发生了变化,我在Google Developer Console中收到了警告。 "安全警告 您的应用使用HostnameVerifier的不安全实现。 有关详细信息,包括解决漏洞的截止日期,请参阅Google帮助中的这篇文章。 适用于APK版本3."

我没有正确使用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 个答案:

答案 0 :(得分:1)

有没有听说过Let's Encrypt CA? 如果没有检查出来。

因此,您的声明“我们的公司无法向我们的每个客户提供CA证书”是错误的。 您只需在产品中集成Let's Encrypt客户端,所有服务器都将免费提供有效证书。

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

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