View Javadoc

1   /*
2    * ====================================================================
3    *
4    * The Apache Software License, Version 1.1
5    *
6    * Copyright (c) 2002-2003 The Apache Software Foundation.  All rights
7    * reserved.
8    *
9    * Redistribution and use in source and binary forms, with or without
10   * modification, are permitted provided that the following conditions
11   * are met:
12   *
13   * 1. Redistributions of source code must retain the above copyright
14   *    notice, this list of conditions and the following disclaimer.
15   *
16   * 2. Redistributions in binary form must reproduce the above copyright
17   *    notice, this list of conditions and the following disclaimer in
18   *    the documentation and/or other materials provided with the
19   *    distribution.
20   *
21   * 3. The end-user documentation included with the redistribution, if
22   *    any, must include the following acknowlegement:
23   *       "This product includes software developed by the
24   *        Apache Software Foundation (http://www.apache.org/)."
25   *    Alternately, this acknowlegement may appear in the software itself,
26   *    if and wherever such third-party acknowlegements normally appear.
27   *
28   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
29   *    Foundation" must not be used to endorse or promote products derived
30   *    from this software without prior written permission. For written
31   *    permission, please contact apache@apache.org.
32   *
33   * 5. Products derived from this software may not be called "Apache"
34   *    nor may "Apache" appear in their names without prior written
35   *    permission of the Apache Group.
36   *
37   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
41   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48   * SUCH DAMAGE.
49   * ====================================================================
50   *
51   * This software consists of voluntary contributions made by many
52   * individuals on behalf of the Apache Software Foundation.  For more
53   * information on the Apache Software Foundation, please see
54   * <http://www.apache.org/>.
55   *
56   * [Additional notices, if required by prior licensing conditions]
57   *
58   */
59  
60  package org.apache.commons.httpclient.contrib.ssl;
61  
62  import java.io.IOException;
63  import java.net.InetAddress;
64  import java.net.Socket;
65  import java.net.UnknownHostException;
66  import javax.net.ssl.SSLSocketFactory;
67  
68  import com.sun.net.ssl.SSLContext;
69  import com.sun.net.ssl.TrustManager; 
70  
71  import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
72  import org.apache.commons.logging.Log; 
73  import org.apache.commons.logging.LogFactory;
74  
75  /***
76   * <p>
77   * EasySSLProtocolSocketFactory can be used to creats SSL {@link Socket}s 
78   * that accept self-signed certificates. 
79   * </p>
80   * <p>
81   * This socket factory SHOULD NOT be used for productive systems 
82   * due to security reasons, unless it is a concious decision and 
83   * you are perfectly aware of security implications of accepting 
84   * self-signed certificates
85   * </p>
86   * 
87   * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
88   * 
89   * DISCLAIMER: HttpClient developers DO NOT actively support this component.
90   * The component is provided as a reference material, which may be inappropriate
91   * to be used without additional customization.
92   */
93  
94  public class EasySSLProtocolSocketFactory implements SecureProtocolSocketFactory {
95  
96      /*** Log object for this class. */
97      private static final Log LOG = LogFactory.getLog(EasySSLProtocolSocketFactory.class);
98  
99      /***
100      * Constructor for EasySSLProtocolSocketFactory.
101      * 
102      * Code sample:
103      *  
104      *     <blockquote>
105      *     Protocol easyhttps = new Protocol( 
106      *         "https", new EasySSLProtocolSocketFactory(), 443);
107      *
108      *     HttpClient client = new HttpClient();
109      *     client.getHostConfiguration().setHost("localhost", 443, easyhttps);
110      *     </blockquote>
111      */
112     public EasySSLProtocolSocketFactory() {
113         super();
114     }
115 
116     private static SSLSocketFactory getEasySSLSocketFactory() {
117         SSLContext context = null;
118         try {
119             context = SSLContext.getInstance("SSL");
120             context.init(
121               null, 
122               new TrustManager[] {new EasyX509TrustManager(null)}, 
123               null);
124         } catch (Exception e) {
125             LOG.error(e.getMessage(), e);
126             throw new RuntimeException(e.toString());
127         }
128         return context.getSocketFactory();
129     }
130 
131 
132     /***
133      * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int,java.net.InetAddress,int)
134      */
135     public Socket createSocket(
136         String host,
137         int port,
138         InetAddress clientHost,
139         int clientPort)
140         throws IOException, UnknownHostException {
141 
142         Socket socket = getEasySSLSocketFactory().createSocket(
143             host,
144             port,
145             clientHost,
146             clientPort
147         );
148         return socket;
149     }
150 
151     /***
152      * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
153      */
154     public Socket createSocket(String host, int port)
155         throws IOException, UnknownHostException {
156         return getEasySSLSocketFactory().createSocket(
157             host,
158             port
159         );
160     }
161 
162     /***
163      * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
164      */
165     public Socket createSocket(
166         Socket socket,
167         String host,
168         int port,
169         boolean autoClose)
170         throws IOException, UnknownHostException {
171         return getEasySSLSocketFactory().createSocket(
172             socket,
173             host,
174             port,
175             autoClose
176         );
177     }
178 }