package org.zpcat.test.certs; import android.util.Base64; import android.util.Log; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.Principal; import java.security.PrivateKey; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.interfaces.RSAPrivateKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.X509KeyManager; /** * Created by moses on 7/14/15. */ public class PEMKeyManager implements X509KeyManager { private X509Certificate mCert; private PrivateKey mKey; public PEMKeyManager(String pem, String privKey) { CertificateFactory cf = null; InputStream input = new ByteArrayInputStream(pem.getBytes(StandardCharsets.UTF_8)); try { cf = CertificateFactory.getInstance("X509"); mCert = (X509Certificate) cf.generateCertificate(input); // Log.e(TAG, mCert.toString()); } catch (CertificateException e) { e.printStackTrace(); } KeyFactory kf = null; InputStream keyInput = new ByteArrayInputStream( privKey.getBytes(StandardCharsets.UTF_8)); try { kf = KeyFactory.getInstance("RSA"); String privateKeyPem = privKey.replace("-----BEGIN PRIVATE KEY-----\n", ""); privateKeyPem = privateKeyPem.replace("-----END PRIVATE KEY-----", ""); System.out.println(privateKeyPem); byte[] encoded = Base64.decode(privateKeyPem, Base64.DEFAULT); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); mKey = kf.generatePrivate(keySpec); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeySpecException e) { e.printStackTrace(); } } @Override public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { Log.e("chooseClientAlias", keyType.toString()); for (String key : keyType) { Log.e("---", key); } return "abd"; } @Override public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) { Log.e("chooseServerAlias", keyType); return null; } @Override public X509Certificate[] getCertificateChain(String alias) { return new X509Certificate[]{mCert}; } @Override public String[] getClientAliases(String keyType, Principal[] issuers) { Log.e("getClientAliaes", keyType); return new String[0]; } @Override public String[] getServerAliases(String keyType, Principal[] issuers) { Log.e("getServerAliases", keyType); return new String[0]; } @Override public PrivateKey getPrivateKey(String alias) { return mKey; } }