Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

使用 OpenSSL API 进行安全编程(2)

来源:IBM DW中国 作者:Kenneth Ballard  时间:2007-04-22 点击: [收藏] [投稿]
安全套接字层(Secure Sockets Layer,SSL)会话中的安全握手非常重要,这是因为该连接中的所有安全性都是在握手过程中建立的。本文将介绍怎么样增强 SSL 握手的安全性,从而防止中间人(MITM)攻击 —— 此时入侵的一方会伪装成另外一个可信源。本文还会介绍数字证书的概念,以及 OpenSSL API 怎么样处理数字证书。

不久之前,安全握手是双方的业务得以实现的一个标记。毕竟,握手是一次面对面的机会,可以对潜在的合作者进行评价。安全且可信的握手意味着事务的双方都相信它们正在做的事情对双方都是有益的。不安全的握手标记着只有一方会对事务有着正确的理解。

握手的工作方式与在线事务相同。

developerWorks 上的前一篇文章“使用 OpenSSL API 进行安全编程,第 1 部分:API 概述” 向您介绍了怎么样使用 OpenSSL 创建基本、简单的安全连接。然而,这篇文章只是展示了基本的默认设置;它并没有介绍怎么样对内容进行定制。不过,我仍然建议大家阅读这篇文章,这样可以使您对本文的理解更加完整,因为前一篇文章介绍了数字证书的概念,并且介绍了怎么样判断一个证书是否成功通过了 OpenSSL 的内部验证。

本文将深入介绍 OpenSSL,向您介绍怎么样增强握手的安全性,防止所谓的 中间人 (MITM)攻击。

关于数字证书

在本文后面,我们将介绍怎么样获取数字证书并对数字证书进行验证,因此下面我们将快速讨论一下什么是数字证书,以及它是怎么样工作的。如果您熟悉数据加密和 SSL 的知识,就可以跳过本节。要了解更多有关加密和 SSL 问题的信息,请参阅在本文后面 参考资料 中所列出的文章和教程。

数字证书的最简单形式就是 不对称加密密钥(asymmetric cryptography key)。目前关于数字证书的标准中都有一些标识信息,在密钥中也都包含了这些信息。一个典型的数字证书包含所有者的名字(如果这个证书是在一个 Web 服务器上使用的,那么名字就是完整的域名)以及联系信息,还有一个有效日期范围,以及一个安全性签名,用来验证这个证书没有被篡改。

数字证书可以使用 OpenSSL 命令行工具或其他用于此目的的工具简单地创建。但是任何人创建的数字证书都有一个信任的问题。数字证书不仅仅是一个加密密钥,它还是一个在线凭证。证书会向那些试图与您进行通信的人证明您的身份。为了显示信任关系,数字证书可以由认证权威(CA)机构进行签名。

认证权威在数字安全性领域充当一个可信的第三方。由于在在线领域中证明某个实体的身份非常困难,认证权威就接管了这个挑战。它们为那些购买证书或对证书进行签名的用户的身份提供证明。因此,要信任一个证书,用户只需要信任证书权威即可。用户通过拥有并使用 CA 的信任证书来表明自己对认证权威的信任。Verisign 和 Thawte 是非常知名的认证权威。

如果一个证书的安全性曾经受到过威胁,那么这个证书就会被丢弃 —— 也就是说,将其声明为无效。当一个证书被声明为无效时,CA 不可能将其通知所有拥有该证书拷贝的人。相反,CA 会发布一个 证书撤销列表(Certificate Revocation List)(CRL)。浏览器和其他使用数字证书的程序都可以验证这个证书已经被其属主或 CA 撤销了。

证书的撤销也可以使用 OCSP 协议进行检查。OCSP 代表 Online Certificate Status Protocol(在线证书状态协议),它是在 RFC 2560 中定义的。OpenSSL 既有 OCSP 的功能,又有 CRL 的功能,但是对这些功能的介绍已经超出了本文的范围。目前数字证书所采用的标准是 X.509,这是在 RFC 3280 中定义的。

开展业务之前的握手

由于本文重点要介绍在握手过程中服务器数字证书的处理,因此让我们来深入介绍一下握手是怎么样工作的。如果您熟悉 SSL 的过程,可以跳过本节。

在一个连接上开始握手通常是从客户机向服务器说“Hello”开始的。helllo 消息(在规范中就是这么说的)包含了客户机的安全性参数:

  • SSL 版本号
  • 随机生成数据
  • 密码设置
  • 通信所需要的其他内容

服务器会使用自己的 hello 消息进行响应,其中包含了服务器的安全性参数,这些信息与客户机所提供的信息的类型相同。此时服务器还会发送自己的数字证书。如果客户机还要为这个连接进行认证,那么服务器还会发送一个请求,索取客户机的证书。

当客户机接收到服务器端的 hello 消息之后,数字证书就要进行验证了。这包括检查证书的各种参数,从而确保该证书从未受到过侵害,同时是在它的有效期内使用的。

此处还要执行的另外一个步骤是根据连接所使用的主机名对证书的名字进行检查。虽然这不是 SSL 标准的一部分,但是这个步骤却是高度建议的,它可以防止中间人攻击。这个步骤会验证证书就是来自您认为它所来自的那个实体。如果这两个实体在此处不能匹配,那么就只能怀疑这个证书是无效的。

在客户机和服务器之间共享的随机数据用来创建 premaster secret,这是一个只有服务器和客户机才会知道的共享秘密值,并且只用于这个会话。这个秘密值会对服务器的数字证书进行加密,并发送给服务器用于验证客户机的身份。

如果服务器请求客户机认证,那么客户机就会对这个在握手过程中随机生成的数据(只有服务器和客户机知道它)创建一个单向的 hash 值。客户机使用自己的私钥对这个 hash 值进行签名,并将签名后的数据和数字证书发送给服务器。服务器使用这些信息对客户机进行认证。

如果认证成功,那么服务器和客户机就会通过一个算法使用这个共享的随机数据来创建 master secret。从 master secret 中,客户机和服务器可以创建 session keys(会话密钥),这是选择用来对会话数据进行加密所使用的对称密码中的对称密钥。

客户机通过向服务器发送一个表明自己已经完成握手的消息,以及一组加密的单向 hash 值让服务器进行验证,从而结束握手的过程。服务器也会向客户机发送一个类似的消息。客户机和服务器在结束握手并开始通信之前,都要对这些数据进行验证。

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:创建基本的安全连接和非安全连接   下一篇:Windows 打印管理在Linux 平台实现

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号