package com.zy.integration.iot.util; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openssl.PEMKeyPair; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory; import java.io.BufferedReader; import java.io.FileReader; import java.security.KeyStore; import java.security.PrivateKey; import java.security.SecureRandom; import java.security.Security; import java.security.cert.Certificate; import java.security.cert.X509Certificate; public final class IotMqttSslUtils { private static final String BC_PROVIDER = "BC"; private IotMqttSslUtils() { } public static SSLSocketFactory buildSocketFactory(String caCertPath, String clientCertPath, String privateKeyPath) throws Exception { ensureProvider(); X509Certificate caCertificate = readCertificate(caCertPath); X509Certificate clientCertificate = readCertificate(clientCertPath); PrivateKey privateKey = readPrivateKey(privateKeyPath); KeyStore clientStore = KeyStore.getInstance(KeyStore.getDefaultType()); clientStore.load(null, null); clientStore.setKeyEntry("iot-client-key", privateKey, new char[0], new Certificate[]{clientCertificate}); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManagerFactory.init(clientStore, new char[0]); KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); trustStore.setCertificateEntry("iot-ca", caCertificate); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom()); return sslContext.getSocketFactory(); } private static X509Certificate readCertificate(String path) throws Exception { try (PEMParser parser = new PEMParser(new BufferedReader(new FileReader(path)))) { Object object = parser.readObject(); if (!(object instanceof X509CertificateHolder)) { throw new IllegalArgumentException("invalid certificate file: " + path); } return new JcaX509CertificateConverter() .setProvider(BC_PROVIDER) .getCertificate((X509CertificateHolder) object); } } private static PrivateKey readPrivateKey(String path) throws Exception { try (PEMParser parser = new PEMParser(new BufferedReader(new FileReader(path)))) { Object object = parser.readObject(); JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BC_PROVIDER); if (object instanceof PEMKeyPair) { return converter.getKeyPair((PEMKeyPair) object).getPrivate(); } if (object instanceof PrivateKeyInfo) { return converter.getPrivateKey((PrivateKeyInfo) object); } throw new IllegalArgumentException("invalid private key file: " + path); } } private static void ensureProvider() { if (Security.getProvider(BC_PROVIDER) == null) { Security.addProvider(new BouncyCastleProvider()); } } }