2011-03-30 44 views
14

我在這裏有代碼,允許我連接到https服務器並傳輸數據。它工作得很好,但我想知道我是否以正確的方式進行,而且我確實正在建立安全連接。請檢查我的工作。謝謝。Android/Java - 如何創建HTTPS連接?

public class HTTPSClient extends DefaultHttpClient 
{ 

    public HTTPSClient() 
    { 
    } 

    @Override 
    protected ClientConnectionManager createClientConnectionManager() 
    { 
     SchemeRegistry registry = new SchemeRegistry(); 

     HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER; 
     final SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); 
     socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
     //socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", socketFactory, 80)); 
     registry.register(new Scheme("https", socketFactory, 443)); 
     HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, "UTF-8"); 

     return new SingleClientConnManager(params, registry); 
    } 
} 

我使用此代碼如下所示:

HttpResponse response = mConnection.httpsClient.execute(new HttpHost("www.somehostname.com", 80), new HttpGet("https://someaddress"))); 

我讀,然後從那裏的響應。 再次感謝。

+0

這是什麼在上面的代碼'socketFactory' – 2012-08-27 06:37:41

+0

通過使用此代碼我收到'javax.net.ssl.SSLPeerUnverifiedException:沒有同行certificate' – 2012-08-29 05:41:53

回答

7

看。

斯蒂芬ç提到的,你不需要註冊端口80用於HTTPS環境。將它註冊爲http(如果需要的話)。這意味着,當您調用https url時,將使用正確的socketFactory。

注意:當您從Android設備連接到與不是很出名的發行人自定義證書或證書的網站,您會收到在大多數情況下,「證書不被信任」或類似的例外。如果是這種情況,您需要爲您的應用程序創建自定義證書存儲,以便它信任您的服務器證書。如果你想知道熱點來實現這一點,你可以看看我的blog article

如果你想檢查,如果你的設備真的通過安全連接進行通信,你可以從你的android模擬器調用https端點並在您的開發人員機器上使用Wireshark捕獲流量。

希望這有助於

+0

saxos嗨。我遵循了您的指示,並且仍然收到「不可信服務器證書」錯誤,隨後出現「未找到CertPath的TrustAnchor」。錯誤依次爲「java.security.cert.CertPathValidatorException:未找到CertPath的CertAnchor」。錯誤。我有一個有效的密鑰庫,它正在導入,但會發生這些錯誤。謝謝 – RyanM 2011-03-30 18:30:11

+0

嗨 您是否以正確的順序導入所有必需的證書?首先是最內層的中間CA證書,最後是根CA.根本不要導入網絡服務器證書。 注意:如果您的網絡服務器以錯誤的順序提供證書鏈(例如,第一個條目是根CA,第二個條目是中間CA),您仍然會收到「不可信」錯誤。 如果是這種情況,在Web服務器上更改順序或看這裏:http://stackoverflow.com/questions/4115101/apache-httpclient-on-android-producing-certpathvalidatorexception-issuername/4199518#4199518 – saxos 2011-03-31 15:41:41

+0

你好。我結束了使用一個urlconnection來做我的ssl通信。我的服務器使用的證書是衆所周知的,因此我實際上並不需要這樣做。 urlconnection爲我處理它。謝謝。 – RyanM 2011-03-31 23:29:14

4

我懷疑這個:

registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    registry.register(new Scheme("https", socketFactory, 80)); 
    registry.register(new Scheme("https", socketFactory, 443)); 

特別是2號線。爲什麼要爲「https」方案註冊端口80?

這可能是無害/冗餘,或者你要在官方Custom SSL context教程Apache的HttpClient的發送「https」開頭的請求端口80