Skip to content

Commit c487d8f

Browse files
committed
fix: added CompositeX509ExtendedTrustManager, removed ext one (#212)
Signed-off-by: Andre Dietisheim <[email protected]>
1 parent c9630d8 commit c487d8f

File tree

4 files changed

+114
-7
lines changed

4 files changed

+114
-7
lines changed

build.gradle

+1-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ dependencies {
5656
'io.fabric8:kubernetes-httpclient-okhttp:6.4.1',
5757
'org.apache.commons:commons-exec:1.3',
5858
'org.apache.commons:commons-lang3:3.12.0',
59-
'com.twelvemonkeys.common:common-lang:3.9.4',
60-
'io.github.hakky54:sslcontext-kickstart:8.3.2'
59+
'com.twelvemonkeys.common:common-lang:3.9.4'
6160
)
6261
testImplementation(
6362
'org.assertj:assertj-core:3.17.1',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2024 Red Hat, Inc.
3+
* Distributed under license by Red Hat, Inc. All rights reserved.
4+
* This program is made available under the terms of the
5+
* Eclipse Public License v2.0 which accompanies this distribution,
6+
* and is available at http://www.eclipse.org/legal/epl-v20.html
7+
*
8+
* Contributors:
9+
* Based on nl.altindag.ssl.trustmanager.CompositeX509ExtendedTrustManager at https://github.com/Hakky54/sslcontext-kickstart
10+
* Red Hat, Inc. - initial API and implementation
11+
******************************************************************************/
12+
package com.redhat.devtools.intellij.common.ssl;
13+
14+
import javax.net.ssl.SSLEngine;
15+
import javax.net.ssl.X509ExtendedTrustManager;
16+
import javax.net.ssl.X509TrustManager;
17+
import java.net.Socket;
18+
import java.security.InvalidAlgorithmParameterException;
19+
import java.security.cert.CertificateException;
20+
import java.security.cert.X509Certificate;
21+
import java.util.ArrayList;
22+
import java.util.Arrays;
23+
import java.util.Collections;
24+
import java.util.List;
25+
import java.util.Objects;
26+
27+
public class CompositeX509ExtendedTrustManager extends X509ExtendedTrustManager {
28+
29+
private static final String CERTIFICATE_EXCEPTION_MESSAGE = "None of the TrustManagers trust this certificate chain";
30+
31+
private final List<X509ExtendedTrustManager> innerTrustManagers;
32+
private final X509Certificate[] acceptedIssuers;
33+
34+
public CompositeX509ExtendedTrustManager(List<X509ExtendedTrustManager> trustManagers) {
35+
this.innerTrustManagers = Collections.unmodifiableList(trustManagers);
36+
this.acceptedIssuers = trustManagers.stream()
37+
.map((manager) ->
38+
Objects.requireNonNullElseGet(manager.getAcceptedIssuers(), () -> new X509Certificate[]{})
39+
)
40+
.flatMap(Arrays::stream)
41+
.toArray(X509Certificate[]::new);
42+
}
43+
44+
@Override
45+
public X509Certificate[] getAcceptedIssuers() {
46+
return Arrays.copyOf(acceptedIssuers, acceptedIssuers.length);
47+
}
48+
49+
@Override
50+
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
51+
checkTrusted((trustManager) -> trustManager.checkClientTrusted(chain, authType));
52+
}
53+
54+
@Override
55+
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
56+
checkTrusted((trustManager) -> trustManager.checkServerTrusted(chain, authType));
57+
}
58+
59+
@Override
60+
public void checkClientTrusted(X509Certificate[] chain, String authType, Socket socket) throws CertificateException {
61+
checkTrusted((trustManager) -> trustManager.checkClientTrusted(chain, authType, socket));
62+
}
63+
64+
@Override
65+
public void checkServerTrusted(X509Certificate[] chain, String authType, Socket socket) throws CertificateException {
66+
checkTrusted((trustManager) -> trustManager.checkServerTrusted(chain, authType, socket));
67+
}
68+
69+
@Override
70+
public void checkClientTrusted(X509Certificate[] chain, String authType, SSLEngine engine) throws CertificateException {
71+
checkTrusted((trustManager) -> trustManager.checkClientTrusted(chain, authType, engine));
72+
}
73+
74+
@Override
75+
public void checkServerTrusted(X509Certificate[] chain, String authType, SSLEngine engine) throws CertificateException {
76+
checkTrusted((trustManager) -> trustManager.checkServerTrusted(chain, authType, engine));
77+
}
78+
79+
public List<X509ExtendedTrustManager> getInnerTrustManagers() {
80+
return innerTrustManagers;
81+
}
82+
83+
private void checkTrusted(TrustManagerConsumer consumer) throws CertificateException {
84+
List<CertificateException> certificateExceptions = new ArrayList<>();
85+
for (X509ExtendedTrustManager trustManager : innerTrustManagers) {
86+
try {
87+
consumer.checkTrusted(trustManager);
88+
return;
89+
} catch (CertificateException e) {
90+
certificateExceptions.add(e);
91+
} catch (RuntimeException e) {
92+
Throwable cause = e.getCause();
93+
if (!(cause instanceof InvalidAlgorithmParameterException)) {
94+
throw e;
95+
}
96+
97+
certificateExceptions.add(new CertificateException(cause));
98+
}
99+
}
100+
CertificateException certificateException = new CertificateException(CERTIFICATE_EXCEPTION_MESSAGE);
101+
certificateExceptions.forEach(certificateException::addSuppressed);
102+
throw certificateException;
103+
}
104+
105+
interface TrustManagerConsumer {
106+
void checkTrusted(X509ExtendedTrustManager var1) throws CertificateException;
107+
}
108+
}

