安全通信的瑞士军刀 — OpenSSL

网络的出现使得系统之间的交互更为便捷。随着其应用范围的不断扩展,网络已经不局限于内部、局部区域使用,这也随即引入新的安全问题: 在不可信的信道上,两个先前并不熟悉的主体如何进行可信通信? 这也是网络安全最基本的问题之一,进一步细化表述为两个问题,即:

  1. 两个先前并不熟悉的主体如何确认对方的身份?
  2. 两个主体之间如何开展保密通信?

一、SSL

为解决HTTP安全通信问题,网景公司(netscape)率先提出了SSL协议。经过若干年的发展,SSL协议也不断升级改善,目前统称为SSL/TLS协议。

pic-ssl1

1. SSL的运作过程

  • 基本过程

    密码学是安全通信的基础,SSL则是密码学技术应用的典型实例。它结合使用了对称加密算法和非对称加密算法,充分发挥了每种加密算法的特点。其核心工作是利用非对称加密算法(公钥算法)认证身份、协商通信(会话)密钥,利用对称加密算法完成通信主体信息的加密。其基本过程是这样的:

    1. 客户端向服务器端索要并验证公钥;
    2. 双方协商生成"会话密钥";
    3. 双方采用"会话密钥"进行加密通信。
    
    其中,步骤(1)、(2)统称为“握手阶段”。
    
  • 具体过程

    SSL的具体握手过程如下所示:

pic-ssl2

SSL协议握手过程值得注意的几点是:

  • SSL的“握手过程” 最重要的任务是通信双方通过握手产生真正用于传输加密的“会话密钥”。SSL协议生成“会话密钥”一共需要三个随机数。前两个随机数都是通过明文传递,第三个随机数利用服务器公钥加密后才进行传输。故而,整个“会话”的安全,取决于第三个随机数(pre-master secret)能否被破解。
  • 因为SSL协议涉及多个版本,每个版本又可以支持多种加密算法,客户端(如浏览器)对一些加解密算法的支持程度不一样。为顺利实现可信通信,两个通信主体之间必须首先沟通协商通讯中使用哪个协议(协议版本),协议中使用哪种加密方法等信息,这些任务在“握手阶段”的初期完成。

二、OpenSSL

SSL本身是一个协议,协议定义了一组标准接口和规范,具体应用上还依赖对协议的具体实现。Openssl 就是众多实现中最著名的一个。

OpenSSL最初名为SSLeay,由 Eric A.Young 和 Tim J.Hudson 个人开发,随着二位仁兄加盟密码学老店 RSA,OpenSSL转为由社区志愿者维护。由于与生俱来的开源特性及其在Unix平台的良好表现,目前,OpenSSL已广泛应用于各种服务器和客户端工具中。

OpenSSL,顾名思义,是一套开源的SSL实现,除此之外,它提供了一个工具集,支持一个通用的密码学算法库,支持各种强度的密码学操作。对用户而言,OpenSSL提供了:

  • 一套命令行工具集;

    利用OpenSSL命令,可进行各种 key 和 certificate 管理,各种密码学加密/解密等操作。

  • 一个支持 SSL 和各种密码学算法的开源开发库;

    可在OpenSSL开源代码的基础上,进一步根据实际需求进行定制化开发。

1、OpenSSL命令行工具集

1)OpenSSL命令使用方式

OpenSSL命令的使用有两种使用方式。一种在操作系统 shell 下使用,一种在 OpenSSL 的 shell 下使用。

  • 在操作系统 shell 下使用

    OpenSSL 可视为由主命令、辅命令、操作参数及操作对象组成。主命令为通用命令,即 openssl;辅命令为特定命令,与具体的操作相关的命令;其通用形式如图:

pic-ssl3

  • 在 OpenSSL 的 shell 下使用

    首先要在操作系统 shell 环境下直接执行 openssl 指令进入 openssl 特定 shell 环境,然后在该环境下执行 openssl 特定命令即可。

pic-ssl4

特别值得注意的是,整个 OpenSSL 命令体系的 input/output 都是以文件为基本操作单元的,*OpenSSL 是不能在命令中直接操作字符串的(如加密、解密操作)。

2、OpenSSL的常用命令

1)基本信息查看

  • version

    版本查看命令。

    利用该命令(尤其加上参数 -a)可以直接查看 OpenSSL 的版本相关信息,版本相关信息内容众多,其中 OPENSSLDIR 较为重要,其标识了 OpenSSL 配置信息和证书的存储路径。而这通常是在使用 OpenSSL 时需要首先明确的信息。

2)加解密算法相关指令

  • genpkey

    密钥生成的通用指令。

  • genrsa

    生成 RSA 私钥的专有指令。

  • rsa

    处理 RSA 密钥(包括私钥和公钥)的专有指令。这个指令可对 RSA 相关密钥进行全方位的处理,如密钥存储格式转换(DER与PEM)、对密钥设置保护密码(即 passphrase)、查看密钥(公/私钥)等。

  • enc

    专门处理对称加密算法的指令。可利用该指令进行 des、rc2 加解密,base64 编解码等操作。

  • dgst

    专门处理摘要算法的指令。

3)证书管理相关指令

  • req

    证书请求相关指令。

    一个服务器想要提供对 SSL 的支持,一定要有签名证书。机构想要获得某个 CA 签名的证书,一般包括三个主要步骤:

pic-ssl5

  • x509

    证书处理相关指令。一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等等。

  • verify

    证书验证工具。获得一个新的证书,对其验证工作必不可少,该工具可进行证书真伪进行检验。

    计算获取证书的摘要,用 issuer 的公钥解密证书的摘要签名,并与本地计算的证书摘要进行比对。由于证书签署的层次化结构,证书检验过程也可视为层次化检验。

有用参考:

  1. http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
  2. http://blog.csdn.net/liuhuiyi/article/details/7776825
  3. http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
  4. 各种 openssl 的文章和书籍

发表评论

邮箱地址不会被公开。 必填项已用*标注