我在让证书在 android 下运行时遇到了很大的问题。我有一个连接到 WCF 服务的 android 客户端。
我认为问题是,证书没有被转移。我收到一条错误消息:403 禁止(在响应中)。我真的希望你能帮助我。=> 在我的安卓客户端
在 Internet Explorer 中,它工作得很好 => 状态 200
我发现这篇文章: http ://android-developers.blogspot.de/2012/03/unifying-key-store-access-in-ics.html
“私钥的常见用途是用于 SSL 客户端身份验证。这可以通过使用带有自定义 X509KeyManager 的 HttpsURLConnection 来实现,该自定义 X509KeyManager 返回从 KeyChain API 检索的 PrivateKey。ICS 的开源电子邮件应用程序使用带有 X509ExtendedKeyManager 的 KeyChain。了解更多信息,请查看源代码(在 SSLUtils.java 中)。”
我已经检查了 SSLUtils 类,我正在尝试使用它。
这是一些代码:
private void setHttpsAdvanced() {
HostAuth ht = new HostAuth();
ht.mPort = 443;
ht.mClientCertAlias = "jensZert";
HttpParams params = getHttpParams();
MyThreadSafeClientConnManager ccm = MyThreadSafeClientConnManager
.newInstance(params, true, 443);
try {
MyThreadSafeClientConnManager.makeScheme(true, false,
ht.mClientCertAlias);
ccm.registerClientCert(getApplicationContext(), ht);
// checkCertificate(ht.mClientCertAlias);
} catch (CertificateException e) {
Log.d(TAG, e.getMessage());
e.printStackTrace();
}
this.httpclient = new DefaultHttpClient(ccm, params);
connectionInfo = this.getConnectionInfo();
this.url = String.format("%1$s://%2$s/%3$s/%4$s",
connectionInfo.Protocol, connectionInfo.ServerName,
connectionInfo.WebserviceName, connectionInfo.Path);
httpGet = new HttpGet(url);
}
private String callTheWebserviceCertificate() {
this.setupClient();
String result = "";
HttpResponse response = null;
try {
response = (HttpResponse) this.httpclient.execute(httpGet);
result = EntityUtils.toString(response.getEntity());
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
result = e.getMessage() + "\n";
for (StackTraceElement el : e.getStackTrace()) {
result += el.toString() + "\n";
}
Log.d(TAG, result);
}
return result;
}
问候,詹斯