2012-05-10 46 views
1

如果我在Android 2.3的打了一個HTTPS URL,它會自動使用SSL?我在Android 2.2和Android 2.3之間編寫的應用程序遇到問題。當我點擊Android 2.2上的https網址時,它彈出並給出了下面的內容,但是當我在Android 2.3上使用相同的代碼時,我什麼也得不到。所以從閱讀我已經做了什麼我想到的是在這個URL的證書類型是默認情況下Android 2.3接受的類型,但不是由Android 2.2,是嗎?SSL與Android 2.2和2.3

05-10 13:04:37.659: WARN/System.err(2177): javax.net.ssl.SSLException: Not trusted server certificate 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:92) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
05-10 13:04:37.659: WARN/System.err(2177): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
05-10 13:04:37.667: WARN/System.err(2177): at giat.hermes.network.IntelinkConnector.connect(IntelinkConnector.java:120) 
05-10 13:04:37.667: WARN/System.err(2177): at giat.hermes.view.CreateAccount$ThreadLogMeIn.run(CreateAccount.java:77) 
05-10 13:04:37.667: WARN/System.err(2177): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found. 
05-10 13:04:37.667: WARN/System.err(2177): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:168) 
05-10 13:04:37.674: WARN/System.err(2177): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366) 
05-10 13:04:37.674: WARN/System.err(2177): ... 11 more 
05-10 13:04:37.674: WARN/System.err(2177): Caused by: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found. 
05-10 13:04:37.698: WARN/System.err(2177): at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:225) 
05-10 13:04:37.698: WARN/System.err(2177): at java.security.cert.CertPathValidator.validate(CertPathValidator.java:202) 
05-10 13:04:37.698: WARN/System.err(2177): at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:164) 
05-10 13:04:37.698: WARN/System.err(2177): ... 12 more 

而且我不希望只是接受所有服務器證書

而且,如果這是什麼造成的問題,這將是足以覆蓋向後兼容?我不太可能在Android的未來更新中遇到這種情況?

+0

所有你的假設是正確的。就像您的電腦一樣,操作系統維護着一系列「可信認證機構」。您正在處理的服務器證書由未在Android 2.2中列出的CA頒發。您應該期望如果2.3支持,任何後續版本都將包含相同的CA證書。 – CSmith

+0

以及通過在Android 2.3上僅使用常規httpPost訪問https網址,默認情況下使用SSL並處理證書以及所有那些沒有我必須執行任何操作的情況? – Josh

回答

1

如果你想/需要您的應用程序與2.2和更低的工作,你需要在你的應用程序中的CA證書,並設置HttpClient的信任它。您不需要(也不應該)接受所有證書。至於未來的更新,如果證書被破壞,證書可能會被刪除,但否則不太可能。

是的,如果你正在訪問的HTTPS URL,數據將使用SSL發送和接收(加密)。您可以捕獲數據包進行驗證。

+0

好的。這有幫助。我注意到很奇怪的行爲。我只在運行2.2.3的舊摩托羅拉Droid上看到這個問題(如第一個)。一個新的(er)三星Infuse我使用運行2.2.1不會遇到這個問題。由於還有其他需要2.3.x的功能,我想我只是將我的min SDK修改爲2.3並且完成它,因爲2.3似乎沒有這個問題。感謝您的幫助 – Josh

+0

運營商定製固件,因此Droid和Infuse上的可信證書很可能不同。順便說一句,我認爲摩托羅拉在設置中有一個自定義用戶界面,允許您添加可信任的證書,但我不確定他們推出了哪個版本。如果可用,您可以嘗試添加證書。此工具將允許列出可信證書(並在根設備上添加)。可能對調試有幫助:https://github.com/guardianproject/cacert –