1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.ws.soap.client.http;
18
19 import java.io.IOException;
20 import java.net.InetAddress;
21 import java.net.InetSocketAddress;
22 import java.net.Socket;
23 import java.net.SocketAddress;
24 import java.security.GeneralSecurityException;
25
26 import javax.net.SocketFactory;
27 import javax.net.ssl.KeyManager;
28 import javax.net.ssl.SSLContext;
29 import javax.net.ssl.TrustManager;
30 import javax.net.ssl.X509KeyManager;
31 import javax.net.ssl.X509TrustManager;
32
33 import net.jcip.annotations.ThreadSafe;
34
35 import org.apache.commons.httpclient.params.HttpConnectionParams;
36 import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
37
38
39 @ThreadSafe
40 public class TLSProtocolSocketFactory implements SecureProtocolSocketFactory {
41
42
43 private X509KeyManager keyManager;
44
45
46 private X509TrustManager trustManager;
47
48
49 private SSLContext sslContext;
50
51
52
53
54
55
56
57
58
59
60 public TLSProtocolSocketFactory(X509KeyManager keyMgr, X509TrustManager trustMgr) throws IllegalArgumentException {
61 keyManager = keyMgr;
62 trustManager = trustMgr;
63
64 try {
65 sslContext = SSLContext.getInstance("SSL");
66 sslContext.init(new KeyManager[] { keyManager }, new TrustManager[] { trustManager }, null);
67 } catch (GeneralSecurityException e) {
68 throw new IllegalArgumentException("Error create SSL context", e);
69 }
70 }
71
72
73 public Socket createSocket(String host, int port) throws IOException {
74 return sslContext.getSocketFactory().createSocket(host, port);
75 }
76
77
78 public Socket createSocket(String host, int port, InetAddress localHost, int clientPort) throws IOException {
79 return sslContext.getSocketFactory().createSocket(host, port, localHost, clientPort);
80 }
81
82
83 public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
84 return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
85 }
86
87
88 public Socket createSocket(String host, int port, InetAddress localHost, int localPort,
89 HttpConnectionParams connParams) throws IOException {
90 if (connParams == null) {
91 throw new IllegalArgumentException("Parameters may not be null");
92 }
93 int timeout = connParams.getConnectionTimeout();
94 SocketFactory socketfactory = sslContext.getSocketFactory();
95 if (timeout == 0) {
96 return socketfactory.createSocket(host, port, localHost, localPort);
97 } else {
98 Socket socket = socketfactory.createSocket();
99 SocketAddress localaddr = new InetSocketAddress(localHost, localPort);
100 SocketAddress remoteaddr = new InetSocketAddress(host, port);
101 socket.bind(localaddr);
102 socket.connect(remoteaddr, timeout);
103 return socket;
104 }
105 }
106
107
108 public boolean equals(Object obj) {
109 return (obj != null) && obj.getClass().equals(getClass());
110 }
111
112
113 public int hashCode() {
114 return getClass().hashCode();
115 }
116 }