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

标签 java ssl keystore x509 authentication

我正在编写一个服务器应用程序,它通过 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/

相关文章:

java - 插入数据库后,第一次没有读取该值

Ruby:使用存储在 TPM 中的 key

java - KeyStore 加载导致 Android 上出现 EOFException 错误

java - Intellij IDEA。隐藏 .iml 文件

java - 这是接受自签名证书的有效方法吗?

php - ftp_ssl_connect 与隐式 ftp over tls

visual-studio - TF400324 : Team Foundation services are not available. 无法创建 SSL/TLS 安全通道

java - 使用Xero的Java SDK支持多个私有(private)应用程序的身份验证?

java - 在 Java Keystore 中导入 pkcs12 (.p12) 客户端证书文件时,CertificateChain 为空

java - android studio mergedebugresources java.lang.ArrayIndexOutOfBoundsException(无错误信息)