import java.io.ByteArrayInputStream;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

public class JSSECertPathCheck {

    // CA certificate
    private static final String CA_CERT
            = "-----BEGIN CERTIFICATE-----\n"
            + "MIICWzCCAcQCCQCtPczRiCRiFjANBgkqhkiG9w0BAQUFADByMQswCQYDVQQGEwJV\n"
            + "TjETMBEGA1UECAwKU29tZSBTdGF0ZTEVMBMGA1UEBwwMVW5rbm93biBDaXR5MREw\n"
            + "DwYDVQQKDAhUZXN0IE9yZzESMBAGA1UECwwJVGVzdCBVbml0MRAwDgYDVQQDDAdU\n"
            + "ZXN0IENBMB4XDTE3MDIyODAyNTIwN1oXDTE3MDMzMDAyNTIwN1owcjELMAkGA1UE\n"
            + "BhMCVU4xEzARBgNVBAgMClNvbWUgU3RhdGUxFTATBgNVBAcMDFVua25vd24gQ2l0\n"
            + "eTERMA8GA1UECgwIVGVzdCBPcmcxEjAQBgNVBAsMCVRlc3QgVW5pdDEQMA4GA1UE\n"
            + "AwwHVGVzdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArtAsOS/uNlIP\n"
            + "TGGT3if2yM00BMkjdiMUUpIH4BqzryFz8y5Q4V0x7E5NeLjwMlHcGpvHOyqMadi1\n"
            + "FoWT5nvJzeBvvwQwL4JwN1LLpqZyITmIRh8Ps7mfGbUX87phKig16Qc4o9jlH5y5\n"
            + "+i2lGJWx3ByENo3dFaHcTvXS0vrPZCUCAwEAATANBgkqhkiG9w0BAQUFAAOBgQB3\n"
            + "Ij4727A9yZQKF5S8YRTSiA1+8G7lFm+BQu9uBJw5cm/+TL2UsJPn96Asy8EUfD9k\n"
            + "SI685uGxRg90CAf5DYZ2gZe4LAP79KFmPlJKjbaVl8QuaFUmur9x5cR6aLCRBBLH\n"
            + "5UW4OxLmPBJGk0FwpVf9fXJooh7W4wt4cJW1SlNrZQ==\n"
            + "-----END CERTIFICATE-----";

    // End entity certificate
    private static final String END_CERT
            = "-----BEGIN CERTIFICATE-----\n"
            + "MIICZTCCAc4CCQDdfVwMosaIjTANBgkqhkiG9w0BAQUFADByMQswCQYDVQQGEwJV\n"
            + "TjETMBEGA1UECAwKU29tZSBTdGF0ZTEVMBMGA1UEBwwMVW5rbm93biBDaXR5MREw\n"
            + "DwYDVQQKDAhUZXN0IE9yZzESMBAGA1UECwwJVGVzdCBVbml0MRAwDgYDVQQDDAdU\n"
            + "ZXN0IENBMB4XDTE3MDIyODAyNTIxOFoXDTE3MDMzMDAyNTIxOFowfDELMAkGA1UE\n"
            + "BhMCVU4xEzARBgNVBAgMClNvbWUgU3RhdGUxFTATBgNVBAcMDFVua25vd24gQ2l0\n"
            + "eTERMA8GA1UECgwIVGVzdCBPcmcxEjAQBgNVBAsMCVRlc3QgVW5pdDEaMBgGA1UE\n"
            + "AwwRVGVzdCBJbnRlcm1lZGlhdGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB\n"
            + "ALvfLachRfJc1iXWXZALWELbVi3IBLfEloxmdj1DYY2PJGTe/wj5lhoKi2pLeLAh\n"
            + "GKV2hbjPHdk2mf25Ddd/M8f1T+n0Y4I4+l1n05Q3jdR6Yrz84IUMT9Mav0XCcsNp\n"
            + "CPDD5OSD+VbxpAqWvHb0fwvnWF3qzwtbC7U8kbPDBbU/AgMBAAEwDQYJKoZIhvcN\n"
            + "AQEFBQADgYEAGRrRHNwoSNltt+qiJt/Uphbc8gHjoQPq3gH5dhhj21RE8/u4Z1BR\n"
            + "XwGhYdRyX73cqMkJZGg8jbrDlPbeQsZFmG0YrByFF1nByndm8GN8Rjq2KeuCa/g9\n"
            + "CcIItqGhp7CkVzzce3I45rV5FYYQ+9gVxceivJuDlLkkeQautTQwnr0=\n"
            + "-----END CERTIFICATE-----";

