【问题标题】:Java - Public Key Infrastructure implementation in communicatorJava - 通信器中的公钥基础设施实现
【发布时间】:2013-11-11 17:04:17
【问题描述】:

我的任务是用 PKI 编写一个通信器。我考虑了 X.509 证书的实现(在 Java 中)——我的意思是 SSL/TLS 允许数据/消息机密性,以及消息完整性的消息身份验证代码。我在一些文献中读到的所有这些都是理论上的。我不确定我的想法是否正确。任何人都可以很好地理解 PKI 的概念,给我任何建议(例如网站,它很好地解释了实现 PKI)吗?

【问题讨论】:

  • 即使是密码学和 IT 安全方面的专家也不一定能正确解决这些问题——我认为期望新人能够开发出安全的应用程序是不合理的。
  • 这不是商业项目,而是学术项目。它不必非常安全。我只想了解如何在 Java 中实现 PKI。
  • 您想在 Java 中创建 PKI(私钥/证书),还是想在 Java 中使用现有的 PKI 进行 SSL 等?
  • 我想使用外部的东西(例如 openSSL)制作证书,而在 Java 中使用 SSL/TLS 进行通信。你有什么适合初学者的好文献或网站吗?

标签: java cryptography pki


【解决方案1】:

正如 ntoskrnl 评论的那样,即使是专家也很难做到完全正确。

以下是 SSL 连接所需的 PKI 的基本概要:

  • CA 根密钥和相应的自签名证书。
  • 由 CA 根密钥签署的中间 CA 密钥和证书(此 是可选的)。
  • 服务器身份密钥和证书由任一签名 中间 CA 或 CA 根。
  • 由服务器信任的某个 CA 签名的客户端身份密钥和证书。为您 学术工作,您可能希望此 CA 与您创建的 CA 相同。仅当您想要使用 2 路(双向)SSL 时才需要客户端身份,服务器对客户端进行身份验证。

在 Tomcat 之类的东西上运行的 Web 服务,可以为 SSL 配置。在服务器端,身份将指向服务器密钥证书。对于 2-way SSL,服务器上还会有一个受信任 CA 证书的列表或密钥库。除非客户端的证书由这些受信任的 CA 之一签名,否则服务器将不允许客户端连接。

在客户端,您还需要受信任 CA 证书的列表或密钥库,并且服务器的证书必须由这些 CA 之一签名。建立 SSL 连接时,Java 将使用客户端 ID 密钥和证书以及信任密钥库。如果您搜索 Stack Overflow,您应该会找到大量 Java SSL 连接示例。

要创建 PKI,OpenSSL 是一个很好的工具。这是一个有用的网站:

https://pki-tutorial.readthedocs.org/en/latest/simple/index.html

对于密钥及其对应的证书,您首先创建一个私钥,然后创建一个证书签名请求 (CSR)。然后 CSR 由 CA 密钥签名,并成为证书。证书包含与用于创建 CSR 的私钥对应的公钥。

对于 MAC,这里有一个 HMAC 的 Java 示例:HMAC-SHA1: How to do it properly in Java?

【讨论】:

  • 但我仍然没有抓住一些东西。首先,就像在“PKI 教程”中一样,我使用 openSSL 来制作 TLS CA,我可以创建客户端和服务器证书,但是我想远程执行客户端证书(在另一台计算机上,用户客户端必须能够制作自己的证书)。现在我可以使用 openSSL 命令在本地完成所有这些事情。让我解释一下我对我的项目的看法:1)服务器与 CA 链接 2)服务器有一个所有用户的数据库 3)服务器有它自己的由 CA 签名的证书 4)用户(客户端)注册到服务器并从中获取它服务器(证书由CA生成)5)用户可以连接ea
  • 客户端将使用 OpenSSL 创建私钥并生成 CSR。客户端将 CSR 发送给 CA。 CA 在验证客户端身份后将创建并签署证书,并将证书发送回客户端。然后,客户端可以使用证书和私钥建立与服务器的 SSL 连接。
  • 好的。我现在明白了——对我自己和你的评论进行一点研究,我想我会实施我的项目。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-07-02
  • 2010-11-01
  • 2015-10-07
  • 1970-01-01
  • 2015-04-06
  • 2016-04-26
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多