我正在编写一个服务器应用程序,它通过 SSL-Client-Auth 识别它的客户端。每个客户端都应该创建自己的 key 对和证书以连接到该服务器。任何未知客户端(由新公钥标识)都将作为新客户端线程并使用此公钥注册。我不想在服务器端签署客户端证书(因为这不会提高安全性)。
但似乎(在研究了数百页之后)我无法在纯 Java 中以编程方式创建必要的文件(或对象),因为 KeyStore 至少需要自签名的客户端证书(我不能在没有 BouncyCaSTLe 库的情况下创建)。
我错了还是真的没有办法做到这一点?
请提供链接或代码给我。 Java SSL semms 非常复杂并且文档不好。
最佳答案
据我所知,在 JSSE API(包括 JSSE 和 JCE)中确实没有颁发 X.509 证书的内容。手动处理 X.509 结构实际上非常复杂,如果您想在不使用 BouncyCaSTLe 的情况下复制 BouncyCaSTLe 的功能,您肯定需要阅读更多内容。
BouncyCaSTLe 是迄今为止实现您想要的目标的最便捷方式。您也可以使用 sun.*
包(因为 keytool
使用它们来生成自签名证书),但使用这些包通常是不好的做法,因为它们不是公共(public) JSSE API 的一部分。它们没有记录,依赖于 JSSE 的特定实现,并且可能会发生变化。相比之下,BouncyCaSTLe 旨在用作图书馆。
I don't want to sign client certs serverside (since this is would not increase security).
由于您的服务器将仅使用公钥(而不是证书)来执行身份验证(基于您选择实现的公钥和用户之间的任何映射),因此在服务器端或客户端颁发证书不会在安全方面很重要。客户端可以自签名任何它想要的东西,服务器只能依赖公钥,而不是证书的其余部分。您需要将公钥“捆绑”到 X.509 证书中的原因是因为它是唯一受支持的客户端证书(例如,JSSE 不支持 OpenPGP 证书)。
在您的服务器上拥有一个接收公钥并发送 X.509 证书(具有任何虚拟属性,由任何私钥签名)的服务可能是最简单的选择。此外,如果您使用该服务器内部的微型 CA,这将简化您需要调整信任管理器以获取自签名证书的方式。 (如果你想设计这样的安全方案,你仍然需要用你的内部映射检查实际的公钥。)
关于java - 在没有 BouncyCaSTLe 的情况下以编程方式为 SSL Client-Auth 创建客户端证书的任何方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14793363/