[TOC]

OpenSSL

OpenSSL 是一个开源项目,其组成主要包括一下三个组件:

  • openssl:多用途的命令行工具
  • libcrypto:加密算法库
  • libssl:加密模块应用库,实现了ssl及tls

openssl可以实现:秘钥证书管理对称加密非对称加密

对称加密

对称加密需要使用的标准命令为enc,用法如下:

1
2
3
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64]
[-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md]
[-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

常用选项有:

1
2
3
4
5
6
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项
-e:可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:使用-base64位编码格式

示例:

1
2
3
4
# 加密(加密需要输入加密密码)
openssl enc -e -des3 -a -salt -in mimi.txt -out mimi-jiami.txt
# 解密(接密需要输入加密时使用的密码)
openssl enc -d -des3 -a -salt -in mimi-jiami.txt -out mimi-jiemi.txt

单向加密

单向加密需要使用的标准命令为dgst,用法如下:

1
2
3
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary]
[-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify
filename] [-signature filename] [-hmac key] [file...]

常用选项有:

1
2
[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一种加密算法
-out filename:将加密的内容保存到指定文件中

示例:

1
2
3
openssl dgst -md5 mimi.txt
# 或者
echo "lxylxy" |openssl dgst -md5

单向加密除了openssl dgst工具还有:md5sumsha1sumsha224sumsha256sumsha384sumsha512sum

示例如下:

1
2
sha512sum mimi.txt
md5sum mimi.txt

生成密码

生成密码需要使用的标准命令为passwd,用法如下:

1
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}

常用选项有:

1
2
3
4
-1:使用md5加密算法
-salt string:加入随机数,最多8位随机数
-in file:对输入的文件内容进行加密
-stdion:对标准输入的内容进行加密

示例如下:

1
2
3
echo "yao jia mi de nei rong"|openssl passwd -1 -stdin
# -salt string:加入随机数
openssl passwd -1 -in mimi.txt -salt 123456

生成随机数

生成随机数需要用到的标准命令为rand,用法如下:

1
openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num

常用选项有:

1
2
3
-out file:将生成的随机数保存至指定文件中
-base64:使用base64 编码格式
-hex:使用16进制编码格式

示例如下:

1
2
3
4
5
openssl rand -hex 10

openssl rand -base64 10

openssl rand -base64 10 -out aa.txt

生成秘钥对

首先需要先使用genrsa标准命令生成私钥,然后再使用rsa标准命令从私钥中提取公钥

genrsa的用法如下:

1
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

常用选项有:

1
2
3
-out filename:将生成的私钥保存至指定的文件中
-des|-des3|-idea:不同的加密算法
numbits:指定生成私钥的大小,默认是2048

一般情况下秘钥文件的权限一定要控制好,只能自己读写,因此可以使用umask命令设置生成的私钥权限,示例如下:

1
2
3
4
# 生成私钥文件:private.key(umask 077;可不设置)
umask 077;openssl genrsa -out private.key 4096
# 查看生成的私钥文件
cat private.key

rsa的用法如下:

1
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]

常用选项:

1
2
3
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中
-pubout:根据私钥提取出公钥

示例如下:

1
2
3
4
# 从私钥文件private.key中提取出公钥文件public.pubkey
openssl rsa -in private.key -out public.pubkey -pubout
# 查看公钥
cat public.pubkey

创建CA和申请证书

使用openssl工具创建CA证书和申请证书时,需要先查看配置文件,因为配置文件中对证书的名称存放位置等相关信息都做了定义,具体可参考 /etc/pki/tls/openssl.cnf文件

示例如下:

(1)创建自签证书

生成CA根证书(root ca证书)步骤:生成CA私钥(.key或者.pem)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt或.pem)(CA给自已颁发的证书)

第一步:创建为 CA 提供所需的目录及文件

1
2
mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
touch /etc/pki/CA/{serial,index.txt}

使用tree命令查看目录结构:

1
2
3
4
5
6
7
8
9
tree
# 执行结果:
.
├── certs//存放已颁发的证书
├── crl//存放已吊销的证书
├── index.txt//openSSL定义的已签发证书的文本数据库文件
├── newcerts//存放CA指令生成的新证书
├── private//存放私钥
└── serial//证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号

第二步:指明证书的开始编号

1
echo 01 >> serial 

第三步:生成私钥

(私钥的文件名与存放位置要与配置文件中的设置相匹配)

1
openssl genrsa -out cakey.pem 2048

第四步:生成自签证书

(自签证书的存放位置也要与配置文件中的设置相匹配,生成证书时需要填写相应的信息)

此处直接根据key文件获取CA根证书的命令:

1
2
3
4
5
6
7
8
9
10
# 命令中用到的选项解释:
# -new:表示生成一个新证书签署请求
# -x509:专用于CA生成自签证书,如果不是自签证书则不需要此项
# -key:生成请求时用到的私钥文件
# -out:证书的保存路径
# -days:证书的有效期限,单位是day(天),默认是365天
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650

# 如果不想填写那些注册信息,执行以下命令:
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650 subj "/C=ZJ/ST=ZHEJIANG/L=hangzhou/O=eastcom/CN=eastcom.cn"

执行后需要输入如下信息:

1
2
3
4
5
6
7
Country Name (2 letter code) [XX]:ZJ
State or Province Name (full name) []:ZHEJIANG
Locality Name (eg, city) [Default City]:hangzhou
Organization Name (eg, company) [Default Company Ltd]:eastcom
Organizational Unit Name (eg, section) []:eastcom
Common Name (eg, your name or your server's hostname) []:eastcom.cn
Email Address []:eastcom.com

说明:

1
2
3
4
5
6
7
Country Name             :C=国家
State or Province Name :ST=省份(州)
Locality Name :L=市/县
Organization Name :O=组织名称
Organizational Unit Name :OU=组织单位名称
Common Name :CN=公司名称
Email Address :emailAddress=邮箱

成功后会生成cacert.pem文件

(2)颁发证书

在需要使用证书的主机上生成证书请求,以httpd服务为例,步骤如下:

第一步:在需要使用证书的主机上生成私钥,这个私钥文件的位置可以随意定

1
openssl genrsa -out httpd.key 2048

第二步:生成证书签署请求

1
openssl req -new -key httpd.key -out httpd.csr -days 365

需要填写想应的信息:

1
2
3
4
5
6
7
8
9
10
11
12
Country Name (2 letter code) [XX]:ZJ
State or Province Name (full name) []:ZHEJIANG
Locality Name (eg, city) [Default City]:hangzhou
Organization Name (eg, company) [Default Company Ltd]:eastcom
Organizational Unit Name (eg, section) []:eastcom.cn
Common Name (eg, your name or your server's hostname) []:www.eastcom.cn
Email Address []:httpd@eastcom.cn

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:eastcom
An optional company name []:eastcom

第三步:将请求通过可靠方式发送给 CA 主机

1
cp httpd.csr ../CA

第四步:CA 服务器拿到证书签署请求文件后颁发证书,这一步是在 CA 服务器上做的

创建openssl.cnf(默认使用的是/etc/pki/tls/openssl.cnf)

1
2
3
4
5
6
7
cp /etc/pki/tls/openssl.cnf .
# 修改配置文件中的dir指向的路径
# dir = /home/liuxy/genCA/CA
vim openssl.cnf
cp cakey.pem private/
# 连续输入2个y进行确认
openssl ca -in httpd.csr -config openssl.cnf -out httpd.crt -days 365

查看证书信息的命令为:

1
openssl x509 -in httpd.crt -noout -serial -subject

输出结果:

1
2
serial=01
subject= /C=ZJ/ST=ZHEJIANG/O=eastcom/OU=eastcom.cn/CN=www.eastcom.cn/emailAddress=httpd@eastcom.cn

(3)吊销证书

吊销证书的步骤也是在CA服务器上执行的,以刚才新建的httpd.crt证书为例,吊销步骤如下:

  • 第一步:在客户机上获取要吊销证书的serialsubject信息
  • 第二步:根据客户机提交的serialsubject信息,对比其余本机数据库index.txt中存储的是否一致
  • 第三步:执行吊销操作
    1
    openssl ca -config openssl.cnf -revoke newcerts/01.pem
  • 第四步:生成吊销证书的吊销编号 (第一次吊销证书时执行)
    1
    echo 01 > crlnumber
  • 第五步:更新证书吊销列表
    1
    openssl ca -config openssl.cnf -gencrl -out crl/ca.crl
    查看 crl 文件命令:
    1
    openssl crl -in crl/ca.crl -noout -text
    所有示例的最终目录结构如下(使用tree命令查看)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    .
    ├── cacert.pem//CA服务器的公钥
    ├── cakey.pem//CA服务器的私钥
    ├── certs//存放已颁发的证书
    ├── crl//存放已吊销的证书
    │   └── ca.crl
    ├── crlnumber
    ├── crlnumber.old
    ├── httpd.crt//httpd服务的证书
    ├── httpd.csr
    ├── index.txt//openSSL定义的已签发证书的文本数据库文件
    ├── index.txt.attr
    ├── index.txt.attr.old
    ├── index.txt.old
    ├── newcerts//存放CA指令生成的新证书
    │   └── 01.pem
    ├── openssl.cnf
    ├── private//存放私钥
    │   └── cakey.pem
    ├── serial//证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并且包含一个有效的序列号
    └── serial.old

其他命令

版本和编译参数

  • 显示版本和编译参数: openssl version -a

支持的子命令、密码算法

  • 查看支持的子命令: openssl ?
  • SSL 密码组合列表: openssl ciphers

测试密码算法速度

  • 测试所有算法速度: openssl speed
  • 测试 RSA 速度: openssl speed rsa
  • 测试 DES 速度: openssl speed des

RSA 密钥操作

  • 产生 RSA 密钥对: openssl genrsa -out 1.key 1024
    • 生成1.ley文件,里面为可读的私钥信息
  • 取出 RSA 公钥: openssl rsa -in 1.key -pubout -out 1.pubkey
    • 通过1.key文件,取出可读的公钥信息,生成文件1.pubkey

      加密文件

  • 加密文件: openssl enc -e -rc4 -in 1.key -out 1.key.enc
    • 1.key文件进行加密
  • 解密文件: openssl enc -d -rc4 -in 1.key.enc -out 1.key.dec
    • 1.key.enc文件进行解密

      计算 Hash 值

  • 计算文件的 MD5 值: openssl md5 < 1.key
  • 计算文件的 SHA1 值: openssl sha1 < 1.key

安全协议

OpenSSL的目标是实现安全协议。其中相关协议和标准包括:SSL/TLSPKCS#1PCKS#10X.509PEMOCSP

参考

https://blog.51cto.com/11512826/2054578