Skip to content

Commit ea969ef

Browse files
committed
Move extraction of X509ExtendedTrustManager to utils.
1 parent 5285353 commit ea969ef

File tree

2 files changed

+35
-22
lines changed

2 files changed

+35
-22
lines changed

netty/src/main/java/io/grpc/netty/ProtocolNegotiators.java

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static com.google.common.base.Preconditions.checkNotNull;
2020
import static com.google.common.base.Preconditions.checkState;
21+
import static io.grpc.util.CertificateUtils.getX509ExtendedTrustManager;
2122

2223
import com.google.common.annotations.VisibleForTesting;
2324
import com.google.common.base.Preconditions;
@@ -271,28 +272,6 @@ public static FromServerCredentialsResult from(ServerCredentials creds) {
271272
}
272273
}
273274

274-
private static Optional<TrustManager> getX509ExtendedTrustManager(InputStream rootCerts)
275-
throws GeneralSecurityException {
276-
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
277-
try {
278-
ks.load(null, null);
279-
} catch (IOException ex) {
280-
// Shouldn't really happen, as we're not loading any data.
281-
throw new GeneralSecurityException(ex);
282-
}
283-
X509Certificate[] certs = CertificateUtils.getX509Certificates(rootCerts);
284-
for (X509Certificate cert : certs) {
285-
X500Principal principal = cert.getSubjectX500Principal();
286-
ks.setCertificateEntry(principal.getName("RFC2253"), cert);
287-
}
288-
289-
TrustManagerFactory trustManagerFactory =
290-
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
291-
trustManagerFactory.init(ks);
292-
return Arrays.stream(trustManagerFactory.getTrustManagers())
293-
.filter(trustManager -> trustManager instanceof X509ExtendedTrustManager).findFirst();
294-
}
295-
296275
public static final class FromChannelCredentialsResult {
297276
public final ProtocolNegotiator.ClientFactory negotiator;
298277
public final CallCredentials callCredentials;

util/src/main/java/io/grpc/util/CertificateUtils.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import java.io.InputStream;
2424
import java.io.InputStreamReader;
2525
import java.io.UnsupportedEncodingException;
26+
import java.security.GeneralSecurityException;
2627
import java.security.KeyFactory;
28+
import java.security.KeyStore;
2729
import java.security.NoSuchAlgorithmException;
2830
import java.security.PrivateKey;
2931
import java.security.cert.Certificate;
@@ -32,7 +34,13 @@
3234
import java.security.cert.X509Certificate;
3335
import java.security.spec.InvalidKeySpecException;
3436
import java.security.spec.PKCS8EncodedKeySpec;
37+
import java.util.Arrays;
3538
import java.util.Collection;
39+
import java.util.Optional;
40+
import javax.net.ssl.TrustManager;
41+
import javax.net.ssl.TrustManagerFactory;
42+
import javax.net.ssl.X509ExtendedTrustManager;
43+
import javax.security.auth.x500.X500Principal;
3644

3745
/**
3846
* Contains certificate/key PEM file utility method(s).
@@ -91,5 +99,31 @@ public static PrivateKey getPrivateKey(InputStream inputStream)
9199
}
92100
}
93101
}
102+
103+
/**
104+
* Creates a X509ExtendedTrustManager using the provided CA certs if applicable for the
105+
* certificate type.
106+
*/
107+
public static Optional<TrustManager> getX509ExtendedTrustManager(InputStream rootCerts)
108+
throws GeneralSecurityException {
109+
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
110+
try {
111+
ks.load(null, null);
112+
} catch (IOException ex) {
113+
// Shouldn't really happen, as we're not loading any data.
114+
throw new GeneralSecurityException(ex);
115+
}
116+
X509Certificate[] certs = CertificateUtils.getX509Certificates(rootCerts);
117+
for (X509Certificate cert : certs) {
118+
X500Principal principal = cert.getSubjectX500Principal();
119+
ks.setCertificateEntry(principal.getName("RFC2253"), cert);
120+
}
121+
122+
TrustManagerFactory trustManagerFactory =
123+
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
124+
trustManagerFactory.init(ks);
125+
return Arrays.stream(trustManagerFactory.getTrustManagers())
126+
.filter(trustManager -> trustManager instanceof X509ExtendedTrustManager).findFirst();
127+
}
94128
}
95129

0 commit comments

Comments
 (0)