SSLServerSocket problem
I am trying to write a stand alone SSLSocket application. I created the certificate with this line:
keytool -genkey -keystore serverkeys -keyalg rsa -alias chat
The SSLServerSocket gets created with no issues. The server accepts connections from the client without complaint. The problem is when I try and create the IO streams. On the server side this is the exception:
javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:117)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1584)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:866)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:678)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2213)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2226)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2694)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:761)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:277)
at secureChatServer.network.SecureServer.createIOStreams(SecureServer.java:131)
at secureChatServer.network.ControllerServer.run(ControllerServer.java:50)
at java.lang.Thread.run(Thread.java:595)
here is the relevant code:
public SecureServer(String IPAddress,int port,int backlog)throws SecureChatException
{
try
{
//set up public private key
kStore = KeyStore.getInstance("JKS");
kStore.load(new FileInputStream(KEY), KP);
keyFactory = KeyManagerFactory.getInstance("SunX509");
keyFactory.init(kStore, KP);
sc = SSLContext.getInstance(PROTOCOL);
sc.init(keyFactory.getKeyManagers(), null,null);
//set up server factory and socket
servFactory= sc.getServerSocketFactory();
servSock = (SSLServerSocket)servFactory.createServerSocket(port, backlog, InetAddress.getByName(IPAddress));
...
and
publicvoid run()
{
short val;
int timeout=2000;
while(!stop)
{
try
{
sock = (SSLSocket)servSock.accept();
createIOStreams();
...
}
...
publicvoid createIOStreams()throws IOException
{
read =new ObjectInputStream(sock.getInputStream());
write =new ObjectOutputStream(sock.getOutputStream());
}
On the client side, I get this exception:
secureChat.exception.SecureChatException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at secureChat.network.SecureConnection.connect(SecureConnection.java:69)
at secureChat.network.RoutineBase.connect(RoutineBase.java:42)
at secureChat.network.SignUp.<init>(SignUp.java:34)
at secureChat.listeners.SignUpFormListener.actionPerformed(SignUpFormListener.java:39)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1778)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
The code:
sock = (SSLSocket)sockFactory.createSocket(Properties.getIPAddress(),Properties.getPort());
write=new ObjectOutputStream(sock.getOutputStream());
read=new ObjectInputStream(sock.getInputStream());
What am I missing?

