Hi all, first I read this thread http://forums.sun.com/thread.jspa?threadID=5385002 but I didnt help me so i startad a new one.
I´m doing a client, server and thread implementation with ssl, i copied certifcates and keystores on the directories and so on.
Here is the error on the server, just when a client conects:
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at org.tockit.comunication.ServerThread.run(ServerThread.java:55)
at java.lang.Thread.run(Unknown Source)
Here is the code of the client, server and server thread, i cant find the error as i follow some tutorials and it worked:
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import citic.android.remoteir.ComConstants;
import citic.android.remoteir.SendMessage;
public class Client {
public static void main(String[] args)
{
// Se crea el cliente y se le manda pedir el fichero.
Client cf = new Client();
BufferedReader in = null;
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
cf.pide("rup", "localhost", 27960, 0, 20);
}
public void pide(String query, String servidor, int puerto, int startIndex, int count)
{
try
{
// Se abre el socket.
SSLSocketFactory sslsocketfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)sslsocketfactory.createSocket(servidor,puerto);
ObjectOutputStream oos = new ObjectOutputStream(socket
.getOutputStream());
SendMessage mensaje = new SendMessage();
mensaje.queryTerms = query;
mensaje.startIndex = startIndex;
mensaje.count = count;
oos.writeObject(mensaje);
ObjectInputStream ois = new ObjectInputStream(socket
.getInputStream());
ComConstants mensajeRecibido;
Object mensajeAux;
String mensa = null;
do
{
mensajeAux = ois.readObject();
// Si es del tipo esperado, se trata
if (mensajeAux instanceof ComConstants)
{
mensajeRecibido = (ComConstants) mensajeAux;
System.out.println("Client has Search Results");
String test;
test = new String(
mensajeRecibido.fileContent, 0,
mensajeRecibido.okBytes);
if (mensa == null) {
mensa = test;
}
else {
mensa += test;
}
System.out.println("client mierda" + test);
} else
{
System.err.println("Mensaje no esperado "
+ mensajeAux.getClass().getName());
break;
}
} while (!mensajeRecibido.lastMessage);
SaxParser sap = new SaxParser(mensa);
ois.close();
socket.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
}
package org.tockit.comunication;
import java.io.*;
import java.net.*;
import java.security.KeyStore;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
System.out.println("Indroduzca valor del puerto");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader (isr);
int port;
try
{
String texto = br.readLine();
int valor = Integer.parseInt(texto);
port = valor;
try {
System.setProperty("javax.net.ssl.keyStore","C:\\Program Files\\Java\\jre6\\bin\\remoteir.ks");
System.setProperty("javax.net.ssl.keyStorePassword","aquabona");
SSLServerSocketFactory sslServerSocketfactory = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket = (SSLServerSocket)sslServerSocketfactory.createServerSocket(port);
System.out.println("Arracando servidor en " + port);
while (listening){
SSLSocket cliente = (SSLSocket)sslServerSocket.accept();
System.out.println("Aceptado cliente");
Runnable nuevoServer = new ServerThread(cliente);
Thread hilo = new Thread(nuevoServer);
hilo.start();
}
} catch (IOException e) {
System.err.println("Could not listen on port:" + port);
System.exit(-1);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
The line at at org.tockit.comunication.ServerThread.run(ServerThread.java:55) is marked with ERRRROOOOOORRRRR and serverThread cod is posted on the fisrt reply post.
All this code works in absence of SSL (regular sockets).
I have another question related to the SSLSockets in the method of the serverThread, will my SSLSockets in the serverThread´s methods work to comunicate with other servers as i try to do?
Thanks!