    // End entity private key in PKCS#8 format
    private static final String PRIV_KEY
            = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALvfLachRfJc1iXW\n"
            + "XZALWELbVi3IBLfEloxmdj1DYY2PJGTe/wj5lhoKi2pLeLAhGKV2hbjPHdk2mf25\n"
            + "Ddd/M8f1T+n0Y4I4+l1n05Q3jdR6Yrz84IUMT9Mav0XCcsNpCPDD5OSD+VbxpAqW\n"
            + "vHb0fwvnWF3qzwtbC7U8kbPDBbU/AgMBAAECgYBuelhzXsquMk+wInYUvcciUa9E\n"
            + "7slvc4iAecRwVE5qm1Fwi/33viW5nJfNYyJOmLfQnXkXa5yG3mgB3y+3mNLOcV7K\n"
            + "FyL3Fahzqvu1eC8IE1jW6mTTced/VWpb1FEoI0zn7MIyDJNXypxtYIM3hG9t2W9g\n"
            + "xHDQ7RQYew38QyaWEQJBAPGHPk9rzE/UyT5oOEZo/APlHs0IDF8K635ngTMntTC9\n"
            + "vnQM8r+3+LIYahaWxfT9Mm74ZjjdvXKzLGqaQB9OugkCQQDHIOhzkp10gWQSrd5j\n"
            + "9weYrJfBWpuqUfnP5EH0ZNvupY37d9jMbFSHxp0PYoEgg8fVv6qdhPDYXRFRg9/o\n"
            + "HWcHAkEA69lg4zUkoZ/rk+E5cqf5z+Pgm94MFpMXOqvf4hAYQqxGWhR6xvPjCiYF\n"
            + "EmHQlFba9LnjOAxvfp2v9bkCfI/n4QJAAkXR4V/PBEFlzwDFBQcQwyFVKhPKqwr8\n"
            + "eu70AcIU8IhbMn+PreWeoV4W9NH+/0wBv+LMI7gct5t4UyHaMGAFiQJBAIr5odw0\n"
            + "g9fnqsGColnao/WEh7ShJxGMndwJ5DLv/whg7N9BLWeNaXzGmF31zWwTtXXM/AxO\n"
            + "B2gusoUDBdDCE/o=";

    public static SSLContext createSSLContext() throws Exception {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        KeyStore trustStore = KeyStore.getInstance("JKS");
        trustStore.load(null, null);
        Certificate caCert = cf.generateCertificate(new ByteArrayInputStream(
                CA_CERT.getBytes()));
        trustStore.setCertificateEntry("caCert", caCert);

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
        tmf.init(trustStore);

        PKCS8EncodedKeySpec servPrivKeySpec = new PKCS8EncodedKeySpec(
                Base64.getMimeDecoder().decode(PRIV_KEY));
        KeyFactory rsaKeyFactory = KeyFactory.getInstance("RSA");
        PrivateKey endPrivKey = rsaKeyFactory.generatePrivate(servPrivKeySpec);

        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(null, null);
        Certificate endCert = cf.generateCertificate(new ByteArrayInputStream(
                END_CERT.getBytes()));
        keyStore.setCertificateEntry("endCert", endCert);
        keyStore.setKeyEntry("endCertKey", endPrivKey, "".toCharArray(),
                new Certificate[] { endCert });

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509");
        kmf.init(keyStore, "".toCharArray());

        SSLContext context = SSLContext.getInstance("TLS");
//        context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        context.init(kmf.getKeyManagers(), null, null);
        return context;
    }
}
