jsse使用远程的证书池_使用JSSE进行安全的套接字通信

关于本教程

本教程是关于什么的/span>

本教程说明了JDK 1.4中包含的Java安全套接字扩展(JSSE)软件包的用法。 使用JSSE的复杂性不在于通信本身,而在于配置。 在运行客户端/服务器软件之前,必须创建加密算法所需的密钥,并且这些密钥必须由软件正确加载后才能创建安全套接字。

本教程提供了食谱样式的说明,用于在客户端/服务器应用程序环境中创建和安装JSSE加密密钥。 完成本教程后,您将知道如何轻松地将任何现有的客户端/服务器应用程序转换为使用加密,以及如何从头开始创建安全的应用程序。

先决条件

要遵循本教程中的讨论,您需要了解有关Java语言的一些知识,首先要了解客户机/服务器环境中Java编程的基础知识(即,使用类,对象,线程等)。 因为流和套接字通信是我们讨论的核心,所以您需要知道如何使用流和套接字。 特别是,您应该知道什么是流及其用途。 您应该知道如何创建一个和一个 ,如何从每个获取流,以及如何使用这些流进行通信。 您还应该知道如何使用JDK或IDE创建和编译.java文件。

可以从参考资料主题中访问的两个developerWorks教程“ Java套接字101”和“ Java I / O简介”都提供了有用的背景信息。

您无需了解有关加密技术的任何知识即可完成本教程。 尽管对加密的全面概述超出了此处讨论的范围,但是会为您提供在应用程序中创建安全的客户端/服务器连接所需的信息。

安装要求

要运行本教程中的示例,您需要以下工具和组件:

  • Sun Microsystems的JDK 1.4
  • 开发环境-IDE或合适的命令外壳
  • 您可以在其上运行Internet服务器的计算机

请参阅相关主题下载JDK 1.4和本教程所必需的完成完整的源文件。

Java密码体系结构

总览

在过去的几年中,Java平台的安全性和加密功能得到了极大的发展。 JDK 1.4(又名Merlin)发行版现在捆绑了许多与安全性相关的软件包,包括Java密码术扩展(JCE),Java安全套接字扩展(JSSE)和Java身份验证和授权服务(JAAS)。 所有这些组件都是Java密码体系结构(JCA)的一部分,如下图所示:

白板

在以下两个图中,您将看到两个白板客户端窗口。 想象每个窗口都在不同的计算机上运行。 第一个用户单击了他的窗口中的某个位置并键入了一条消息,但尚未按回车键。

第一个用户正在键入消息,但尚未按回车键。 因此,第二用户尚未收到消息。
使用白板:用户1b

现在,假设第一个用户按下Return键,这将导致他的消息显示在第二个用户的窗口中。 然后,第二个用户发送一个响应,如下图两个图所示。

第一个用户按下回车键并发送了一条消息,然后从第二个用户那里收到了答复。 第二个用户收到第一个用户的消息,然后发送响应。
使用白板:用户2b

每个用户都看到自己的黑色文本。 其他用户的文本以服务器分配的不同颜色显示。

客户端/服务器结构

在白板应用程序的服务器端,我们有一个名为的类。 此类侦听指定端口上的传入连接。 每次建立连接时, 都会创建一个来处理连接。 处理连接意味着接收文本消息并将其发送回其他客户端。 为每个客户端提供一个 。

客户端首次启动时,它将启动与服务器的连接。 客户端在整个白板会话期间都保持此连接打开。 每个文本消息都是通过此连接发送的。

下图说明了白板应用程序的客户端/服务器过程。

白板的客户端/服务器过程

关键文件

正如我们已经讨论过的,白板使用JSSE,而JSSE实现了SSL和TLS协议。 这些协议使用公钥加密来确保通过Internet发送的消息的私密性。 在公共密钥加密系统中,客户端和服务器都必须具有一对密钥,一个公共密钥,一个私有密钥。 在我们的白板甚至无法开始在用户之间调解消息之前,我们必须生成这些密钥。

生成密钥后,我们将为客户端提供一个包含其公共密钥和私有密钥的文件。 它还将具有服务器的公共密钥证书的副本。 密钥存储在一种特殊格式的文件中,该文件称为密钥库。

