Skip to Main Content

Java APIs

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

SSL: Received fatal alert: certificate_unknown Problem

843790Apr 20 2010 — edited Apr 22 2010
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!
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on May 20 2010
Added on Apr 20 2010
26 comments
33,880 views