我已成功使用证书设置SSL身份验证:已配置Apache http-client,配置服务器(weblogic,CLIENT-CERT login-config,如果这很重要),测试它是否有效。
但是,在客户端代码中,我必须将路径硬编码到信任存储(手动初始化TrustManagerFactory
或通过各自的JVM属性)及其密码,我觉得它不对。此外,证书必须在客户端使用keytool
手动注册,这也不是那么灵活。
那么,有没有办法完全避免这一切?理想情况下,客户端将具有与其捆绑的证书文件,并在请求时将其发送到服务器。我试图谷歌它,但从未找到如何手动流式传输证书文件。
更新
根据建议here,我尝试将证书文件读入没有密码的新密钥库,并使用此密钥库初始化KeyManagerFactory
和TrustManagerFactory
:
CertificateFactory cf = CertificateFactory.getInstance("X509");
Certificate cer = cf.generateCertificate(new FileInputStream("myFile.cer"));
KeyStore defaultKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
defaultKeyStore.load(null, "".toCharArray());
defaultKeyStore.setCertificateEntry("alias", cer);
trustManagerFactory.init(defaultKeyStore);
keyManagerFactory.init(defaultKeyStore, "".toCharArray());
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
但它不起作用。通常的例外“peer not authenticated”。我想这是因为我也需要相应的私钥,但是没有办法得到它......
答案 0 :(得分:1)
如果您想信任一个特定的服务器证书,可以将X.509证书添加到类路径并使用javax.net.ssl.X509TrustManager(从您的TrustManagerFactory生成)。那么就不需要密钥库(和keytool)。