/*
* Copyright (c) LinkedIn Corporation. All rights reserved. Licensed under the BSD-2 Clause license.
* See LICENSE in the project root for license information.
*/
package com.linkedin.mitm.services;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
/**
* Wrapper class for SSLContext generating code
* @author shfeng
*/
public class SSLContextGenerator {
private static final String SSL_CONTEXT_PROTOCOL = "TLS";
private static final String KEY_MANAGER_TYPE = "SunX509";
private static final String TRUST_MANAGER_TYPE = "SunX509";
/**
* Create client side SSLContext {@link javax.net.ssl.SSLContext}
*
* */
public static SSLContext createClientContext(KeyStore keyStore, char[] passphrase)
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
String keyManAlg = KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyManAlg);
kmf.init(keyStore, passphrase);
KeyManager[] keyManagers = kmf.getKeyManagers();
return create(keyManagers, InsecureTrustManagerFactory.INSTANCE.getTrustManagers(),
RandomNumberGenerator.getInstance().getSecureRandom());
}
/**
* Create default server side SSLContext {@link javax.net.ssl.SSLContext}
*
* */
public static SSLContext createDefaultServerContext()
throws KeyManagementException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyStoreException {
return create(null, null, RandomNumberGenerator.getInstance().getSecureRandom());
}
private static SSLContext create(KeyManager[] keyManagers, TrustManager[] trustManagers, SecureRandom secureRandom)
throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance(SSL_CONTEXT_PROTOCOL);
sslContext.init(keyManagers, trustManagers, secureRandom);
return sslContext;
}
private SSLContextGenerator() {
}
}