在没有BouncyCastle的情况下以编程方式为SSL Client-Auth创建客户端证书的方法?

时间:2013-02-10 00:42:59

标签: java ssl keystore x509 authentication

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

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

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

请提供链接或代码。 Java SSL semms非常复杂,并且文档很糟糕。

1 个答案:

答案 0 :(得分: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,这将简化您需要调整信任管理器以获取自签名证书的方式。 (如果要设计这样的安全方案,您仍需要使用内部映射检查实际公钥。)