安全套接字层(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 值让服务器进行验证,从而结束握手的过程。服务器也会向客户机发送一个类似的消息。客户机和服务器在结束握手并开始通信之前,都要对这些数据进行验证。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




