java服务器和android客户端之间的SSL连接失败
我正在尝试在java主机和android客户端之间设置相互身份验证SSL连接。不知道为什么它没有连接。下面是Android客户端应用程序和Java服务器的代码 客户端代码:java服务器和android客户端之间的SSL连接失败,java,android,ssl,Java,Android,Ssl,我正在尝试在java主机和android客户端之间设置相互身份验证SSL连接。不知道为什么它没有连接。下面是Android客户端应用程序和Java服务器的代码 客户端代码: private SSLContext createSSLContext(final Context cont){ SSLContext ssl_cont = null; try { Log.d(TAG, "TrustStore - Initializing"); KeyS
private SSLContext createSSLContext(final Context cont){
SSLContext ssl_cont = null;
try {
Log.d(TAG, "TrustStore - Initializing");
KeyStore trustStore = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = cont.getResources().openRawResource(R.raw.myclienttruststore);
trustStore.load(trustStoreStream, "client".toCharArray());
trustManagerFactory.init(trustStore);
Log.d(TAG, "TrustStore - Initialized");
// Setup keystore
Log.d(TAG, "KeyStore - Initializing");
KeyStore keyStore = KeyStore.getInstance("BKS");
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream keyStoreStream = cont.getResources().openRawResource(R.raw.myclient);
keyStore.load(keyStoreStream, "client".toCharArray());
keyManagerFactory.init(keyStore, "client".toCharArray());
Log.d(TAG, "KeyStore - Initialized");
ssl_cont = SSLContext.getInstance("TLS");
ssl_cont.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
} catch (Exception e) {
// TODO Auto-generated catch block
alertbox("SSLClient", "ERROR: " + e.getMessage());
Log.d(TAG, "ERROR: " + e.getMessage());
}
return ssl_cont;
}
OnClickListener onConnClick = new OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
try {
// Setup the SSL context to use the truststore and keystore
Log.d(TAG, "Started..");
SSLContext ssl_context = createSSLContext(cont);
Log.d(TAG,"here 1...");
SSLSocketFactory socketFactory = (SSLSocketFactory) ssl_context.getSocketFactory();
Log.d(TAG,"here 2...");
socket = (SSLSocket) socketFactory.createSocket(ipadd.getText().toString().trim(), Integer.parseInt(port.getText().toString().trim()));
Log.d(TAG,"here 3...");
dataOut = new DataOutputStream(socket.getOutputStream());
dataIn = new DataInputStream(socket.getInputStream());
dataOut.writeUTF("Hello !!");
msgin.setText("Connected");
Log.d(TAG, "Completed..");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
msgin.setText("Not connected");
alertbox("Main", "ERROR: " + e.getMessage());
Log.d(TAG, "ERROR: " + e.getMessage());
}
}
};
服务器代码:
try {
mySSLServerFac = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
mySSLServerSocket = (SSLServerSocket) mySSLServerFac.createServerSocket(9999);
System.out.println("Listening on 9999\n");
mySSLSocket = (SSLSocket) mySSLServerSocket.accept();
DataInputStream input = new DataInputStream(mySSLSocket.getInputStream());
DataOutputStream output = new DataOutputStream(mySSLSocket.getOutputStream());
do{
System.out.println("Remote IP Address : " + mySSLSocket.getInetAddress());
msg = input.readUTF().toString();
System.out.println(msg);
java.util.Scanner sc = new java.util.Scanner(System.in);
output.writeUTF(sc.nextLine());
}while(msg != "exit");
System.out.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
我在服务器上遇到了“无通用密码套件”错误。因为我不在SSL连接设置中。如果您发现错误或主要问题,请让我帮助您
下面是我创建证书和信任库的步骤。我创建的Truststore和kestore是
我使用的是Android 2.2和BKSProvider 1.46,请告诉我哪里出了问题。我必须尽快结束这个项目
提前感谢。从堆栈跟踪中,您捕获的异常似乎不包含消息
Log.d(TAG, e.getMessage());
它与SSL无关。问题解决了!问题在于java主机的信任库,如下所示 需要为客户端/服务器指定信任库,因为它们正在使用默认的信任库,从而导致失败。在服务器上使用-Djavax.net.ssl.trustStore=servertruststore.jks-Djavax.net.ssl.trustStorePassword=server,并在客户端创建自己的密钥库和信任库,即可完成会话。正是-Djavax.net.debug=ssl握手起了很大的作用 整个命令是:java-Djavax.net.ssl.keyStore=server.jks-Djavax.net.ssl.keyStorePassword=server-Djavax.net.ssl.trustStore=servertruststore.jks-Djavax.net.ssl.trustStorePassword=server-SSLServer
现在我开始创建sslsession和多线程编程。是的!你是对的。清除了空异常。但事实是SSL连接还不起作用。阿哈宁,你帮我摆脱了零异常兄弟。谢谢你的建议。但我仍然无法在java服务器和android客户端之间建立连接。@我可以,请添加堆栈跟踪以便人们可以帮助您。我已经解决了这个问题,但现在面临另一个问题,它与java主机上的“无通用密码套件”和android客户端上的“SSLHandshake失败”有关。我需要再次发帖还是应该继续发帖?因为我处理的是自签名证书,在java主机和android客户端之间建立ssl连接才是真正的痛苦。已创建了以下证书,但代码已修改位。任何信息如何克服“无通用密码套件”错误?定义“未连接”。会发生什么?堆栈跟踪?复制背后可能的原因是,我的帖子没有得到回复。这是一个没有人能回答的问题吗?除非我得到回答,否则我永远不会放弃再次尝试和问这个问题。这不是在这里重复帖子的一个可接受的理由。@EJP,我现在面临的问题与以前不同。这些帖子的内容是相同的,但问题是不同的。所以我会尝试修改当前的帖子来描述我当前的问题,对不起,太吵了。下次会小心的。但我担心,这个帖子会被忽略,可能得不到任何回应。