一、前言
因工作需要,须在某协议栈中支持TLS 1.0,以提升协议的安全性。
为此,对著名开源库 openSSL 做一番了解并打算基于其上进行开发。
因实际操练过程中,发现网上的资源有许多坑,特记录以备忘,一来自用,二来可能可造福同好。
二、相关文档和资源
首先找到 openssl 官网的推荐文档:https://www.feistyduck.com/library/openssl-cookbook/online/
本来打算按部就班地学习和进阶,但是不幸的是,或许因为openssl 版本更迭步子太快,扯到蛋了,因此我按照步骤总是无法成功。无奈之下,发挥一些小聪明绕开。
而我之所以能完成相关操作,也和openssl版本很相关。
特声明如下:
我的openssl版本为:
#openssl version
OpenSSL 1.0.1p 9 Jul 2015
我的操作系统版本:
# lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: RedHatEnterpriseServer
Description: Red Hat Enterprise Linux Server release 5.5 (Tikanga)
Release: 5.5
Codename: Tikanga
三、下载和编译以及安装
通常linux 已经自带openssl了,我本机的原先就是0.9.8 版本(使用openssl version 命令查看),但为了使用一些新的特性,我们可以下载稳定版自行编译和安装。
下载:
$ wget http://www.openssl.org/source/openssl-1.0.1p.tar.gz
使用 tar 命令解压后,放到opensslsrc 目录。
在 opensslsrc 同级建立一个 openssl,作为编译的目标安装目录(假设为 /usr/local/openssl )。
执行:
$ cd opensslsrc
$ ./config \ --prefix=/usr/local/openssl \ --openssldir=/usr/local/openssl \ disable-ec_nistp_64_gcc_128
然后执行:
$ make depend $ make $ make install至此,在你的 /usr/local/openssl 里面出现了包含 bin, tool 等一系列的文件,openssl 工具编译安装完成。目录内容类似:
drwxr-xr-x 2 root root 4096 Jun 3 08:49 bin drwxr-xr-x 2 root root 4096 Jun 3 08:49 certs drwxr-xr-x 3 root root 4096 Jun 3 08:49 include drwxr-xr-x 4 root root 4096 Jun 3 08:49 lib drwxr-xr-x 6 root root 4096 Jun 3 08:48 man drwxr-xr-x 2 root root 4096 Jun 3 08:49 misc -rw-r--r-- 1 root root 10835 Jun 3 08:49 openssl.cnf drwxr-xr-x 2 root root 4096 Jun 3 08:49 private
四、生成自签名的根CA
按照前述的 cookbook 进行操作(点击打开链接),会出现坑爹的情况。
1. 生成key和csr:
$ openssl req -new \ -config root-ca.conf \ -out root-ca.csr \ -keyout private/root-ca.key注意:上述 root-ca.conf ,千万不要用文档里的那个例子,而必须使用 openssl 目录里的例子,在其之上,更改相关配置和路径。因为查看出错信息,基本上是说 root-ca.conf 文件不对。
2. 自签名
$ openssl ca -selfsign \ -config root-ca.conf \ -in root-ca.csr \ -out root-ca.crt \ -extensions ca_ext这个命令很可怕,因为会有无数错误,基本上是文件或目录不存在,找不到之类。耐心一点看错误提示,然后对照着将目录和文件建立起来。这个时候 touch 命令特别管用。
注意配置里的:
database = $dir/db/index # database index file.
这个配置要求 db/index 文件以及 db/index.attr 也必须事先存在。
还有一个问题:-extensions ca_ext为了这个选项,需要在 此前的 root-ca.conf 里面追加以下内容:[ca_ext] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash