RMI via SSL - Couldn't find trusted certificate
Prøver lige nu at lege med RMI via en SSL forbindelse. Fandt en række tutorials på SUNs egen hjemmeside, men kan ikke rigtigt afvikle dem. Smider lige eller 4 klasser der bliver brugt ind så I kan se dem.package testsslpakke.jssesamples.rmi;
import java.io.*;
import java.net.*;
import java.rmi.server.*;
import javax.net.ssl.*;
public class RMISSLClientSocketFactory implements RMIClientSocketFactory, Serializable
{
public Socket createSocket(String host, int port)
throws IOException
{
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
return socket;
}
}
package testsslpakke.jssesamples.rmi;
import java.io.*;
import java.net.*;
import java.rmi.server.*;
import javax.net.ssl.*;
import java.security.KeyStore;
import javax.net.*;
import javax.net.ssl.*;
import javax.security.cert.X509Certificate;
public class RMISSLServerSocketFactory
implements RMIServerSocketFactory, Serializable {
public ServerSocket createServerSocket(int port)
throws IOException
{
SSLServerSocketFactory ssf = null;
try {
// set up key manager to do server authentication
SSLContext ctx;
KeyManagerFactory kmf;
KeyStore ks;
char[] passphrase = "fiskfisk".toCharArray();
ctx = SSLContext.getInstance("SSL");
kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("m:/keystore.jks"), passphrase);
kmf.init(ks, passphrase);
ctx.init(kmf.getKeyManagers(), null, null);
ssf = ctx.getServerSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return ssf.createServerSocket(port);
}
}
Det var de to faktoryPatterns, nu kommer så implementationen af serveren:
package testsslpakke.jssesamples.rmi;
import java.net.InetAddress;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements Hello
{
public HelloImpl() throws RemoteException
{
super(0, new RMISSLClientSocketFactory(),
new RMISSLServerSocketFactory());
}
public String sayHello()
{
return "Hello World!";
}
public static void main(String args[])
{
// Create and install a security manager
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try
{
HelloImpl obj = new HelloImpl();
// Bind this object instance to the name "HelloServer"
Naming.rebind("//" +
InetAddress.getLocalHost().getHostName()+"/HelloServer", obj);
System.out.println("HelloServer bound in registry");
} catch (Exception e)
{
System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();
}
}
}
Og til sidst klienten:
package testsslpakke.jssesamples.rmi;
import java.net.InetAddress;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class HelloClient
{
public static void main(String args[])
{
try
{
for(int i=0;i<args.length;i++)
{System.out.println(i +" : "+args[i]);}
String host = InetAddress.getLocalHost().getHostName();
Hello obj = (Hello)Naming.lookup("//" +host+ "/HelloServer");
//System.out.println("obj = "+obj);
String message = obj.sayHello();
System.out.println(message+"\n");
} catch (Exception e)
{
System.out.println("HelloClient exception: " + e.getMessage());
e.printStackTrace();
}
}
}
Nu starter vi så RMIregistry op, og starter serveren og den skriver fint "Helloserver bound in registry" så den del fungerer fint. Så starter vi klienten, og pludselig kommer den op med denne fejl:
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
javax.net.ssl.SSLHandshakeException: Couldn't find trusted certificate
Efter meget roden frem og tilbage fandt jeg ud af, at det er fordi clienten ikke stoler på på certifikatet og det er sådan set ok. Vi har bare lagt certifikatet ind i keystore.jks, og da keytool spurgte om jeg ville markere det som _trusted_ svarede jeg ja, så det burde være trusted. Selve klienten startes op med disse parametre:
-Djavax.net.ssl.trustStore=m:/keystore.jks
-Djavax.net.ssl.keyStore=m:/keystore.jks
-Djavax.net.ssl.keyStorePassword=fiskfisk
-Djavax.net.ssl.trustStorePassword=fiskfisk
Så både trustStore og keyStore er sat til den samme, men det er der hvor nøglerne ligger, og hvor de ifølge keytool skulle være trusted. Lader til at mange over hele verden har problemer med det her, så hvorfor undrer det mig ikke at jeg også rendte ind i det.
