2011-02-27 83 views
4

我正在使用Apache HttpClient庫來設置https連接。不幸的是,Android給了我一個「不受信任的服務器證書」錯誤。如果我使用手機瀏覽器瀏覽網站,它會正確驗證證書,這使我相信我需要讓HttpClient「知道」手機上的根證書。這是我的HttpClient設置代碼:Android上不受信任的證書錯誤和httpclient

HttpParams params = new BasicHttpParams(); 

HttpConnectionParams.setConnectionTimeout(params, 20000); 
HttpConnectionParams.setSoTimeout(params, 20000); 

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); 
HttpProtocolParams.setUseExpectContinue(params, false); 

SchemeRegistry schReg = new SchemeRegistry(); 
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 

ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg); 

DefaultHttpClient defaultHttpClient = new DefaultHttpClient(conMgr, params); 

return (defaultHttpClient); 

正如你可以看到我做什麼特別與SSLSocketFactory的。我怎樣才能使HttpClient庫驗證我的網站,而無需在密鑰庫中添加自定義證書?我應該創建一個自定義的SSLSocketFactory並從Android手機加載cacerts.bks?在這種情況下,我可能會在不同手機上的密鑰存儲區使用不同密碼的問題?

如果您需要更多信息,請讓我知道。這對於我來說非常困難。

+0

我沒有問題使用HttpClient訪問HTTPS。我只是使用BasicHttpParams和DefaultHttpClient,沒有那ClientConnectionManager或SchemeRegistry ...是你需要的嗎? – SteelBytes

+0

http://stackoverflow.com/questions/995514/https-connection-android#1000205 –

+0

證書需要驗證。安裝一個'不檢查'TrustManager不是首選,否則使用ssl會有什麼意義?我想確保我連接到正確的主機,並且證書沒有被調和。感謝您的鏈接。 – Ivo

回答

0

我以前同樣的問題..

你可以使用這個答案,它爲我工作很好..

Trusting all certificates using HttpClient over HTTPS

+9

不要在生產中這樣做!您正在關閉所有SSL保護。這應該只用於內部測試。任何人都可以MITM請求並竊取所有敏感信息。 – Bishnu

+0

我想補充一點,現在谷歌拒絕試圖繞過這一步 – StevenTB

2

我相信你的證書不包含所需的所有中間證書驗證系統受信任的根證書的路徑。它可以通過一些SSL配置驗證工具報告爲不完整的證書鏈

證書可以包含一個特殊的授權信息訪問擴展名(RFC-3280),其URL爲頒發者證書。大多數瀏覽器都可以使用AIA擴展來下載缺失的中間證書來完成證書鏈。但是一些客戶端(移動瀏覽器,OpenSSL)不支持這種擴展,因此他們將這種證書報告爲不可信。

您可以手動解決未完成證書鏈問題,方法是將證書中的所有證書連接到受信任的根證書(按此順序排除),以防止出現此類問題。請注意,受信任的根證書不應該存在,因爲它已包含在系統的根證書存儲區中。

您應該能夠從發行者處獲取中間證書並自行將它們連接在一起。我已經編寫了一個腳本來自動執行該過程,它循環遍歷AIA擴展以產生正確鏈接的證書的輸出。 https://github.com/zakjan/cert-chain-resolver

+0

感謝這個評論的每個應用程序,你的工具最終幫助我解決了一個問題。 – producerism

0

在zakjan的回答中,我嘗試使用jquery在我的新安全服務器上,在android webview中執行AJAX請求時出現問題。它在瀏覽器中工作,但不在我的應用程序中。

我用這個網站:https://certificatechain.io/

我在簽署.crt文件的文本我從Comodo(positiveSSL)回來粘貼,並給我回一切的concatination我需要的。我救它作爲我的域名+「chain.crt」(見下文)

然後,在我的Apache CONFIGS,我進入這樣的事情對於特定的虛擬主機:

SSLEngine On 
SSLCertificateFile /etc/ssl/localcerts/example_com.crt 
SSLCertificateKeyFile /etc/ssl/localcerts/example.com.key 
SSLCACertificateFile /etc/ssl/localcerts/example.com.chain.crt 

在那之後,我的Android應用程序的webview沒有問題,使用Ajax POST到我的服務器。我在2個真實世界的設備上嘗試過,其中一個運行2.3.4,一個運行4.something。在運行2.3的模擬器上。一切正常。

我希望這會有所幫助。

相關問題