All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.wouterdanes.docker.remoteapi.util.HttpsHelper Maven / Gradle / Ivy

package net.wouterdanes.docker.remoteapi.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.UUID;

import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;

/**
 * Helper methods to parse and load Docker certificate files for encrypted https connection to the docker daemon
 */
public final class HttpsHelper {

    public static final String KEYSTORE_PWD = UUID.randomUUID().toString();

    private HttpsHelper() {}

    public static KeyStore createKeyStore(final String certPath)
            throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, CertificateException,
            KeyStoreException {
        KeyPair keyPair = loadPrivateKey(certPath);
        Certificate privCert = loadCertificate(certPath);

        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(null);

        keyStore.setKeyEntry("docker", keyPair.getPrivate(), KEYSTORE_PWD.toCharArray(), new Certificate[]{privCert});
        return keyStore;
    }

    public static KeyStore createTrustStore(final String certPath)
            throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
        Path caPath = Paths.get(certPath, "ca.pem");
        BufferedReader reader = Files.newBufferedReader(caPath, Charset.defaultCharset());

        PEMParser parser = new PEMParser(reader);
        X509CertificateHolder object = (X509CertificateHolder) parser.readObject();
        Certificate caCert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(object);

        KeyStore trustStore = KeyStore.getInstance("JKS");
        trustStore.load(null);
        trustStore.setCertificateEntry("ca", caCert);
        return trustStore;
    }

    private static Certificate loadCertificate(final String certPath) throws IOException, CertificateException {
        Path cert = Paths.get(certPath, "cert.pem");
        BufferedReader reader = Files.newBufferedReader(cert, Charset.defaultCharset());
        PEMParser parser = new PEMParser(reader);

        X509CertificateHolder object = (X509CertificateHolder) parser.readObject();
        return new JcaX509CertificateConverter().setProvider("BC").getCertificate(object);
    }

    private static KeyPair loadPrivateKey(final String certPath)
            throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {

        Path path = Paths.get(certPath, "key.pem");
        BufferedReader reader = Files.newBufferedReader(path, Charset.defaultCharset());

        PEMParser parser = new PEMParser(reader);
        Object object = parser.readObject();

        PEMKeyPair keyPair = (PEMKeyPair) object;

        byte[] privateEncoded = keyPair.getPrivateKeyInfo().getEncoded();
        byte[] publicEncoded = keyPair.getPublicKeyInfo().getEncoded();

        KeyFactory factory = KeyFactory.getInstance("RSA");

        X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicEncoded);
        PublicKey publicKey = factory.generatePublic(publicKeySpec);

        PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateEncoded);
        PrivateKey privateKey = factory.generatePrivate(privateKeySpec);

        return new KeyPair(publicKey, privateKey);

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy