【问题标题】:Customize HostNameVerifier for multiple hosts and self-signed certificate为多个主机和自签名证书自定义 HostNameVerifier
【发布时间】:2017-07-12 08:27:48
【问题描述】:

我有一个问题,需要社区的帮助。现在,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();
    }
}

谁有类似的加密经验?我应该如何进一步处理我的情况?提前致谢!

【问题讨论】:

    标签: android security ssl ssl-certificate


    【解决方案1】:

    听说过Let's Encrypt CA吗? 如果没有,请查看。

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

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

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

    【讨论】:

    • 感谢罗伯特的详细回答,我对此进行了调查。希望这对遇到同样问题的任何人都有帮助。
    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多