当前位置: 首页 > news >正文

对等计算实践: P2P 遇上 SSL

保证对等机之间的通信安全

developerWorks

级别: 初级

Todd Sundsted, 首席设计师, PointFire, Inc

2001 年 10 月 07 日

对任何重要的 P2P 应用程序而言,对等机之间的安全通信都是一个核心要求。尽管安全的细节依赖于如何使用该应用程序和该应用程序将要保护什么,但通过使用现有技术,例如 SSL 实现强壮的、一般用途的安全通常是可能的。本月,Todd Sundsted 演示如何在 P2P 安全中使用 SSL(通过 JSSE)。

上月我们考察了 p2p 应用程序中的信任角色。信任的等级是衡量我们确信程度的尺度,即我们正与之通信的人是否是我们以为的那个人,以及我们正访问的资源是否是我们以为的那些。我们也研究了用于在所有分布式应用程序,包括 p2p 应用程序中建立信任的三个构件:认证、授权和加密。

现在我们将通过修改我们的简单 p2p 应用程序把上个月的课程应用到实践中。特别地,我们将用 X.509 证书扩展该应用以支持 P2P 认证和加密。我们将在将来的文章中处理授权问题。

安全认证

一个应用程序的安全需求在很大程度上依赖于将如何使用该应用程序和该应用程序将要保护什么。不过,用现有技术实现强大的、一般用途的安全通常是可能的。认证就是一个很好的示例。

当顾客想从 Web 站点购买某个产品时,顾客和 Web 站点都要进行认证。顾客通常是以提供名字和密码的方式来认证他自己。另一方面,Web 站点通过交换一块签名数据和一个有效的 X.509 证书(作为 SSL 握手的一部分)来认证它自己。顾客的浏览器验证该证书并用所附的公用密钥验证签名数据。一旦双方都认证了,则交易就可以开始了。

SSL 能用相同的机制处理服务器认证(就如在上面的示例中)和客户机认证。Web 站点典型地对客户机认证不依赖 SSL ― 要求用户提供密码是较容易的。而 SSL 客户机和服务器认证对于透明认证是完美的,对等机 ― 如 p2p 应用程序中的对等机之间一定会发生透明认证。

安全套接字层(Secure Sockets Layer(SSL)) SSL 是一种安全协议,它为网络(例如因特网)的通信提供私密性。SSL 使应用程序在通信时不用担心被窃听和篡改。

SSL 实际上是共同工作的两个协议:“SSL 记录协议”(SSL Record Protocol)和“SSL 握手协议”(SSL Handshake Protocol)。“SSL 记录协议”是两个协议中较低级别的协议,它为较高级别的协议,例如 SSL 握手协议对数据的变长的记录进行加密和解密。SSL 握手协议处理应用程序凭证的交换和验证。

当一个应用程序(客户机)想和另一个应用程序(服务器)通信时,客户机打开一个与服务器相连接的套接字连接。然后,客户机和服务器对安全连接进行协商。作为协商的一部分,服务器向客户机作自我认证。客户机可以选择向服务器作或不作自我认证。一旦完成了认证并且建立了安全连接,则两个应用程序就可以安全地进行通信。请参阅 参考资料以获得更多有关 SSL 的信息。

按照惯例,我将把发起该通信的对等机看作客户机,另一个对等机则看作服务器,不管连接之后它们充当什么角色。





在 Java 应用程序如何使用 SSL

用于 Java 应用程序的 SSL 由“Java 安全套接字扩展”(Java Secure Socket Extension(JSSE))提供。JSSE 是最近发布的 JDK 1.4 Beta 测试版的一个标准部件,但对早些版本的 Java 平台它是作为一个扩展可用的。

JSSE 用 SSL 作它的安全套接字的底层机制。JSSE 安全套接字除了支持透明认证和加密之外,其工作方式与常规套接字相似。因为它们看起来也与普通套接字(它们是类 java.net.Socket 和类 java.net.ServerSocket 的子类)相似,所以使用 JSSE 的多数代码不用修改。受到影响最多的代码是那些处理安全套接字工厂(secure socket factory)的创建和初始化的代码。

如果您想在早于版本 1.4 的 Java 平台中使用 JSSE,那么您将不得不自己去下载并安装 JSSE 扩展(请参阅 参考资料)。安装说明非常简单,所以我不想在这里重复。





模型

图 1 说明在对等机之间的通信中 SSL 将充当的角色。


图 1. 工作中的 SSL
图 1. 工作中的 SSL

