To preserve my virtue at the weekend I amended the VNC appletviewer to be able to use 
secure
sockets. I was surprized this hasn't been done already, that I could find, and really 
it should be
included as standard in the release.

These are the changes I made to CConn.java.  Note most of the changes are to support 
my self
signed certificate, which is OK for me as a home user.  If you are using certificate 
with a trail
to a good certification authority you should be able to get away with a 2 line change, 
using the
default SocketFactory.

// additional imports
import java.awt.*;
import java.awt.Event;
import java.io.*;
import javax.net.ssl.*;
import java.security.cert.*;
import java.security.*;

//a new class (in CConn.java)
class MyTrustManager implements X509TrustManager {

   MyTrustManager() { // constructor
      // create/load keystore
   }

   public void checkClientTrusted(X509Certificate chain[], String authType)
                 throws CertificateException {
   }

   public void checkServerTrusted(X509Certificate chain[], String authType) 
                throws CertificateException {
      // special handling such as poping dialog boxes
      X509Certificate first = chain[0];
      System.err.println("Serial Number "+first.getSerialNumber());
      java.math.BigInteger cert = new java.math.BigInteger("123456789");
      java.math.BigInteger  in = new 
java.math.BigInteger(first.getSerialNumber().toString());
      if (cert.equals(in)==false)
      {
        throw new CertificateException("not the same serial numbers!");
      }
        
   }

   public X509Certificate[] getAcceptedIssuers() {
        System.out.println("Caution getAcceptedIssuers called - not implemented 
properly!!");
        return null;     
   }
}

//Note I'm checking the serial number of my certificate, but his isn't necessary
//getAcceptedIssuers() should return an array (maybe empty), but
//I don't know how to get the values.  Fix suggestions, please?

//In public class CConn the init() function has been changed:
public boolean init(java.net.Socket sock_, String vncServerName,
                      boolean alwaysShowServerDialog)
    throws java.io.IOException
  {
    sock = sock_;

    if (sock != null) {
      String name = sock.getInetAddress().getHostAddress()+"::"+sock.getPort();
      vlog.info("Accepted connection from "+name);
    } else {
      if (alwaysShowServerDialog || vncServerName == null) {
        ServerDialog dlg = new ServerDialog(options, about, vncServerName);
        if (!dlg.showDialog() || dlg.server.getText().equals(""))
          return false;
        vncServerName = dlg.server.getText();
      }
      serverHost = rfb.Hostname.getHost(vncServerName);
      serverPort = rfb.Hostname.getPort(vncServerName);

//      sock = new java.net.Socket(serverHost, serverPort);

// new secure code
        X509TrustManager xtm = new MyTrustManager();
        TrustManager mytm[] = {xtm};
        SSLContext ctx;
        try{
                ctx = SSLContext.getInstance("SSL");
        }
        catch (NoSuchAlgorithmException e)
        {
                System.err.println("No such Algorithm Exception");
                throw new IOException("Algorithm Exception SSL");
        }
        try{
                ctx.init(null,mytm, null );
        }
        catch (KeyManagementException e)
        {
                System.err.println("KeyManagementException e");
                throw new IOException ("Key Management after SSL");
        }
        SSLSocketFactory sf = ctx.getSocketFactory();

        /* too simplistic 
        SSLSocketFactory sslFact =
                (SSLSocketFactory)SSLSocketFactory.getDefault();
         */
        SSLSocket s =
                (SSLSocket)sf.createSocket(serverHost, serverPort);
        String ciphers[] = s.getEnabledCipherSuites();
        int c=0;
        System.err.println("Ciphers");
        for (c=0;c<ciphers.length;c++)
        {
                System.err.println(ciphers[c]);
        }
        
        sock = s;
      vlog.info("connected to host "+serverHost+" port "+serverPort);
    }

    setServerName(sock.getInetAddress().getHostAddress()+"::"+sock.getPort());
    jis = new rdr.JavaInStream(sock.getInputStream());
    jos = new rdr.JavaOutStream(sock.getOutputStream());
    setStreams(jis, jos);
    initialiseProtocol();
    return true;
  }

//I've printed out some information to System.err.println(), but this really should be 
through
//vlog.


If this code could be tidied up, and improved, with e.g. certificate presentation for 
acceptance
that that would be a great improvement.  I did get this dialog once or twice, but 
pressing OK made
no difference, and I was still getting a "No trusted certificate found" exception.  It 
looks like
it needs Sun's Java 1.4 or later compiler because my Cygnus GNU gcj didn't work.

Regards,
Dave.







        
        
                
___________________________________________________________ALL-NEW Yahoo! Messenger - 
sooooo many all-new ways to express yourself http://uk.messenger.yahoo.com
_______________________________________________
VNC-List mailing list
[EMAIL PROTECTED]
To remove yourself from the list visit:
http://www.realvnc.com/mailman/listinfo/vnc-list

Reply via email to