1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.eclipse.jetty.server;
21
22
23 import javax.net.ssl.SSLEngine;
24 import javax.net.ssl.SSLSession;
25
26 import org.eclipse.jetty.http.HttpVersion;
27 import org.eclipse.jetty.io.AbstractConnection;
28 import org.eclipse.jetty.io.Connection;
29 import org.eclipse.jetty.io.EndPoint;
30 import org.eclipse.jetty.io.ssl.SslConnection;
31 import org.eclipse.jetty.io.ssl.SslHandshakeListener;
32 import org.eclipse.jetty.util.annotation.Name;
33 import org.eclipse.jetty.util.component.ContainerLifeCycle;
34 import org.eclipse.jetty.util.ssl.SslContextFactory;
35
36 public class SslConnectionFactory extends AbstractConnectionFactory
37 {
38 private final SslContextFactory _sslContextFactory;
39 private final String _nextProtocol;
40
41 public SslConnectionFactory()
42 {
43 this(HttpVersion.HTTP_1_1.asString());
44 }
45
46 public SslConnectionFactory(@Name("next") String nextProtocol)
47 {
48 this(null,nextProtocol);
49 }
50
51 public SslConnectionFactory(@Name("sslContextFactory") SslContextFactory factory, @Name("next") String nextProtocol)
52 {
53 super("SSL");
54 _sslContextFactory=factory==null?new SslContextFactory():factory;
55 _nextProtocol=nextProtocol;
56 addBean(_sslContextFactory);
57 }
58
59 public SslContextFactory getSslContextFactory()
60 {
61 return _sslContextFactory;
62 }
63
64 @Override
65 protected void doStart() throws Exception
66 {
67 super.doStart();
68
69 SSLEngine engine = _sslContextFactory.newSSLEngine();
70 engine.setUseClientMode(false);
71 SSLSession session=engine.getSession();
72
73 if (session.getPacketBufferSize()>getInputBufferSize())
74 setInputBufferSize(session.getPacketBufferSize());
75 }
76
77 @Override
78 public Connection newConnection(Connector connector, EndPoint endPoint)
79 {
80 SSLEngine engine = _sslContextFactory.newSSLEngine(endPoint.getRemoteAddress());
81 engine.setUseClientMode(false);
82
83 SslConnection sslConnection = newSslConnection(connector, endPoint, engine);
84 sslConnection.setRenegotiationAllowed(_sslContextFactory.isRenegotiationAllowed());
85 configure(sslConnection, connector, endPoint);
86
87 ConnectionFactory next = connector.getConnectionFactory(_nextProtocol);
88 EndPoint decryptedEndPoint = sslConnection.getDecryptedEndPoint();
89 Connection connection = next.newConnection(connector, decryptedEndPoint);
90 decryptedEndPoint.setConnection(connection);
91
92 return sslConnection;
93 }
94
95 protected SslConnection newSslConnection(Connector connector, EndPoint endPoint, SSLEngine engine)
96 {
97 return new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine);
98 }
99
100 @Override
101 protected AbstractConnection configure(AbstractConnection connection, Connector connector, EndPoint endPoint)
102 {
103 if (connection instanceof SslConnection)
104 {
105 SslConnection sslConnection = (SslConnection)connection;
106 if (connector instanceof ContainerLifeCycle)
107 {
108 ContainerLifeCycle container = (ContainerLifeCycle)connector;
109 container.getBeans(SslHandshakeListener.class).forEach(sslConnection::addHandshakeListener);
110 }
111 getBeans(SslHandshakeListener.class).forEach(sslConnection::addHandshakeListener);
112 }
113 return super.configure(connection, connector, endPoint);
114 }
115
116 @Override
117 public String toString()
118 {
119 return String.format("%s@%x{%s->%s}",this.getClass().getSimpleName(),hashCode(),getProtocol(),_nextProtocol);
120 }
121
122 }