1 /* SSLServerSocketFactory.java -- factory for SSL server sockets.
2    Copyright (C) 2004 Free Software Foundation, Inc.
3 
4 This file is part of GNU Classpath.
5 
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10 
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING.  If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301 USA.
20 
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library.  Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
25 
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module.  An independent module is a module which is not derived from
33 or based on this library.  If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so.  If you do not wish to do so, delete this
36 exception statement from your version. */
37 
38 
39 package javax.net.ssl;
40 
41 import java.io.IOException;
42 import java.net.InetAddress;
43 import java.net.ServerSocket;
44 import java.security.KeyStore;
45 import java.security.Security;
46 
47 import javax.net.ServerSocketFactory;
48 
49 /**
50  * A server socket factory for <i>Secure Socket Layer</i> (<b>SSL</b>)
51  * server sockets.
52  */
53 public abstract class SSLServerSocketFactory extends ServerSocketFactory
54 {
55   // Field.
56   // -------------------------------------------------------------------------
57 
58   private static SSLContext context;
59 
60   // Constructor.
61   // -------------------------------------------------------------------------
62 
SSLServerSocketFactory()63   protected SSLServerSocketFactory()
64   {
65     super();
66   }
67 
68   // Class methods.
69   // -------------------------------------------------------------------------
70 
71   /**
72    * Returns a default implementation of a SSL server socket factory.
73    *
74    * <p>To control the class that gets returned by this method, set the
75    * security property "ssl.ServerSocketFactory.provider" to the class
76    * name of a concrete implementation of this class. If not set, a
77    * system-dependent implementation will be used.</p>
78    *
79    * <p>The implementation returned is created by the first implementation
80    * of the {@link SSLContext} class found, which is initialized with
81    * default parameters. To control the key and trust manager factory
82    * algorithms used as defaults, set the security properties
83    * "ssl.keyManagerFactory.algorithm" and "ssl.trustManagerFactory.algorithm"
84    * to the appropriate names.</p>
85    *
86    * <p>Using this method is not recommended. Instead, use the methods of
87    * {@link SSLContext}, which provide much better control over the
88    * creation of server socket factories.</p>
89    *
90    * @return The default server socket factory.
91    * @throws RuntimeException If no default can be created.
92    */
getDefault()93   public static synchronized ServerSocketFactory getDefault()
94   {
95     try
96       {
97         String s = Security.getProperty("ssl.ServerSocketFactory.provider");
98         ClassLoader cl = ClassLoader.getSystemClassLoader();
99         if (s != null && cl != null)
100           {
101             return (ServerSocketFactory) cl.loadClass(s).newInstance();
102           }
103       }
104     catch (Exception e)
105       {
106       }
107     if (context == null)
108       {
109         KeyManager[] km = null;
110         TrustManager[] tm = null;
111 
112         // 1. Determine which algorithms to use for the key and trust
113         // manager factories.
114         String kmAlg = KeyManagerFactory.getDefaultAlgorithm();
115         String tmAlg = TrustManagerFactory.getDefaultAlgorithm();
116         // 2. Try to initialize the factories with default parameters.
117         try
118           {
119             KeyManagerFactory kmf = KeyManagerFactory.getInstance(kmAlg);
120             kmf.init(null, null);
121             km = kmf.getKeyManagers();
122           }
123         catch (Exception ex)
124           {
125           }
126         try
127           {
128             TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmAlg);
129             tmf.init((KeyStore) null);
130             tm = tmf.getTrustManagers();
131           }
132         catch (Exception ex)
133           {
134           }
135 
136         // 3. Create and initialize a context.
137         try
138           {
139             context = SSLContext.getInstance("SSLv3");
140             context.init(km, tm, null);
141           }
142         catch (Exception ex)
143           {
144             return new ErrorServerSocketFactory(new RuntimeException(
145                 "error instantiating default server socket factory: "
146                                        + ex.toString(), ex));
147           }
148       }
149     try
150       {
151         return context.getServerSocketFactory();
152       }
153     catch (Exception e)
154       {
155       }
156     return new ErrorServerSocketFactory(new RuntimeException(
157         "no SSLSocketFactory implementation available"));
158   }
159 
160   private static final class ErrorServerSocketFactory
161     extends SSLServerSocketFactory
162   {
163     private RuntimeException x;
164 
ErrorServerSocketFactory(RuntimeException x)165     ErrorServerSocketFactory(RuntimeException x)
166     {
167       this.x = x;
168     }
169 
createServerSocket()170     public ServerSocket createServerSocket() throws IOException
171     {
172       throw (IOException) new IOException().initCause(x);
173     }
174 
createServerSocket(int port)175     public ServerSocket createServerSocket(int port) throws IOException
176     {
177       throw (IOException) new IOException().initCause(x);
178     }
179 
createServerSocket(int port, int backlog)180     public ServerSocket createServerSocket(int port, int backlog)
181       throws IOException
182     {
183       throw (IOException) new IOException().initCause(x);
184     }
185 
createServerSocket(int port, int backlog, InetAddress ifAddress)186     public ServerSocket createServerSocket(int port, int backlog,
187                                            InetAddress ifAddress)
188       throws IOException
189     {
190       throw (IOException) new IOException().initCause(x);
191     }
192 
getDefaultCipherSuites()193     public String[] getDefaultCipherSuites()
194     {
195       throw new RuntimeException(x);
196     }
197 
getSupportedCipherSuites()198     public String[] getSupportedCipherSuites()
199     {
200       throw new RuntimeException(x);
201     }
202   }
203 
204   // Abstract methods.
205   // -------------------------------------------------------------------------
206 
207   /**
208    * Returns the list of cipher suites that will be enabled in server sockets
209    * created by this factory.
210    *
211    * @return The default cipher suites.
212    */
getDefaultCipherSuites()213   public abstract String[] getDefaultCipherSuites();
214 
215   /**
216    * Returns the list of all cipher suites supported by this factory.
217    *
218    * @return The list of supported cipher suites.
219    */
getSupportedCipherSuites()220   public abstract String[] getSupportedCipherSuites();
221 }
222