0

我正在移植一个应用程序,该应用程序在内部进行 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 中做类似的事情。我浏览了许多链接,这些链接帮助我创建了自己的使用 EasySSLSocketFactory、EasyX509TrustManager 的 HttpClient,但我找不到在 Android 中设置这些选项的方法。

在 Android 中等效的方法是什么?

我对 SSL 很陌生,所以我的问题可能有点天真,所以请多多包涵:)

4

2 回答 2

2

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

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

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

于 2012-04-20T12:57:19.073 回答
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 调用之前调用上述方法

于 2012-06-19T06:43:27.903 回答