Android 如何存储一个;“不可信/自签名”;未来连接的证书
在Android上使用HttpsUrlConnection,如果我使用不受信任的证书(很可能是自签名证书)连接到服务器,我将得到一个错误。 例如,当浏览器中发生类似情况时,我可以选择接受该证书Android 如何存储一个;“不可信/自签名”;未来连接的证书,android,ssl,httpsurlconnection,Android,Ssl,Httpsurlconnection,在Android上使用HttpsUrlConnection,如果我使用不受信任的证书(很可能是自签名证书)连接到服务器,我将得到一个错误。 例如,当浏览器中发生类似情况时,我可以选择接受该证书 计划是正常运行URL连接 如果发生证书错误,请使用伪“trust all”重新运行它 设置,当然仍然会立即断开连接 已收到证书(在X509TrustManager和 然后是主机名验证程序)。在HostNameVerifier中返回false 这个把戏做得很好 询问用户是否确实要使用此证书 现在,如何将此证
因为我在其他问题中也看到过类似的情况,人们开始提供所有错误的解决方案。我不想要一个可接受的验证者。我可以不使用任何需要我手动导入证书的东西。如果我正确理解了您的问题,那么您就不必像您的问题那样接受验证器 以下代码是我认为您可以参考的示例: 让我们假设您的服务器应用程序托管在一台服务器计算机内,该服务器计算机具有一个服务器证书,例如,“颁发给”的服务器证书是“本地主机”。然后,在
verify
方法中,您可以验证“localhost”
有关证书文件的更多信息,getSSLSocketFactory
。。。您可以参考以下问题(当然它们可以应用于HttpsUrlConnection
):
希望这有帮助 您还需要TrustManager。目前,我正在使用一个使用系统密钥库的自定义X509TrustManager,以及另一个使用我自己的密钥库的自定义X509TrustManager,在验证方法中,如果“全局”密钥库无法验证,我会捕获错误,然后调用内部TrustManager对我自己的密钥库进行测试。如果失败,则连接不可信,我可以让他们从custom TrustManager中提取收到的证书链,并询问用户,将证书添加到我自己的KeyResorry中。我不太了解您的评论。看起来你已经有了自己的解决方案,你的问题在寻找什么?
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(getSSLSocketFactory());
urlConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify("localhost", session);
}
});