我正在开发一款需要客户端和服务器证书身份验证的Android应用.我有一个SSLClient类,我创建它在常规桌面Java SE 6上运行得很漂亮.我已将它移动到我的Android项目中,我收到以下错误:"未找到KeyStore JKS实现".
我在网上看了一下,看起来有可能在Android上不支持Java Keystores(太棒了!)但是我觉得它还有更多的东西,因为我发现的示例代码都不像我我试图去做.我发现的一切都谈到了使用http客户端而不是原始SSL套接字.我需要这个应用程序的SSL套接字.
下面是我的SSLClient.java文件中的代码.它读取密钥库和信任库,创建到服务器的SSL套接字连接,然后在等待来自服务器的输入行时运行循环,然后通过调用不同类中的方法来处理它们.我非常有兴趣听到有任何在Android平台上使用SSL套接字的经验的人.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.security.AccessControlException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import otherpackege.OtherClass;
import android.content.Context;
import android.util.Log;
public class SSLClient
{
static SSLContext ssl_ctx;
public SSLClient(Context context)
{
try
{
// Setup truststore
KeyStore trustStore = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = context.getResources().openRawResource(R.raw.mysrvtruststore);
trustStore.load(trustStoreStream, "testtest".toCharArray());
trustManagerFactory.init(trustStore); …Run Code Online (Sandbox Code Playgroud) 我从ksoap调用.NET WCF Web服务我的WebMethod采用一个复杂的参数UpdatableCustomerInfo
public class UpdatableCustomerInfo implements KvmSerializable {
public String CustomerId;
public String Facebook;
@Override
public Object getProperty(int arg0) {
String retVal = "";
switch(arg0)
{
case 0:
retVal = CustomerId;
break;
case 1:
retVal = Facebook;
break;
}
return retVal;
}
@Override
public int getPropertyCount() {
return 2;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch(arg0)
{
case 0:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "CustomerId";
break;
case 1:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Facebook"; …Run Code Online (Sandbox Code Playgroud)