Skip to content

Commit ce66b28

Browse files
author
Aaron
committed
Add SysCertManager to support self signed certs.
1 parent 63e3a02 commit ce66b28

16 files changed

+1004
-824
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package com.acuity.iot.dsa.dslink.sys.cert;
2+
3+
import java.security.KeyStore;
4+
import java.security.Provider;
5+
import java.security.Security;
6+
import java.security.cert.CertificateException;
7+
import java.security.cert.X509Certificate;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
import javax.net.ssl.*;
11+
12+
/**
13+
* Supports anonymous SSL.
14+
*
15+
* @author Aaron Hansen
16+
*/
17+
public class AnonymousTrustFactory extends TrustManagerFactorySpi {
18+
19+
/////////////////////////////////////////////////////////////////
20+
// Fields
21+
/////////////////////////////////////////////////////////////////
22+
23+
private static X509TrustManager defaultX509Mgr;
24+
private static SysCertManager certManager;
25+
private static TrustManager[] trustManagers;
26+
27+
/////////////////////////////////////////////////////////////////
28+
// Methods - Public and in alphabetical order by method TrustAnon.
29+
/////////////////////////////////////////////////////////////////
30+
31+
@Override
32+
public TrustManager[] engineGetTrustManagers() {
33+
return trustManagers;
34+
}
35+
36+
@Override
37+
public void engineInit(KeyStore ks) {
38+
}
39+
40+
@Override
41+
public void engineInit(ManagerFactoryParameters spec) {
42+
}
43+
44+
/**
45+
* Installs this trust factory.
46+
*/
47+
static void init(SysCertManager mgr) {
48+
certManager = mgr;
49+
try {
50+
TrustManagerFactory fac = TrustManagerFactory.getInstance(
51+
TrustManagerFactory.getDefaultAlgorithm());
52+
fac.init((KeyStore) null);
53+
trustManagers = fac.getTrustManagers();
54+
if (trustManagers == null) {
55+
trustManagers = new TrustManager[] {new MyTrustManager()};
56+
return;
57+
}
58+
TrustManager tm;
59+
for (int i = 0, len = trustManagers.length; i < len; i++) {
60+
tm = trustManagers[i];
61+
if (tm instanceof X509TrustManager) {
62+
defaultX509Mgr = (X509TrustManager) tm;
63+
trustManagers[i] = new MyTrustManager();
64+
break;
65+
}
66+
}
67+
if (defaultX509Mgr == null) {
68+
List<TrustManager> list = Arrays.asList(trustManagers);
69+
list.add(new MyTrustManager());
70+
trustManagers = list.toArray(new TrustManager[list.size()]);
71+
}
72+
} catch (Exception x) {
73+
certManager.error(certManager.getPath(), x);
74+
}
75+
Thread.currentThread().setContextClassLoader(
76+
AnonymousTrustFactory.class.getClassLoader());
77+
System.setProperty("jsse.enableSNIExtension", "false");
78+
Security.setProperty("ssl.TrustManagerFactory.algorithm", "DSA_X509");
79+
Security.addProvider(new MyProvider());
80+
}
81+
82+
83+
/////////////////////////////////////////////////////////////////
84+
// Inner Classes - in alphabetical order by class TrustAnon.
85+
/////////////////////////////////////////////////////////////////
86+
87+
/**
88+
* The hook that provides the anonymous trust factory.
89+
*/
90+
private static class MyProvider extends Provider {
91+
92+
public MyProvider() {
93+
super("DSAP", 1.0d, "DSA Provider");
94+
put("TrustManagerFactory.DSA_X509",
95+
"com.acuity.iot.dsa.dslink.sys.cert.AnonymousTrustFactory");
96+
}
97+
98+
}
99+
100+
/**
101+
* Checks with the SysCertService to see if self signed certificates are allowed.
102+
*/
103+
private static class MyTrustManager implements X509TrustManager {
104+
105+
@Override
106+
public void checkClientTrusted(X509Certificate[] chain, String authType)
107+
throws CertificateException {
108+
if (certManager.allowAnonymousClients()) {
109+
return;
110+
}
111+
if (defaultX509Mgr != null) {
112+
defaultX509Mgr.checkClientTrusted(chain, authType);
113+
}
114+
}
115+
116+
@Override
117+
public void checkServerTrusted(X509Certificate[] chain, String authType)
118+
throws CertificateException {
119+
if (certManager.allowAnonymousServers()) {
120+
return;
121+
}
122+
if (defaultX509Mgr != null) {
123+
defaultX509Mgr.checkServerTrusted(chain, authType);
124+
}
125+
}
126+
127+
@Override
128+
public X509Certificate[] getAcceptedIssuers() {
129+
if (defaultX509Mgr != null) {
130+
return defaultX509Mgr.getAcceptedIssuers();
131+
}
132+
return new X509Certificate[0];
133+
}
134+
135+
}
136+
137+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.acuity.iot.dsa.dslink.sys.cert;
2+
3+
import org.iot.dsa.node.DSBool;
4+
import org.iot.dsa.node.DSInfo;
5+
import org.iot.dsa.node.DSNode;
6+
7+
/**
8+
* Allows certification management.
9+
*
10+
* @author Aaron Hansen
11+
*/
12+
public class SysCertManager extends DSNode {
13+
14+
// Constants
15+
// ---------
16+
17+
private static final String ALLOW_CLIENTS = "Allow_Anonymous_Clients";
18+
private static final String ALLOW_SERVERS = "Allow_Anonymous_Servers";
19+
20+
// Fields
21+
// ------
22+
23+
private DSInfo allowClients = getInfo(ALLOW_CLIENTS);
24+
private DSInfo allowServers = getInfo(ALLOW_SERVERS);
25+
private AnonymousTrustFactory myTrustFactory;
26+
27+
// Methods
28+
// -------
29+
30+
/**
31+
* True if self signed anonymous client certs are allowed.
32+
*/
33+
public boolean allowAnonymousClients() {
34+
return allowClients.getElement().toBoolean();
35+
}
36+
37+
/**
38+
* True if self signed anonymous server certs are allowed.
39+
*/
40+
public boolean allowAnonymousServers() {
41+
return allowServers.getElement().toBoolean();
42+
}
43+
44+
@Override
45+
public void declareDefaults() {
46+
declareDefault(ALLOW_CLIENTS, DSBool.FALSE);
47+
declareDefault(ALLOW_SERVERS, DSBool.FALSE);
48+
}
49+
50+
@Override
51+
public void onStarted() {
52+
AnonymousTrustFactory.init(this);
53+
}
54+
55+
}
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,39 @@
1-
package com.acuity.iot.dsa.dslink.profiler;
2-
3-
import java.lang.management.ClassLoadingMXBean;
4-
import java.lang.management.ManagementFactory;
5-
import java.lang.management.PlatformManagedObject;
6-
import java.util.ArrayList;
7-
import java.util.List;
8-
9-
public class ClassLoadingNode extends MXBeanNode {
10-
11-
private ClassLoadingMXBean mxbean;
12-
13-
@Override
14-
public void setupMXBean() {
15-
mxbean = ManagementFactory.getClassLoadingMXBean();
16-
}
17-
18-
@Override
19-
public void refreshImpl() {}
20-
21-
@Override
22-
public PlatformManagedObject getMXBean() {
23-
return mxbean;
24-
}
25-
26-
@Override
27-
public Class<? extends PlatformManagedObject> getMXInterface() {
28-
return ClassLoadingMXBean.class;
29-
}
30-
31-
private static List<String> overriden = new ArrayList<String>();
32-
33-
@Override
34-
public List<String> getOverriden() {
35-
return overriden;
36-
}
37-
38-
}
1+
package com.acuity.iot.dsa.dslink.sys.profiler;
2+
3+
import java.lang.management.ClassLoadingMXBean;
4+
import java.lang.management.ManagementFactory;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class ClassLoadingNode extends MXBeanNode {
10+
11+
private ClassLoadingMXBean mxbean;
12+
13+
@Override
14+
public void setupMXBean() {
15+
mxbean = ManagementFactory.getClassLoadingMXBean();
16+
}
17+
18+
@Override
19+
public void refreshImpl() {
20+
}
21+
22+
@Override
23+
public PlatformManagedObject getMXBean() {
24+
return mxbean;
25+
}
26+
27+
@Override
28+
public Class<? extends PlatformManagedObject> getMXInterface() {
29+
return ClassLoadingMXBean.class;
30+
}
31+
32+
private static List<String> overriden = new ArrayList<String>();
33+
34+
@Override
35+
public List<String> getOverriden() {
36+
return overriden;
37+
}
38+
39+
}
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,46 @@
1-
package com.acuity.iot.dsa.dslink.profiler;
2-
3-
import java.lang.management.CompilationMXBean;
4-
import java.lang.management.ManagementFactory;
5-
import java.lang.management.PlatformManagedObject;
6-
import java.util.ArrayList;
7-
import java.util.List;
8-
import org.iot.dsa.node.DSString;
9-
10-
public class CompilationNode extends MXBeanNode {
11-
12-
private CompilationMXBean mxbean;
13-
14-
@Override
15-
public void setupMXBean() {
16-
mxbean = ManagementFactory.getCompilationMXBean();
17-
}
18-
19-
@Override
20-
public void refreshImpl() {
21-
putProp("TotalCompilationTime",
22-
DSString.valueOf(ProfilerUtils.millisToString(mxbean.getTotalCompilationTime())));
23-
}
24-
25-
@Override
26-
public PlatformManagedObject getMXBean() {
27-
return mxbean;
28-
}
29-
30-
@Override
31-
public Class<? extends PlatformManagedObject> getMXInterface() {
32-
return CompilationMXBean.class;
33-
}
34-
35-
private static List<String> overriden = new ArrayList<String>();
36-
static {
37-
overriden.add("TotalCompilationTime");
38-
}
39-
40-
@Override
41-
public List<String> getOverriden() {
42-
return overriden;
43-
}
44-
45-
}
1+
package com.acuity.iot.dsa.dslink.sys.profiler;
2+
3+
import java.lang.management.CompilationMXBean;
4+
import java.lang.management.ManagementFactory;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import org.iot.dsa.node.DSString;
9+
10+
public class CompilationNode extends MXBeanNode {
11+
12+
private CompilationMXBean mxbean;
13+
14+
@Override
15+
public void setupMXBean() {
16+
mxbean = ManagementFactory.getCompilationMXBean();
17+
}
18+
19+
@Override
20+
public void refreshImpl() {
21+
putProp("TotalCompilationTime",
22+
DSString.valueOf(ProfilerUtils.millisToString(mxbean.getTotalCompilationTime())));
23+
}
24+
25+
@Override
26+
public PlatformManagedObject getMXBean() {
27+
return mxbean;
28+
}
29+
30+
@Override
31+
public Class<? extends PlatformManagedObject> getMXInterface() {
32+
return CompilationMXBean.class;
33+
}
34+
35+
private static List<String> overriden = new ArrayList<String>();
36+
37+
static {
38+
overriden.add("TotalCompilationTime");
39+
}
40+
41+
@Override
42+
public List<String> getOverriden() {
43+
return overriden;
44+
}
45+
46+
}

0 commit comments

Comments
 (0)