0

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

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

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

请给我一个链接或代码。Java SSL semms 非常复杂并且文档很差。

4

1 回答 1

2

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

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

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

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

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

于 2013-02-10T15:37:53.260 回答