2013-11-10 33 views
1

我使用modulus.io來託管我的應用程序。它們允許在其通配符* .onmoulus.net證書上搭載SSL,並且還使用您自己的自定義特定於您的自定義域的證書。我一直在使用他們的證書,並使用AndroidHttpClient實例連接到https://myapp.onmodulus.net,該實例運行良好,但遇到一些問題,試圖在我自己的自定義域名上使用ssl。使用SSL時,HttpClient和HttpsURLConnection返回不同的證書

我已經爲我的域名購買並安裝了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()); 
    } 

everyting去罰款,該網站正確響應,並表明我的Thawte的證書,只有我Thawte的證書被使用。 * .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實例編寫了我的應用程序,所以如果可能的話,我更希望能夠以這種方式進行連接,而不是使用第一種解決方案之類的東西。

回答

2

Modulus自定義域SSL需要SNI支持。看起來只有HttpsURLConnection對象支持與SNI連接,基於這些docs。發生的事情是DefaultHTTPClient正在連接,但由於它沒有提供服務器名稱,所以Modulus默認回到* .onmodulus.net通配符證書。

聲明:我爲Modulus工作。

+0

你也可以使用SNI和HttpClient:http://blog.dev001.net/post/67082904181/android-using-sni-with-apache-httpclient-library – junique