1

我正在使用modules.io来托管我的应用程序。他们允许 SSL 搭载在他们的通配符 *.onmoulus.net 证书上,并且还允许使用您自己的特定于您的自定义域的证书。我一直在使用他们的证书并使用运行良好的 AndroidHttpClient 实例连接到https://myapp.onmodulus.net ,但是在尝试在我自己的自定义域名上使用 ssl 时遇到了一些问题。

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

但是,当我尝试在我的 android 应用程序中连接时,我的成功率较低。当打开一个 url 并像这样管理 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 证书而不是我的 thawte 证书,我真的不明白为什么。我已经使用 HttpClient 实例编写了我的应用程序,因此如果可能的话,我真的希望能够以这种方式进行连接,而不是使用类似于第一个解决方案的东西。

4

1 回答 1

2

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

免责声明:我为 Modulus 工作。

于 2013-11-11T16:39:27.883 回答