我正在移植一个应用程序,该应用程序在内部进行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很新,所以我的问题可能有点幼稚,所以请耐心等待:)
答案 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通话之前,请先调用上述方法