【问题标题】:server-side authentication with ssl: sending certificate file from client使用 ssl 进行服务器端身份验证:从客户端发送证书文件
【发布时间】:2012-03-14 10:48:43
【问题描述】:

我已经使用证书成功设置了 SSL 身份验证:配置了 Apache http-client,配置了服务器(weblogic,CLIENT-CERT login-config,如果重要的话),测试它是否有效。

但是,在客户端代码中,我必须硬编码信任存储的路径(手动初始化 TrustManagerFactory 或通过相应的 JVM 属性)及其密码,我觉得它不正确。此外,证书必须在客户端手动注册keytool,这也不是那么灵活。

那么,有没有办法完全避免这一切?理想情况下,客户端将捆绑有证书文件,并在请求时将其发送到服务器。我试图用谷歌搜索它,但从未找到如何手动流式传输证书文件

更新

按照here 的建议,我尝试将证书文件读入没有密码的新密钥库,并使用此密钥库初始化KeyManagerFactoryTrustManagerFactory

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);

但它没有用。通常的例外“对等体未通过身份验证”。我猜是因为我也需要相应的私钥,但是没有办法得到它......

【问题讨论】:

  • 自己的证书的私钥拿不到?那没有意义。不清楚你在问什么。

标签: java ssl ssl-certificate


【解决方案1】:

如果您想信任一个特定的服务器证书,您可以将 X.509 证书添加到您的类路径并使用 javax.net.ssl.X509TrustManager(从您的 TrustManagerFactory 生成)。那么就不需要密钥库(和密钥工具)了。

【讨论】:

  • 反之亦然:服务器必须检查客户端的证书以确定它是否信任该客户端。
  • 在这种情况下,您需要一个包含客户端密钥和证书的密钥库。您当然可以将它捆绑在 JAR 中并从类路径中加载它(使用 KeyManager 与 TrustManager 相同)但这没有意义,因为这应该是只有客户端知道的秘密。
猜你喜欢
  • 1970-01-01
  • 2014-04-04
  • 2021-02-11
  • 2015-03-14
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多