下表描述了我们将使用的密钥库文件。

密钥库文件 它包含什么 去哪里
客户。私人 客户的公钥/私钥对 客户端
服务器公共 服务器的公钥证书 客户端
server.private 服务器的公用/专用密钥对 服务器端
客户 客户公钥证书 服务器端

按键保护

服务器还具有一个文件,该文件包含其自己的公钥和私钥以及客户端的公钥证书。 回想一下,可以免费提供公钥-无需将其隐藏于任何其他方。

客户端/服务器连接的每一端都只有正常工作所需的密钥文件,这一点很重要。 特别重要的是,只有服务器才能拥有其自己的私钥的副本。 如果使用不当,此密钥可能造成很大的损害,因为它实际上将使恶意实体将自己隐藏在服务器的身份下。

现在,您已经了解了白板的组合方式,我们可以开始更直接地使用其每个组件。 在下一部分中,您将学习如何在客户端/服务器系统中生成和管理公钥/私钥对。

密钥管理

总览

密钥生成和操作通过keytool程序执行,该程序包含在JDK 1.4中的JSSE软件包中。 keytool可以用于多种用途。 在这里,我们将使用它来创建公用/专用密钥对,并从这些对中提取公用密钥证书并将其放置在自己的文件中。

生成密钥对

以下keytool命令用于生成新的公用/专用密钥对:

当您运行此命令时,将询问您一系列问题。 这些问题涉及您作为一个实体(您的姓名,组织等)。 您提供的信息将用于创建自签名证书,该证书将信息与公钥关联,并证明关联的真实性。 您还将被要求输入密钥库的密码,或者输入正在创建的密钥对的密码。

从命令行工作

以下是一个完整的命令,该命令生成一个公共/私有密钥对,并指定所有必需的实体信息,而不会问您有关身份的任何问题; 该信息直接在命令行上提供。 下表解释了命令中的每个选项。

选项 这是什么意思
-genkey 告诉keytool生成密钥对。
-alias clientprivate 标识密钥库中的新密钥对。
-keystore client.private 使用文件client.private作为密钥库。
型JKS 声明密钥库的类型。 JKS是默认设置。
-keyalg rsa 声明要使用的算法; 我们使用的是RSA公钥算法,这是默认设置。
-dname“ CN =您的名字…” 提供有关拥有密钥对的实体的信息。
-storepass clientpw 指定整个密钥库的密码。
-keypass clientpw 指定新密钥对的密码。

客户端和服务器密钥对

准备我们的算法的第一步是为客户端生成公共/专用密钥对,为服务器生成另一对。 以下命令将生成文件client.private,这是客户端的密钥对:

这是生成文件server.private的命令,这是服务器的密钥对:

如密钥文件部分所述,专用客户端和服务器密钥文件需要安装在特定位置。 client.private文件安装在客户端。 server.private文件安装在服务器端。

提取公钥

下一步是提取公钥,以便可以将其与客户端和服务器一起安装。 具体来说,客户端软件必须具有服务器端的公钥,反之亦然。

要获取公共密钥,我们从client.private和server.private文件中提取它们,并将它们放在临时文件中。 然后,将它们插入各自的密钥库中,分别称为client.public和server.public。

临时密钥文件temp.key用于在从私有密钥库复制到公共密钥库(例如,从client.private到client.public)的过程中临时保存每个公共密钥。 完成导出/导入过程后,您将要从当前目录中删除temp.key。

导出/导入命令

我们将使用命令将公钥提取到文件中,然后使用命令将其插入新的密钥库中。 这是提取客户端公钥的命令:

这是将客户端的私钥插入其自己的密钥库的命令:

我们还将提取并存储服务器的公钥。 这是提取密钥的命令:

这是将其放置在其自己的密钥库中的命令:

脚本generatekeys.sh(对于UNIX)和generatekeys.bat(对于DOS或Microsoft Windows)会自动为您生成客户端和服务器密钥文件,并清除所有临时文件。 请参阅下载以下载脚本。

安装文件

在继续进行下一部分之前,重要的是要确保密钥文件已正确安装在客户端和服务器端。 客户端上应安装以下文件:

  • 客户类
  • 客户$ 1.class
  • 客户$ 2.class
  • Client $ ClientCanvas.class
  • 发布类
  • 客户。私人
  • 服务器公共

