android - 接受带有自签名证书的 HTTPS 连接

标签 android ssl https httpclient ca

我正在尝试使用 HttpClient 库建立 HTTPS 连接,但问题是,因为证书不是由公认的证书颁发机构 (CA) 签署的,例如 Verisign , GlobalSIgn等,在 Android 可信证书集上列出,我不断收到 javax.net.ssl.SSLException: Not trusted server certificate

我见过您只接受所有证书的解决方案,但如果我想询问用户怎么办?

我想得到一个类似于浏览器的对话框,让用户决定是否继续。最好我想使用与浏览器相同的证书库。有什么想法吗?

最佳答案

您需要做的第一件事是设置验证级别。 这样的水平并没有那么多:

  • ALLOW_ALL_HOSTNAME_VERIFIER
  • BROWSER_COMPATIBLE_HOSTNAME_VERIFIER
  • STRICT_HOSTNAME_VERIFIER

虽然 setHostnameVerifier() 方法对于新库 apache 已经过时,但对于 Android SDK 中的版本是正常的。 因此我们采用 ALLOW_ALL_HOSTNAME_VERIFIER 并将其设置在方法工厂 SSLSocketFactory.setHostnameVerifier() 中。

接下来,您需要将协议(protocol)的工厂设置为https。为此,只需调用 SchemeRegistry.register() 方法即可。

然后您需要使用SingleClientConnManager 创建一个DefaultHttpClient。 同样在下面的代码中,您可以看到默认情况下还将通过方法 HttpsURLConnection.setDefaultHostnameVerifier()

使用我们的标志 (ALLOW_ALL_HOSTNAME_VERIFIER)

下面的代码适合我:

HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

DefaultHttpClient client = new DefaultHttpClient();

SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());

// Set verifier     
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

// Example send http request
final String url = "https://encrypted.google.com/";
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost);

关于android - 接受带有自签名证书的 HTTPS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413079/

相关文章:

android - 使用 achartengine,如何在不使用 x 标签的情况下设置 x 轴值?

html - 如何使用 HTTPS 连接从父级内部的 HTTP 服务器加载内容

ssl - 如何判断使用某些密码套件可以建立什么 SSL/TLS 协议(protocol)版本

java - 更新 TeamCity Server SSL 证书后断开 TeamCity Build Agent

java - HttpURLConnection 与 https InputStream 乱码

vue.js - 如何通过 HTTPS 为 Vue 应用程序提供本地开发服务

java - 获取android字符串中的属性值

java - 如何在现有 Realm 数据库中添加新表?

android - 如何使用 Android Studio 和 Gradle 创建最佳的 Android 应用项目结构?

ssl - 如何创建受信任的自签名 SSL 证书