SSLServer.java.sic
上传用户:huihesys
上传日期:2007-01-04
资源大小:3877k
文件大小:7k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /* $Id: SSLServer.java.sic,v 1.1.1.1 2000/02/01 12:01:37 wastl Exp $ */
  2. package webmail.server.http;
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.*;
  6. import java.math.BigInteger;
  7. import java.security.*;
  8. import iaik.security.ssl.*;
  9. import iaik.security.rsa.*;
  10. import iaik.x509.*;
  11. import iaik.asn1.structures.Name;
  12. import iaik.asn1.ObjectID;
  13. import iaik.security.provider.IAIK;
  14. import webmail.config.Server;
  15. import webmail.config.ConfigurationListener;
  16. import webmail.server.*;
  17. import webmail.ui.html.*;
  18. import webmail.debug.ErrorHandler;
  19. /**
  20.  * HTTPServer.java
  21.  *
  22.  *
  23.  * Created: Tue Feb  2 12:15:48 1999
  24.  *
  25.  * @author Sebastian Schaffert
  26.  * @version $Revision: 1.1.1.1 $
  27.  */
  28. public class SSLServer extends HTTPServer implements ConfigurationListener {
  29.     private class WebMailRSAPrivateKey extends RSAPrivateKey {
  30. WebMailRSAPrivateKey(String s) throws java.security.InvalidKeyException, IOException {
  31.     super(s);
  32. }
  33. public BigInteger getPrivateExponent() {
  34.     return getExponent();
  35. }
  36.     }
  37.     private boolean shutdown=false;
  38.     private int port;
  39.     private ConnectionTimer timer;
  40.     private SSLServerSocket socket;
  41.     private SSLContext serverContext;
  42.     private WebMailServer parent;
  43.     private Hashtable html_loaders;
  44.     private long start_time;
  45.     private long nr_connections=0;
  46.     public SSLServer(WebMailServer parent) {
  47. super();
  48. System.err.print("- IAIK SSL Server ...");
  49. parent.getConfigScheme().configRegisterIntegerKey(this,"SSL PORT","6790","Port where the SSL server will accept connections");
  50. parent.getConfigScheme().configRegisterStringKey(this,"SSL CERTS","../data/ssl/certs/","Path to SSL certificates");
  51. parent.getConfigScheme().configRegisterStringKey(this,"SSL ADDRESS","0.0.0.0","Address for the SSL Server to listen on (default: all addresses)");
  52. parent.getConfigScheme().configRegisterIntegerKey(this,"SSL BACKLOG","50","SSL Server Socket Backlog (how many connections to hold in Queue)");
  53. parent.getConfigScheme().configRegisterIntegerKey(this,"SSL CONNECTION LIMIT","50","Maximum number of simultaneous connections (reduce to avoid server crash on machines with low memory, 20 should be ok for medium-high load machines)");
  54. parent.getConfigScheme().configRegisterYesNoKey(this,"SSL ENABLE","Enable the SSL server.");
  55. this.timer=parent.getConnectionTimer();
  56. this.parent=parent;
  57. int port=6790;
  58. try {
  59.     port=Integer.parseInt(parent.getStorage().getConfig("SSL PORT"));
  60. } catch(NumberFormatException e) {
  61. }
  62. int max_connections=50;
  63. current_connections=0;
  64. try {
  65.     max_connections=Integer.parseInt(parent.getStorage().getConfig("SSL CONNECTION LIMIT"));
  66. } catch(NumberFormatException e) {
  67. }
  68. int backlog=50;
  69. try {
  70.     backlog=Integer.parseInt(parent.getStorage().getConfig("SSL BACKLOG"));
  71. } catch(NumberFormatException e) {
  72. }
  73. if(parent.getStorage().getConfig("SSL ENABLE").toUpperCase().equals("YES")) {
  74.     IAIK provider = new IAIK();
  75.     Security.addProvider(provider);
  76.     
  77.     SSLSocket ssl = null;
  78.     SSLContext serverContext = new SSLContext();
  79.     
  80.     X509Certificate[] certList = new X509Certificate[2];
  81.     RSAPrivateKey privateKey = null;
  82.     
  83.     KeyPair tempKeyPair = null;
  84.     
  85.     try {
  86. certList[0] = new X509Certificate(parent.getConfig("SSL CERTS")+"/serverCert1024.der");
  87. certList[1] = new X509Certificate(parent.getConfig("SSL CERTS")+"/caCert1024.der");
  88. privateKey = new WebMailRSAPrivateKey(parent.getConfig("SSL CERTS")+"/serverPrivateKey.der");
  89. RSAPrivateKey tsk = new WebMailRSAPrivateKey(parent.getConfig("SSL CERTS")+"/tempPrivateKey.der");
  90. PublicKey tpk = tsk.getPublicKey();
  91. tempKeyPair = new KeyPair(tpk, tsk);
  92. serverContext.setCertificate(certList, privateKey);
  93. serverContext.setTempKeyPair(tempKeyPair);
  94. Name[] cas = new Name[1];
  95. cas[0] = new Name();
  96. cas[0].addRDN(ObjectID.country, Locale.getDefault().getCountry().toUpperCase());
  97. //    DefaultTrustDecider dtd = new DefaultTrustDecider(cas);
  98. //    serverContext.setTrustDecider(dtd);
  99. CipherSuite[] cs = new CipherSuite[8];
  100. cs[0] = CipherSuite.SSL_RSA_WITH_3DES_EDE_CBC_SHA;  // Netscape-Enterprise/2.0a
  101. cs[1] = CipherSuite.SSL_RSA_WITH_IDEA_CBC_SHA;
  102. cs[2] = CipherSuite.SSL_RSA_WITH_DES_CBC_SHA;       // Netscape-Enterprise/2.0a
  103. cs[3] = CipherSuite.SSL_RSA_WITH_RC4_MD5;           // Netscape-Enterprise/2.0a
  104. cs[4] = CipherSuite.SSL_RSA_WITH_RC4_SHA;
  105. cs[5] = CipherSuite.SSL_RSA_EXPORT_WITH_RC4_40_MD5; // Netscape-Enterprise/2.0a
  106. cs[6] = CipherSuite.SSL_RSA_EXPORT_WITH_DES40_CBC_SHA;
  107. cs[7] = CipherSuite.SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5;
  108. // enable this 8 cipher suites
  109. serverContext.setEnabledCipherSuites(cs);
  110. socket = new SSLServerSocket(port, backlog, 
  111.      InetAddress.getByName(parent.getStorage().getConfig("SSL ADDRESS")), 
  112.      serverContext);
  113. this.start();
  114. System.err.println(" initialization complete. Listening on port "+port+".");
  115. start_time=System.currentTimeMillis();
  116.     
  117.     } catch(Exception ex) {
  118. //new ErrorHandler(ex);
  119. System.err.println(" initialization failed! ("+ex.getMessage()+")");
  120.     }
  121. } else {
  122.     System.err.println(" SSL disabled in configuration. Server not started.");
  123. }
  124.     }
  125.     
  126.     public void shutdown() {
  127. shutdown=true;
  128. System.err.print("- SSL Server shutdown requested ...");
  129. try {
  130.     socket.close();
  131. } catch(Exception e) {}
  132. try {
  133.     // Give connections enough time to terminate
  134.     sleep(2000);
  135. } catch(InterruptedException ex) {}
  136. //this.stop();
  137. System.err.println("complete!");
  138.     }
  139.     public String getStatus() {
  140. String status;
  141. if(isAlive()) {
  142.     status="SSL Server listening on "+socket.getInetAddress()+", Port "+port;
  143.     long up=System.currentTimeMillis()-start_time;
  144.     status+="nUptime: "+up/1000+" secondsn";
  145.     status+="Number of connections so far: "+nr_connections+", average "+ (nr_connections*60000/up) +" conn/minn";
  146.     status+="There are currently "+current_connections+" connections out of a maximum of "+max_connections+".n";
  147. } else {
  148.     status="SSL Server disabled.";
  149. }
  150. return status;
  151.     }
  152.     public void notifyConfigurationChange(String key) {
  153. parent.reinitSSLServer();
  154.     }
  155.     public void run() {
  156. while(!shutdown) {
  157.     /* Enter critical resource. Connections must release this on termination! */
  158.     if(current_connections < max_connections) {
  159.     
  160. try {
  161.     if(Runtime.getRuntime().freeMemory() > required_free_memory) {
  162. SSLSocket client=(SSLSocket)socket.accept();
  163. //client.setDebugStream(System.out);
  164. //System.err.println(client.toString());
  165. Connection conn=new Connection(client,parent,this);
  166. nr_connections++;
  167.     } else {
  168. parent.getStorage().log(Storage.LOG_ERR,"Error: Ran out of memory. Garbage collecting. You might want to increase the minimum memory size in webmail.sh to avoid this.");
  169. System.gc();
  170.     }
  171. } catch(IOException ex) {
  172.     if(!ex.getMessage().equals("Socket closed")) {
  173. new ErrorHandler(ex);
  174.     }
  175. }
  176.     } else {
  177. parent.getStorage().log(Storage.LOG_DEBUG,"SSL Server: Maximum number of SSL connections reached. You might want to increase the SSL CONNECTION LIMIT if your server is fast enough");
  178. try {
  179.     synchronized(this) {
  180. wait();
  181.     }
  182. } catch(InterruptedException ex) {}
  183.     }
  184. }
  185.     }
  186. } // Server