Skip to content

Commit 14bf4f6

Browse files
committed
micro server ssl support
1 parent 6482f2d commit 14bf4f6

File tree

8 files changed

+89
-32
lines changed

8 files changed

+89
-32
lines changed

micro-core/src/main/java/com/aol/micro/server/MicroserverApp.java

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,9 @@ private ServerApplication createServer(Module module) {
146146
}
147147

148148
ServerApplication app = applications.get(0)
149-
.createApp(module, springContext);
150-
151-
if (Config.instance()
152-
.getSslProperties() != null)
153-
return app.withSSLProperties(Config.instance()
154-
.getSslProperties());
155-
else
156-
return app;
157-
}
149+
.createApp(module, springContext);
150+
return app;
151+
}
158152

159153
private void join(Thread thread) {
160154
try {

micro-core/src/main/java/com/aol/micro/server/config/Classes.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import lombok.Getter;
77
import nonautoscan.com.aol.micro.server.AopConfig;
8+
import nonautoscan.com.aol.micro.server.SSLConfig;
89
import nonautoscan.com.aol.micro.server.ScheduleAndAsyncConfig;
910

1011
import com.aol.micro.server.module.ConfigureEnviroment;
@@ -28,7 +29,7 @@ public class Classes {
2829
* Codahale Metrics, Event tracking etc
2930
*/
3031
public static final Classes CORE_CLASSES = new Classes(PropertyFileConfig.class, AopConfig.class,
31-
ScheduleAndAsyncConfig.class, ConfigureEnviroment.class, AccessLogConfig.class);
32+
ScheduleAndAsyncConfig.class, ConfigureEnviroment.class, AccessLogConfig.class, SSLConfig.class);
3233

3334

3435
@Getter

micro-core/src/main/java/com/aol/micro/server/config/Config.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ public class Config {
3636
private final String instancePropertiesName;
3737
private final String serviceTypePropertiesName;
3838
private final PMap<String, List<String>> dataSources;
39-
private final SSLProperties sslProperties;
4039
private final boolean allowCircularReferences;
4140
private final String[] basePackages;
4241

@@ -48,7 +47,6 @@ public Config() {
4847
propertiesName = "application.properties";
4948
instancePropertiesName = "instance.properties";
5049
serviceTypePropertiesName = "service-type.properties";
51-
sslProperties = null;
5250
allowCircularReferences = false;
5351
basePackages = new String[0];
5452

micro-core/src/main/java/com/aol/micro/server/config/SSLProperties.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,10 @@ public AnyM<String> getCiphers() {
4444
public AnyM<String> getProtocol() {
4545
return AnyM.ofNullable(protocol);
4646
}
47+
public AnyM<String> getTrustStoreFile() {
48+
return AnyM.ofNullable(trustStoreFile);
49+
}
50+
public AnyM<String> getTrustStorePass() {
51+
return AnyM.ofNullable(trustStorePass);
52+
}
4753
}

micro-core/src/main/java/com/aol/micro/server/servers/ServerApplication.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import com.aol.micro.server.servers.model.ServerData;
77

88
public interface ServerApplication {
9-
109
void run(CompletableFuture start, JaxRsServletConfigurer jaxRsConfigurer, CompletableFuture end);
11-
ServerData getServerData();
12-
ServerApplication withSSLProperties(SSLProperties sslProperties);
10+
ServerData getServerData();
1311
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package nonautoscan.com.aol.micro.server;
2+
3+
import java.io.IOException;
4+
import java.net.URL;
5+
import java.util.Properties;
6+
7+
import org.springframework.beans.factory.config.PropertiesFactoryBean;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.core.io.Resource;
11+
import org.springframework.core.io.UrlResource;
12+
13+
import com.aol.micro.server.config.SSLProperties;
14+
15+
@Configuration
16+
public class SSLConfig {
17+
18+
private static String keyStoreFile = "keyStoreFile";
19+
private static String keyStorePass = "keyStorePass";
20+
private static String trustStoreFile = "trustStoreFile";
21+
private static String trustStorePass = "trustStorePass";
22+
private static String keyStoreType = "keyStoreType";
23+
private static String keyStoreProvider = "keyStoreProvider";
24+
private static String trustStoreType = "trustStoreType";
25+
private static String trustStoreProvider = "trustStoreProvider";
26+
private static String clientAuth = "clientAuth";
27+
private static String ciphers = "ciphers";
28+
private static String protocol = "protocol";
29+
30+
@Bean
31+
public static SSLProperties sslProperties() throws IOException {
32+
PropertiesFactoryBean factory = new PropertiesFactoryBean();
33+
URL url = SSLConfig.class.getClassLoader().getResource("ssl.properties");
34+
if (url != null) {
35+
Resource reource = new UrlResource(url);
36+
factory.setLocation(reource);
37+
factory.afterPropertiesSet();
38+
Properties properties = factory.getObject();
39+
return SSLProperties.builder()
40+
.keyStoreFile(properties.getProperty(keyStoreFile))
41+
.keyStorePass(properties.getProperty(keyStorePass))
42+
.trustStoreFile(properties.getProperty(trustStoreFile))
43+
.trustStorePass(properties.getProperty(trustStorePass))
44+
.keyStoreType(properties.getProperty(keyStoreType))
45+
.keyStoreProvider(properties.getProperty(keyStoreProvider))
46+
.trustStoreType(properties.getProperty(trustStoreType))
47+
.trustStoreProvider(properties.getProperty(trustStoreProvider))
48+
.clientAuth(properties.getProperty(clientAuth))
49+
.ciphers(properties.getProperty(ciphers))
50+
.protocol(properties.getProperty(protocol)).build();
51+
}
52+
return null;
53+
}
54+
}

micro-grizzly/src/main/java/com/aol/micro/server/servers/grizzly/GrizzlyApplication.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
import javax.servlet.ServletContextListener;
88
import javax.servlet.ServletRequestListener;
99

10-
import lombok.AccessLevel;
11-
import lombok.AllArgsConstructor;
12-
import lombok.Getter;
13-
import lombok.experimental.Wither;
14-
1510
import org.glassfish.grizzly.http.server.HttpServer;
1611
import org.glassfish.grizzly.http.server.NetworkListener;
1712
import org.glassfish.grizzly.http.server.accesslog.AccessLogBuilder;
@@ -35,6 +30,10 @@
3530
import com.aol.micro.server.servers.model.ServerData;
3631
import com.aol.micro.server.servers.model.ServletData;
3732

33+
import lombok.AccessLevel;
34+
import lombok.AllArgsConstructor;
35+
import lombok.Getter;
36+
3837
@AllArgsConstructor(access = AccessLevel.PRIVATE)
3938
public class GrizzlyApplication implements ServerApplication {
4039

@@ -47,16 +46,13 @@ public class GrizzlyApplication implements ServerApplication {
4746
private final PStack<ServletData> servletData;
4847
private final PStack<ServletContextListener> servletContextListenerData;
4948
private final PStack<ServletRequestListener> servletRequestListenerData;
50-
@Wither
51-
private final SSLProperties SSLProperties;
52-
49+
5350
public GrizzlyApplication(AllData serverData) {
5451
this.serverData = serverData.getServerData();
5552
this.filterData = serverData.getFilterDataList();
5653
this.servletData = serverData.getServletDataList();
5754
this.servletContextListenerData = serverData.getServletContextListeners();
58-
this.servletRequestListenerData = serverData.getServletRequestListeners();
59-
this.SSLProperties = null;
55+
this.servletRequestListenerData = serverData.getServletRequestListeners();
6056
}
6157

6258
public void run(CompletableFuture start, JaxRsServletConfigurer jaxRsConfigurer, CompletableFuture end) {
@@ -77,11 +73,17 @@ public void run(CompletableFuture start, JaxRsServletConfigurer jaxRsConfigurer
7773
HttpServer httpServer = HttpServer.createSimpleServer(null, "0.0.0.0", serverData.getPort());
7874
serverData.getModule().getServerConfigManager().accept(new WebServerProvider(httpServer));
7975
addAccessLog(httpServer);
80-
if (SSLProperties != null)
81-
this.createSSLListener(serverData.getPort());
76+
addSSL(httpServer);
8277

8378
startServer(webappContext, httpServer, start, end);
8479
}
80+
81+
private void addSSL(HttpServer httpServer) {
82+
SSLProperties sslProperties = serverData.getRootContext().getBean(SSLProperties.class);
83+
if (sslProperties != null) {
84+
httpServer.addListener(this.createSSLListener(serverData.getPort(), sslProperties));
85+
}
86+
}
8587

8688
private void startServer(WebappContext webappContext, HttpServer httpServer, CompletableFuture start, CompletableFuture end) {
8789
webappContext.deploy(httpServer);
@@ -124,18 +126,17 @@ private void addAccessLog(HttpServer httpServer) {
124126
logger.error("CAUSED BY: " + InternalErrorCode.SERVER_STARTUP_FAILED_TO_CREATE_ACCESS_LOG.toString() + ": " + e.getCause().getMessage());
125127

126128
}
127-
128129
}
129130

130131

131-
private NetworkListener createSSLListener(int port) {
132+
private NetworkListener createSSLListener(int port, SSLProperties sslProperties) {
132133

133134
SSLConfigurationBuilder sslBuilder = new SSLConfigurationBuilder();
134135
NetworkListener listener = new NetworkListener("grizzly", "0.0.0.0", Integer.valueOf(port));
135136
listener.getFileCache().setEnabled(false);
136137

137138
listener.setSecure(true);
138-
listener.setSSLEngineConfig(sslBuilder.build(SSLProperties));
139+
listener.setSSLEngineConfig(sslBuilder.build(sslProperties));
139140

140141
return listener;
141142
}

micro-grizzly/src/main/java/com/aol/micro/server/servers/grizzly/SSLConfigurationBuilder.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@ public SSLEngineConfigurator build(SSLProperties sslProperties) {
1414

1515
sslContext.setKeyStoreFile(sslProperties.getKeyStoreFile()); // contains server keypair
1616
sslContext.setKeyStorePass(sslProperties.getKeyStorePass());
17-
sslContext.setTrustStoreFile(sslProperties.getTrustStoreFile()); // contains client certificate
18-
sslContext.setTrustStorePass(sslProperties.getTrustStorePass());
17+
18+
/**
19+
* trustStore stores public key or certificates from CA (Certificate Authorities)
20+
* which is used to trust remote party or SSL connection. So should be optional
21+
*/
22+
sslProperties.getTrustStoreFile().peek(file->sslContext.setTrustStoreFile(file)); // contains client certificate
23+
sslProperties.getTrustStorePass().peek(pass->sslContext.setTrustStorePass(pass));
1924

2025

2126

0 commit comments

Comments
 (0)