2014-10-20 101 views
1

我在爲我的服務器通過互聯網同步數據的android寫簡單的記事本。我使用https和startssl的免費證書,一切都很順利。後來,我用自己的SSL證書添加了新的虛擬主機,並且我的應用程序突然停止了服務器。它拋出:Java SSLException:證書中的主機名不匹配。非常錯誤的證書?

javax.net.ssl.SSLException: hostname in certificate didn't match: <www.rapidnote.emendus.ovh> != <othersite.emendus.ovh> OR <othersite.emendus.ovh> OR <emendus.ovh> 

它試圖驗證從不同的apache虛擬主機完全不同的證書。我對rapidnote虛擬主機Apache的配置是:

<VirtualHost *:80> 
    ServerName    rapidnote.emendus.ovh 
    ServerAlias    www.rapidnote.emendus.ovh 
    Redirect Permanent  / https://www.rapidnote.emendus.ovh 
</VirtualHost> 

<VirtualHost *:443> 
    ServerName    rapidnote.emendus.ovh 
    DocumentRoot    /var/www/rapidnote 
    SSLEngine     on 
    SSLCertificateFile  cert_location/rapidnote.emendus.ovh.crt 
    SSLCertificateKeyFile  key_location/rapidnote.emendus.ovh.key 
    SSLCertificateChainFile cert_location/sub.class1.server.ca.pem 
</VirtualHost> 

<VirtualHost *:443> 
    ServerName    www.rapidnote.emendus.ovh 
    DocumentRoot    /var/www/rapidnote 
    SSLEngine     on 
    SSLCertificateFile  cert_location/www.rapidnote.emendus.ovh.crt 
    SSLCertificateKeyFile  key_location/www.rapidnote.emendus.ovh.key 
    SSLCertificateChainFile cert_location/sub.class1.server.ca.pem 
</VirtualHost> 

我的代碼看起來如下:

HttpClient httpClient = new DefaultHttpClient(); 
HttpPost  httpPost = new HttpPost("https://www.rapidnote.emendus.ovh/" + paramScriptName); 
HttpResponse response = httpClient.execute(httpPost); 

如果我在apache的關閉othersite.emendus.ovh虛擬主機,然後異常SSLException消息稱:

<www.rapidnote.emendus.ovh> != <rapidnote.emendus.ovh> OR <rapidnote.emendus.ovh> OR <emendus.ovh> 

如果然後我將"https://www.rapidnote.emendus.ovh/"更改爲"https://rapidnote.emendus.ovh/",它開始工作。我檢查了兩個(www和非www)證書和兩個公共名稱都是正確的。 我覺得應該驗證,我給了他HttpPost構造從我的服務器,而不是一些其他隨機證書域的證書......

我使用了一些測試網站,以驗證我的SSL配置和它說,它是所有罰款。

一切都發生在android 4.2.2 (API 17)。 我構建的應用程序與min SDK 14target SDK API 20 Android 4.4 (KitKat Wear)

我怎麼能告訴他覈實無誤的證書,此域指定? 是在應用程序或Apache的網站上的問題?

+0

爲什麼不將所有:80個請求和:443個www請求重定向到單個443 rapidnote.emendus.ovh地址,而不是嘗試使用單個SSL來涵蓋多個端點? – 2014-10-20 23:20:20

+1

由於SSL驗證在重定向之前發生,所以它會失敗並在開始時停止。 – Dzarafata 2014-10-21 08:47:35

回答

4

您的服務器配置爲使用服務器名稱指示(SNI)顯示不同的證書。

據我所知,與Android捆綁在一起的Apache HTTP Client版本不支持SNI。您可以嘗試使用HttpsURLConnection而不是HttpClient,這應該支持Android版本不太舊的SNI。 the answers to this question有更多詳細信息。

請注意,您仍然需要證書顯示主機名稱對該主機名有效,即它需要該名稱的主題備用名稱條目(或主題DN的CN需要如果沒有DNS SAN,就是該名稱)。 (如果您有這樣的證書,也可以使用通配符。)

+0

謝謝!它正在工作;) – Dzarafata 2014-10-21 09:57:11

0

SSL證書通過IP地址而不是域名查找。

因此,檢查證書時,第一項是贏了,而你的情況是一個:rapidnote.emendus.ovh

如果您切換周圍的條目,該條目www.rapidnote.emendus.ovh會工作,而不是其他。

我認爲有一種方法可以讓www和非www域名在一個證書上工作,但我不記得確切的過程,對不起。希望有人會填寫這些細節,我們都會學習。我認爲一些CA會給你兩個地址,但是我不知道他們是如何製作該證書的。

如果您只需要使用一個IP地址,我建議您查看通配符和通用通信證書。

如果您可以有多個IP地址,則爲每個網址分配一個不同的IP地址。但是,由於您直接使用80/433,因此這看起來像生產服務器。這建議不是超級推薦。我喜歡爲我的www和非www網址提供一個IP地址。

+0

我正在使用SNI在一個IP上使用多個CA,每個域名使用一個,並且使用webbrowser完美無瑕,但是就像Bruno所說的,似乎Android的Apache HTTp客戶端不支持SNI。 – Dzarafata 2014-10-21 08:50:33

相關問題