有问题需要社区帮助 现在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();
}
}
谁有类似的加密经验?我应该如何进一步处理我的案件?提前致谢!
答案 0 :(得分:1)
有没有听说过Let's Encrypt CA? 如果没有检查出来。
因此,您的声明“我们的公司无法向我们的每个客户提供CA证书”是错误的。 您只需在产品中集成Let's Encrypt客户端,所有服务器都将免费提供有效证书。
无论如何,即使没有有效的CA,也可以通过自签名证书轻松实现SSL连接的安全措施。结果将不如真正的SSL证书,但更好的是“我们禁用SSL / TLS的安全性”方法:
“首次使用时的信任”(类似于SSH的工作方式)。在第一次连接(在可信环境中可以假设)保存服务器提供的SHA-256哈希(或证书本身)并保存。下次建立连接并执行TrustManager的checkServerTrusted
时,您将叶证书与保存的证书进行比较。