2012-04-20 5 views
0

Я переношу приложение, которое внутренне делает вызовы cURL для безопасного подключения к серверу. Он использует загруженный сертификат и файл закрытого ключа перед тем, как сделать запрос на сервер.cURL SSL-эквивалент связи в Android

У меня есть файл «My_Private_key.pem», содержащий секретный ключ RSA, файл «My_Certificate.pem», содержащий отправленный сервер сертификатов, и пароль, с помощью которого «My_Private_key.pem» зашифрован. Теперь cURL имеет возможность установки SSLKey, SSLCertificate и Password. Пример

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. Я прошел через многие ссылки, которые помогают мне создать собственный HttpClient, который использует EasySSLSocketFactory, EasyX509TrustManager, но я не смог найти способ установить эти параметры в Android.

Что такое эквивалентный способ сделать в Android?

Я очень новичок в SSL и поэтому мой вопрос может быть немного наивным так, пожалуйста, медведь с ним :)

+1

http://bit.ly/HStYu4 – Selvin

ответ

2

Вы должны создать PKCS # 12 файл с ключом и сертификатом, загрузите его в качестве хранилища ключей и инициализировать HttpClient (или HttpsURLConnection) с ним. Для HttpClient вы можете использовать класс SSLSocketFactory для инициализации клиента ключом и сертификатом.

Вы можете использовать что-то вроде этого, чтобы создать PKCS # 12 файл:

$ OpenSSL PKCS12 -export -в mycert.pem -inkey mykey.key -out mystore.pfx

+0

Мой сертификат и ключ будет downladed во время выполнения. Как я могу создать файл PKCS # 12 во время выполнения? –

+0

Shd Я использую этот https://groups.google.com/group/android-developers/browse_thread/thread/ee864337e77d30db?pli=1 для справки? –

+0

Интересно. Как вы получите безопасный пароль и убедитесь, что получаете правильный ключ? Если вы делаете это во время выполнения, вам не нужно создавать файл PKCS # 12, просто импортируйте их в KeyStore, чтобы вы могли использовать для инициализации HttpClient. http://developer.android.com/reference/java/security/KeyStore.html –

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 вызывает

Смежные вопросы