2012-04-20 23 views
0

我正在移植一個內部使cURL調用安全地連接到服務器的應用程序。它在向服務器發出請求之前使用下載的證書和私鑰文件。cURL在Android中的SSL通信相當於

我有一個包含RSA私鑰的「My_Private_key.pem」文件,一個包含發送的證書服務器的「My_Certificate.pem」文件和一個用於加密「My_Private_key.pem」的密碼。現在cURL可以選擇設置SSLKey,SSLCertificate和密碼。 實施例

curl_easy_setopt(curl, CURLOPT_SSLCERT, credentials->certfile); 
curl_easy_setopt(curl, CURLOPT_SSLKEY, credentials->keyfile); 
curl_easy_setopt(curl, CURLOPT_KEYPASSWD, credentials->passwd); 

然後捲曲使用此信息來請求服務器。我想在Android中做類似的事情。我經歷了許多鏈接,幫助我創建自己的使用EasySSLSocketFactory,EasyX509TrustManager的HttpClient,但是我找不到在Android中設置這些選項的方法。

Android中的等效方法是什麼?

我很新的SSL和我的問題可能會有點幼稚,請包涵吧:)

+1

http://bit.ly/HStYu4 – Selvin 2012-04-20 12:58:40

回答

2

你必須創建你的密鑰和證書PKCS#12文件,加載它作爲一個密鑰並用它初始化HttpClient(或HttpsURLConnection)。對於HttpClient,您可以使用SSLSocketFactory類用您的密鑰和證書初始化客戶端。

您可以使用像這樣創建PKCS#12文件:

$ OpenSSL的PKCS12 -export -in mycert.pem -inkey mykey.key退房手續mystore.pfx

+0

我的證書和密鑰將在運行時downladed之前。我如何在運行時創建PKCS#12文件? – 2012-04-20 13:05:35

+0

Shd我使用https://groups.google.com/group/android-developers/browse_thread/thread/ee864337e77d30db?pli=1作爲參考? – 2012-04-20 13:11:13

+0

有趣。如何安全地獲取密碼並確保您獲得正確的密鑰?如果您在運行時執行此操作,則不需要創建PKCS#12文件,只需將它們導入到KeyStore中,即可用於初始化HttpClient。 http://developer.android.com/reference/java/security/KeyStore.html – 2012-04-20 13:13:10

0

這是什麼工作對我來說完美。 我把它從一個stackoverflow鏈接,但我現在找不到。所以張貼代碼

public void setHttpsClient(String password) { 

     try { 
      KeyStore mycert = KeyStore.getInstance("pkcs12"); 

      byte[] pkcs12; 

      //Load the PKCS file from database or file. 
      pkcs12 = DataManager.getAuthP12Data(); 
      ByteArrayInputStream pkcs12BAIS = new ByteArrayInputStream(pkcs12); 
      mycert.load(pkcs12BAIS, password.toCharArray()); 

      SSLSocketFactory sockfact = new SSLSocketFactory(mycert, null, null); 

      sockfact.setHostnameVerifier(new StrictHostnameVerifier()); 

      // Done temporarily to accept all hosts 
      //sockfact.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

      SchemeRegistry registry = new SchemeRegistry(); 
      registry.register(new Scheme("https", sockfact, 443)); 

      BasicHttpParams httpParameters = new BasicHttpParams(); 
      HttpProtocolParams.setUseExpectContinue(httpParameters, false); 
      HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1); 

      HttpConnectionParams.setConnectionTimeout(httpParameters, _TIMEOUT); 
      HttpConnectionParams.setSoTimeout(httpParameters, _TIMEOUT); 

      ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
        httpParameters, registry); 
      cm.closeExpiredConnections(); 
      cm.closeIdleConnections(3000, TimeUnit.MILLISECONDS); 

      _httpClient = new MyHttpClient(cm, httpParameters); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

調用此上述方法,你開始做你的HTTPS調用