据我所知,JSSE API(包括 JSSE 和 JCE)中确实没有任何东西可以颁发 X.509 证书。手动处理 X.509 结构实际上是相当复杂的,如果你想复制 BouncyCastle 所做的事情,而不使用 BouncyCastle,你肯定需要阅读更多内容。
BouncyCastle 是迄今为止实现您想要的最便捷的方式。您也可以使用这些sun.*
包(因为keytool
使用它们来生成自签名证书),但是使用这些包通常是不好的做法,因为它们不是公共 JSSE API 的一部分。它们没有文档化,依赖于 JSSE 的特定实现,并且可能会发生变化。相比之下,BouncyCastle 旨在用作图书馆。
我不想在服务器端签署客户端证书(因为这不会增加安全性)。
由于您的服务器将仅使用公钥(而不是证书)来执行身份验证(基于您选择实现的公钥和用户之间的任何映射),因此在服务器端或客户端颁发证书并不重要在安全方面。客户端可以自签名任何它想要的东西,服务器只能依赖公钥,而不是证书的其余部分。您需要将公钥“捆绑”到 X.509 证书中的原因是因为它是唯一受支持的客户端证书(例如,JSSE 不支持 OpenPGP 证书)。
在您的服务器上拥有一个接收公钥并发送 X.509 证书(具有任何虚拟属性,由任何私钥签名)的服务可能是最简单的选择。此外,如果您使用该服务器内部的迷你 CA,这将简化您需要调整信任管理器以通过自签名证书的方式。(如果您想设计这样的安全方案,您仍然需要使用内部映射检查实际的公钥。)