在 Android 上使用 HttpsUrlConnection 时,如果我使用不受信任的证书(很可能是自签名证书)连接到服务器,我将收到错误消息。 例如,当浏览器中发生类似情况时,我仍然可以选择接受该证书。
- 计划是正常运行 URL 连接。
- 如果发生证书错误,请使用 Dummy“trust all”重新运行 设置,当然仍然会尽快断开连接 已收到证书(在 X509TrustManager 和 然后是 HostNameVerifier)。在 HostNameVerifier 中返回 false 做得很好。
- 询问用户是否真的想使用这个证书。
现在,我如何将此证书添加到应用程序的存储区,以便下次连接到该服务器时使用它?
或者我是否需要自己制作 X509TrustManager/HostNameVerifier,并将传入的证书数据与存储的证书数据进行比较,同时保持所有 CA 签名证书的正常功能。
换句话说。
- 从服务器检索公共(public)证书(完成)
- 询问用户是否仍要使用它。
- 将该公共(public)证书导入应用自己的商店中的某处,以供将来连接使用。
- 回退到所有 CA 信任证书的常规信任链。
因为我在所有其他问题中都看到过类似的问题,人们开始提供所有错误的解决方案。我不想要一个 AcceptAllVerifier。我可以不使用任何需要我手动导入证书的东西。
最佳答案
如果我正确理解您的问题,那么您不必像您的问题中那样AcceptAllVerifier。
下面的代码是一个例子,我想你可以引用一下:
假设您的服务器应用程序托管在一台服务器机器内,该机器具有服务器证书,例如,“颁发给” 是 “localhost”。然后,在 verify
方法中,您可以验证“localhost”。
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);
}
});
更多关于cert文件,getSSLSocketFactory
...可以引用以下问题(当然HttpsUrlConnection
也可以申请):
Does Android Volley support SSL?
Volley SSL - Hostname was not verified
希望这对您有所帮助!
关于android - 如何为将来的连接存储 "untrusted/selfsigned"证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32935094/