【问题标题】:Any way of creating an Client Certificate programmatically for SSL Client-Auth without BouncyCastle?在没有 BouncyCastle 的情况下以编程方式为 SSL Client-Auth 创建客户端证书的任何方式?
【发布时间】:2013-02-10 00:42:59
【问题描述】:

我正在编写一个服务器应用程序,它通过 SSL-Client-Auth 识别它的客户端。每个客户端都应该创建自己的密钥对和证书以连接到该服务器。任何未知的客户端(由新的公钥标识)都将作为新客户端线程并使用此公钥进行注册。我不想在服务器端签署客户端证书(因为这不会增加安全性)。

但似乎(在研究了数百页之后)我无法在纯 Java 中以编程方式创建必要的文件(或对象),因为 KeyStore 至少需要自签名的客户端证书(我不能在没有 BouncyCastle 库的情况下创建)。

我错了还是真的没有办法做到这一点?

请给我一个链接或代码。 Java SSL 看起来非常复杂并且文档很糟糕。

【问题讨论】:

  • 如果你想以一种不常用的方式使用 JSSE API,你最终会陷入 API 及其文档的晦涩角落。

标签: java ssl keystore x509 authentication


【解决方案1】:

据我所知,JSSE API(包括 JSSE 和 JCE)中确实没有任何东西可以颁发 X.509 证书。手动处理 X.509 结构实际上非常复杂,如果您想复制 BouncyCastle 所做的工作,而不使用 BouncyCastle,您肯定需要阅读更多内容。

BouncyCastle 是迄今为止实现您想要的最便捷的方式。您也可以使用sun.* 包(因为keytool 使用它们来生成自签名证书),但是使用这些包通常是不好的做法,因为它们不是公共JSSE API 的一部分。它们没有文档化,依赖于 JSSE 的特定实现,并且可能会发生变化。相比之下,BouncyCastle 旨在用作图书馆。

我不想在服务器端签署客户端证书(因为这不会 提高安全性)。

由于您的服务器将仅使用公钥(而不是证书)来执行身份验证(基于您选择实现的公钥和用户之间的任何映射),因此在服务器端或客户端颁发证书不会在安全方面无关紧要。客户端可以自签名任何它想要的东西,服务器只能依赖公钥,而不是证书的其余部分。您需要将公钥“捆绑”到 X.509 证书中的原因是它是唯一受支持的客户端证书(例如,JSSE 不支持 OpenPGP 证书)。

在您的服务器上安装一个接收公钥并发送 X.509 证书(具有任何虚拟属性,由任何私钥签名)的服务可能是最简单的选择。此外,如果您使用该服务器内部的迷你 CA,这将简化您需要调整信任管理器以通过自签名证书的方式。 (如果您想设计这样的安全方案,您仍然需要使用内部映射检查实际的公钥。)

【讨论】:

  • 感谢您的回答。由于我在 Android 上运行此代码,因此我什至没有 sun.* 类。但是在服务器上创建客户端证书是个好主意。我会试试这个。谢谢。
  • 啊,我明白了,Android 上的 BouncyCastle 似乎还是有问题的。你也可以试试SpongyCastle
猜你喜欢
  • 2014-12-16
  • 2012-09-02
  • 2014-09-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
相关资源
最近更新 更多