cURL SSL通信等效于Android

时间:2012-04-20 12:37:35

标签: android ssl curl ssl-certificate

我正在移植一个应用程序,该应用程序在内部进行cURL调用以安全地连接到服务器。它在向服务器发出请求之前使用下载的证书和私钥文件。

我有一个包含RSA私钥的“My_Private_key.pem”文件,一个“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);

然后cURL使用此信息来请求服务器。我想在Android中做类似的事情。我已经通过许多链接帮助我创建自己的HttpClient,它使用EasySSLSocketFactory,EasyX509TrustManager,但我找不到在Android中设置这些选项的方法。

Android中的等效方法是什么?

我对SSL很新,所以我的问题可能有点幼稚,所以请耐心等待:)

2 个答案:

答案 0 :(得分:2)

您必须从密钥和证书创建PKCS#12文件,将其作为密钥库加载并使用它初始化HttpClient(或HttpsURLConnection)。对于HttpClient,您可以使用SSLSocketFactory类使用密钥和证书初始化客户端。

您可以使用类似的东西来创建PKCS#12文件:

$ openssl pkcs12 -export -in mycert.pem -inkey mykey.key -out mystore.pfx

答案 1 :(得分: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通话之前,请先调用上述方法