使用SSL时,HttpClient和HttpsURLConnection返回不同的证书

时间:2013-11-10 07:16:28

标签: android ssl https

我正在使用modulus.io来托管我的应用。它们允许SSL捎带其通配符* .onmoulus.net证书,并且还使用您自己的特定于自定义域的证书。我一直在使用他们的证书并使用AndroidHttpClient实例连接到https://myapp.onmodulus.net,该实例工作正常,但在尝试在我自己的自定义域名上使用ssl时遇到了一些问题。

我已经为我的域购买并安装了thawte的证书,当我使用浏览器连接时,一切都很顺利。我看到了小锁图标,当我检查证书时,我正在使用我的解密证书,而不是* .onmodulus.net证书。在安装我自己的证书之前,它显示“此连接不受信任”警告,我可以看到正在使用* .onmodulus.net证书。

但是,当我尝试在我的Android应用程序中连接时,我的成功较少。打开网址并管理httpsURLConnection时如下:

URL myURL = new URL("https://www.myapp.com");
HttpsURLConnection myConnection = (HttpsURLConnection) myURL.openConnection();
try {
  System.out.println("Response Code : " + myConnection.getResponseCode());

  Certificate[] certs = myConnection.getServerCertificates();
  for(Certificate cert : certs){
    System.out.println("Cert Details: " + cert.toString());
  }

一切顺利,网站响应正确,它显示我的解密证书,只使用我的解密证书。 * .onmodulus.net证书根本不显示。但是,当我尝试使用DefaultHttpClient进行连接时,如下所示:

DefaultHttpClient myClient = new DefaultHttpClient();
HttpGet getRequest = new HttpGet("https://www.myapp.com");
HttpResponse rawResponse = myClient.execute(getRequest);

我得到了:

javax.net.ssl.SSLException: hostname in certificate didn't match: <www.myapp.com> != <*.onmodulus.net> OR <*.onmodulus.net> OR <onmodulus.net>

我不确定如何更密切地检查证书,但现在它似乎使用通配符* .onmodulus.net证书而不是我的解密证书,我真的不明白为什么。我已经使用HttpClient实例编写了我的应用程序,所以我真的希望能够以这种方式连接,而不是像第一种解决方案那样使用。

1 个答案:

答案 0 :(得分:2)

模数自定义域SSL需要SNI支持。看起来只有HttpsURLConnection对象支持基于这些docs与SNI的连接。发生的事情是DefaultHTTPClient正在连接,但由于它没有提供服务器名称,因此Modulus默认返回* .onmodulus.net通配符证书。

免责声明:我为Modulus工作。