src/main/java/com/redhat/devtools/intellij/common/ssl/IDEATrustManager.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
import com.intellij.openapi.diagnostic.Logger;
1414
import com.intellij.util.net.ssl.CertificateManager;
15-
import nl.altindag.ssl.trustmanager.CompositeX509ExtendedTrustManager;
1615
import org.apache.commons.lang3.reflect.FieldUtils;
1716

1817
import javax.net.ssl.X509ExtendedTrustManager;
@@ -134,10 +133,12 @@ private void addCompositeManager(
134133
if (!(object instanceof List))
135134
return;
136135
List<X509TrustManager> managers = (List<X509TrustManager>) object;
137-
List<X509TrustManager> nonCompositeManagers = managers.stream().filter(x509TrustManager -> !(x509TrustManager instanceof CompositeX509ExtendedTrustManager)).collect(Collectors.toList());
136+
List<X509TrustManager> nonCompositeManagers = managers.stream()
137+
.filter(x509TrustManager -> !(x509TrustManager instanceof CompositeX509ExtendedTrustManager))
138+
.collect(Collectors.toList());
138139
CompositeX509ExtendedTrustManager clientTrustManager = new CompositeX509ExtendedTrustManager(new ArrayList<>(trustManagers));
139140
managers.clear();
140141
managers.addAll(nonCompositeManagers);
141142
managers.add(clientTrustManager);
142143
}
143-
}
144+
}

src/test/java/com/redhat/devtools/intellij/common/ssl/IDEATrustManagerTest.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import javax.net.ssl.X509ExtendedTrustManager;
2020
import javax.net.ssl.X509TrustManager;
2121

22-
import nl.altindag.ssl.trustmanager.CompositeX509ExtendedTrustManager;
2322
import org.junit.Test;
2423

2524
import static junit.framework.TestCase.assertTrue;
@@ -207,4 +206,4 @@ public X509Certificate[] getAcceptedIssuers() {
207206
return new X509Certificate[0];
208207
}
209208
}
210-
}
209+
}

0 commit comments

Comments
 (0)