title: Generate SSL Certificate using keytool provide in jdk
body: <p>Keystore files I have used in my web application expired last week. I generated it long time ago. So I started generating new certificate using keytool. I used this certificate to connect a transaction server and the web server. I wanted to use self signed certificate for this application. I generate it using following command to generate self signed key for transaction server. </p>
  
  <pre><code>keytool -genkey -keystore keys/SvrKeyStore -keyalg rsa -validity 365 -alias Svr -storepass 123456 -keypass abcdefg -dname "CN=One1, OU=Development1, O=One, L=Bamba, S=Western Prov1, C=S1"
  </code></pre>
  
  <p>following commnad to generate keystore for web application</p>
  
  <pre><code>keytool -genkey -keystore keys/ClientKeyStore -keyalg rsa -validity 365 -alias Web -storepass 123456 -keypass abcdefg -dname "CN=One, OU=Development, O=One, L=Bamba, S=Western Prov, C=SL"
  </code></pre>
  
  <p>I used following code in the transaction server to create the socket connection</p>
  
  <pre><code>          String KEYSTORE = Config.KEYSTORE_FILE;//SvrKeyStore  keystore file
            char[] KEYSTOREPW = "123456".toCharArray();
            char[] KEYPW = "abcdefg".toCharArray();
            com.sun.net.ssl.TrustManagerFactory tmf;
  
            boolean requireClientAuthentication;
  
            java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.
                                               Provider());
            java.security.KeyStore keystore = java.security.KeyStore.getInstance(
                "JKS");
            keystore.load(new FileInputStream(KEYSTORE), KEYSTOREPW);
  
            com.sun.net.ssl.KeyManagerFactory kmf = com.sun.net.ssl.
                KeyManagerFactory.getInstance("SunX509");
            kmf.init(keystore, KEYPW);
  
            com.sun.net.ssl.SSLContext sslc = com.sun.net.ssl.SSLContext.
                getInstance("SSLv3");
            tmf = com.sun.net.ssl.TrustManagerFactory.getInstance("sunx509");
            tmf.init(keystore);
  
            sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
            SSLServerSocketFactory ssf = sslc.getServerSocketFactory();
            SSLServerSocket ssocket = (SSLServerSocket) ssf.createServerSocket(port);
            ssocket.setNeedClientAuth(true);
  </code></pre>
  
  <p>But it gives following exception when I used it in my application and try to connect to the transaction server through web server</p>
  
  <pre><code>javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHands
  hakeException: java.security.cert.CertificateException: Untrusted Server Certifi
  cate Chain
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.jav
  a:1172)
          at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:
  65)
          at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.jav
  a:166)
          at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.jav
  a:78)
          at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241)
          at java.lang.Thread.run(Thread.java:619)
  Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateEx
  ception: Untrusted Server Certificate Chain
          at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1
  520)
          at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:182)
          at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:176)
          at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Clien
  tHandshaker.java:975)
          at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHa
  ndshaker.java:123)
          at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:5
  11)
          at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.jav
  a:449)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.j
  ava:817)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SS
  LSocketImpl.java:1029)
          at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.
  java:621)
          at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.ja
  va:59)
          at java.io.OutputStream.write(OutputStream.java:58)
  </code></pre>
  
  <p>Please can any one tell me where is the problem</p>