名为 A 和 B 的两台对等机想安全地进行通信。 在我们简单的 p2p 应用程序的环境中,对等机 A 想查询对等机 B 上的一个资源。

每个对等机都有包含其专用密钥的一个数据库(名为 keystore)和包含其公用密钥的证书。密码保护数据库的内容。该数据库还包含一个或多个来自被信任的对等机的自签名证书。

对等机 A 发起这项事务,每台对等机相互认证,两台对等机协商采用的密码及其长度并建立一个安全通道。完成这些操作之后,每个对等机都知道它正在跟谁交谈并且知道通道是安全的。





初始化

因为 JSSE 和 SSL 的介绍对初始化代码有很大影响,所以让我们来考察对等机 A 中负责初始化的代码。


清单 1. 安全初始化代码

                                    

当用户第一次启动应用程序时,应用程序提示输入一个身份(别名)和一个密码。身份只用于对对等机进行本地识别 ― 它没有全局意义。应用程序生成一个随机的 128 位(16 字节)的字符串,应用程序用这个字符串对对等机进行全局识别并将它转换成字母数字字符串。应用程序用身份、密码和名字创建 keystore 和公开/专用密钥对,密钥对存储在 keystore 中。密码保护 keystore 中的信息。

我确信您已经注意到我创建初始 keystore 时采取的办法。应用程序把 keytool 启动为一个外部进程,keytool 创建 keystore。我不得不这样做,因为公共的 Java 安全 API 不提供创建证书的工具 ― 这些功能隐藏在 JSSE 中,它的 API 未发布。启动 keytool 来创建 keystore 的最大缺点是要冒用户提供的密码被公开的风险,用户提供的密码作为参数列表的一部分被传递进去。

应用程序创建了 keystore 之后,就打开 keystore 并将它装入内存(如果我们已经能够直接创建 keystore,则我们就可以免去这一步骤)。应用程序从 keystore 创建一个 密钥管理器(key manager)和一个 信任管理器(trust manager)。密钥管理器管理密钥,这些密钥用于在安全套接字对面相对应用程序的对等机来认证它。信任管理器管理证书,这些证书用于对位于安全套接字另一端的对等机进行认证。

最后,应用程序创建一个 SSLContext 实例,这个实例充当安全套接字工厂的工厂。应用程序创建 SocketFactoryServerSocketFactory 类的安全版本并将它们用于稍后的通信。

相关文章:

  • Sprout and the Bean
  • 数据库水平拆分和垂直拆分区别(以mysql为例)
  • 跟我一起学WCF(11)——WCF中队列服务详解
  • 第6期(江西省吉安市永丰县)县长手机信箱工作简报(自吹自擂政绩,自圆其说)
  • 各种排序算法的稳定性和时间复杂度小结
  • Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等...
  • 前端设计模式(0)面向对象设计原则
  • 专访Connolly:为什么我们需要手动回归测试宣言?
  • jedis连接服务超时connect timed out
  • 可以用parseInt()向下取整和Math.floor()有一样的功能
  • node和express搭建代理服务器(源码)
  • 解决Android8.0之后开启service时报错IllegalStateException: Not allowed to start service Intent ......
  • 技术篇-HBase 最佳实践-读性能优化策略
  • IaaS,PaaS和SaaS,又衍生出CaaS,NaaS和MaaS
  • Spring Cloud 下线微服务
  • 2017-09-12 前端日报
  • HTTP--网络协议分层,http历史(二)
  • KMP算法及优化
  • Material Design
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • node.js
  • Python_网络编程
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 从PHP迁移至Golang - 基础篇
  • 从重复到重用
  • 分享几个不错的工具
  • 给第三方使用接口的 URL 签名实现
  • 计算机在识别图像时“看到”了什么?
  • 开源SQL-on-Hadoop系统一览
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端学习笔记之观察者模式
  • 如何选择开源的机器学习框架?
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信支付JSAPI,实测!终极方案
  • 我的zsh配置, 2019最新方案
  • MPAndroidChart 教程:Y轴 YAxis
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​2020 年大前端技术趋势解读
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​用户画像从0到100的构建思路
  • ###C语言程序设计-----C语言学习(6)#
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十)T检验-第一部分
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)插入排序
  • (一)基于IDEA的JAVA基础1
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .form文件_SSM框架文件上传篇
  • .NET 4.0中的泛型协变和反变
  • .NET 回调、接口回调、 委托
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET简谈设计模式之(单件模式)