我有两个文件(.CRT和.KEY),我希望导入到Java密钥存储到随后的SSLContext用于发送与Apache的HTTP的HTTPClient组成请求客户端证书。 不过,我似乎无法找到一个方法来编程方式做到这一点,大多数其他问题我发现无论是点到外部工具或者是不适合我的情况。
我的证书与典型的编码“BEGIN CERTIFICATE”后跟一个64位编码,并与“BEGIN RSA私钥”,然后又Base64编码字符串的关键。
这是我走到这一步:
private static SSLContext createSSLContext(File certFile, File keyFile) throws IOException {
try {
PEMParser pemParser = new PEMParser(new FileReader(keyFile));
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(new BouncyCastleProvider());
Object object = pemParser.readObject();
KeyPair kp = converter.getKeyPair((PEMKeyPair) object);
PrivateKey privateKey = kp.getPrivate();
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
FileInputStream stream = new FileInputStream(certFile);
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(stream);
KeyStore store = KeyStore.getInstance("JKS");
store.load(null);
store.setCertificateEntry("certificate", cert);
store.setKeyEntry("private-key", privateKey, "changeit".toCharArray(), new Certificate[] { cert });
SSLContext sslContext = SSLContexts.custom()
.loadKeyMaterial(store, "changeit".toCharArray())
.build();
return sslContext;
} catch (IOException | NoSuchAlgorithmException | CertificateException | KeyStoreException | KeyManagementException | UnrecoverableKeyException e) {
throw new IOException(e);
}
}
堆栈跟踪:
产生java.io.IOException:java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:在me.failedshack.ssltest.SSLTest.createSSLContext(SSLTest.java:80)无效的密钥格式在me.failedshack.ssltest.SSLTest.main (SSLTest.java:31)
在java.base / java.security在java.base / sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:216)无效的密钥格式:java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException所致。 KeyFactory.generatePrivate(KeyFactory.java:390)在me.failedshack.ssltest.SSLTest.createSSLContext(SSLTest.java:62)... 1更多
java.security.InvalidKeyException:通过引起无效的密钥格式在java.base / sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:330)在java.base / sun.security.pkcs.PKCS8Key.decode(PKCS8Key。的java:355)在java.base / sun.security.rsa.RSAPrivateCrtKeyImpl(RSAPrivateCrtKeyImpl.java:91)在java.base / sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:75)在java.base / sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:315)在java.base / sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:212)... 3个
可悲的是我一直生成该文件中的私钥时得到一个InvalidKeyException异常。