这些文件应安装在服务器端:

  • 服务器类
  • 发布类
  • ConnectionProcessor.class
  • 客户
  • server.private

在客户端和服务器系统上正确安装了公钥/私钥对之后,我们就可以开始使用白板应用程序交换消息了。 在下一节中,我们将检查白板应用程序本身的代码。

使用JSSE套接字

总览

我们的白板是一个客户端/服务器应用程序,它使用套接字与服务器进行通信。 因为我们希望我们的通信是私有的,所以我们将使用JSSE安全套接字而不是常规套接字。 安全套接字的使用方式与常规套接字相同,只不过它们透明地加密通过它们的所有数据。

在探讨JSSE如何创建和管理安全连接之前,我们应该查看如何启动和接受常规的非安全连接。

非安全套接字:评论

以下代码段通常用于启动套接字连接。 本示例在远程计算机创建到端口的新连接:

同样,以下代码演示了我们如何侦听传入的连接。 本示例创建一个侦听端口port的 ,然后进入一个无限循环,接受并处理传入的连接:

安全套接字的工作方式非常相似,但是在为示例实现安全套接字之前,我们必须完成几个步骤。 我们将在以下各节中介绍这些步骤。

连接设置

要启动到远程服务器的安全套接字连接,我们必须执行以下步骤:

  1. 创建一个 ,它是安全随机数的来源。 安全随机数是足够随机的数字,它们不会使加密容易受到攻击。
  2. 创建一个包含远程服务器公钥的对象。 这是从server.public中读取的。
  3. 创建一个包含客户端的公用/专用密钥对(包括其公用密钥证书)的对象。 这是从client.private中读取的。
  4. 从远程服务器的创建一个 。 这用于验证远程服务器。
  5. 从客户端的创建一个 。 这用于加密和解密数据。
  6. 使用 , 和创建一个对象。
  7. 使用创建一个 。
  8. 使用创建一个 ,除了安全性外,它的行为与常规相同。

听力设置

要侦听传入的连接,我们必须执行一组类似的步骤:

  1. 创建一个 ,它是安全随机数的来源。
  2. 创建一个包含远程客户端公钥的对象。 这是从client.public中读取的。
  3. 创建一个包含服务器的公用/专用密钥对(包括其公用密钥证书)的对象。 这是从server.private中读取的。
  4. 从远程客户端的创建一个 。 这用于验证远程客户端。
  5. 从服务器的创建一个 。 这用于加密和解密数据。
  6. 使用 , 和创建一个对象。
  7. 使用创建一个 。
  8. 使用创建 ,除了安全性外,其行为与常规相同。
  9. 调用的方法以等待传入连接。

这一切都非常复杂,但是每次的过程都是相同的,因此继续学习并观察其工作原理是有意义的。 在以下各节中,我们将逐步完成执行这些步骤的代码。 我们将仅详细检查客户端进程,因为服务器端进程几乎相同。 之后,我们将注意到双方之间的差异。

创建一个SecureRandom

创建对象很容易; 只需在代码中使用以下几行:

第一行实际上创建了 。 创建需要大量计算,并且只有在实际使用该计算后,才能执行该计算。 通过在此处调用方法,我们可以继续创建过程,并确保延迟将在程序开始时发生,而不是在可能给我们带来不便的情况下发生。

创建密钥库

接下来,我们需要创建一些对象。 我们使用静态方法创建一个空的 ,并使用其方法对其进行初始化,如下所示:

请注意,我们已经创建了类型为的 ; 这是JCA中使用的标准密钥库格式。

读取密钥库

在上一节中,我们从server.public中读取密钥信息,其中包含服务器端的公共密钥。 我们还需要从client.private读取客户端密钥对,如下所示:

设立工厂

下一步是使用我们创建的对象初始化密钥和信任管理器工厂。 我们将从服务器密钥库创建一个 ; 这将用于认证(即开始信任)远程服务器:

请注意, 的类型为 ; 509是我们在整个计划中使用的认证协议的名称。 在第二行代码中, 装入了服务器的密钥库。

我们还必须从客户端的创建一个 ,

来源:cusi77914

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年6月2日
下一篇 2020年6月2日

相关推荐