OpenSSL
[TOC]
OpenSSL
OpenSSL 是一个开源项目,其组成主要包括一下三个组件:
- openssl:多用途的命令行工具
- libcrypto:加密算法库
- libssl:加密模块应用库,实现了ssl及tls
openssl可以实现:秘钥证书管理、对称加密和非对称加密
对称加密
对称加密需要使用的标准命令为enc
,用法如下:
1 | openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] |
常用选项有:
1 | -in filename:指定要加密的文件存放路径 |
示例:
1 | 加密(加密需要输入加密密码) |
单向加密
单向加密需要使用的标准命令为dgst
,用法如下:
1 | openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] |
常用选项有:
1 | [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一种加密算法 |
示例:
1 | openssl dgst -md5 mimi.txt |
单向加密除了openssl dgst
工具还有:md5sum
,sha1sum
,sha224sum
,sha256sum
,sha384sum
,sha512sum
示例如下:
1 | sha512sum mimi.txt |
生成密码
生成密码需要使用的标准命令为passwd
,用法如下:
1 | openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password} |
常用选项有:
1 | -1:使用md5加密算法 |
示例如下:
1 | echo "yao jia mi de nei rong"|openssl passwd -1 -stdin |
生成随机数
生成随机数需要用到的标准命令为rand
,用法如下:
1 | openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num |
常用选项有:
1 | -out file:将生成的随机数保存至指定文件中 |
示例如下:
1 | openssl rand -hex 10 |
生成秘钥对
首先需要先使用genrsa
标准命令生成私钥,然后再使用rsa
标准命令从私钥中提取公钥。
genrsa
的用法如下:
1 | openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits] |
常用选项有:
1 | -out filename:将生成的私钥保存至指定的文件中 |
一般情况下秘钥文件的权限一定要控制好,只能自己读写,因此可以使用umask
命令设置生成的私钥权限,示例如下:
1 | 生成私钥文件:private.key(umask 077;可不设置) |
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 | -in filename:指明私钥文件 |
示例如下:
1 | 从私钥文件private.key中提取出公钥文件public.pubkey |
创建CA和申请证书
使用openssl
工具创建CA证书和申请证书时,需要先查看配置文件,因为配置文件中对证书的名称和存放位置等相关信息都做了定义,具体可参考 /etc/pki/tls/openssl.cnf
文件
示例如下:
(1)创建自签证书
生成CA根证书(root ca证书)步骤:生成CA私钥(.key或者.pem)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt或.pem)(CA给自已颁发的证书)
第一步:创建为 CA 提供所需的目录及文件
1 | mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private} |
使用tree
命令查看目录结构:
1 | tree |
第二步:指明证书的开始编号
1 | echo 01 >> serial |
第三步:生成私钥
(私钥的文件名与存放位置要与配置文件中的设置相匹配)
1 | openssl genrsa -out cakey.pem 2048 |
第四步:生成自签证书
(自签证书的存放位置也要与配置文件中的设置相匹配,生成证书时需要填写相应的信息)
此处直接根据key文件获取CA根证书的命令:
1 | 命令中用到的选项解释: |
执行后需要输入如下信息:
1 | Country Name (2 letter code) [XX]:ZJ |
说明:
1 | Country Name :C=国家 |
成功后会生成cacert.pem
文件
(2)颁发证书
在需要使用证书的主机上生成证书请求,以httpd
服务为例,步骤如下:
第一步:在需要使用证书的主机上生成私钥,这个私钥文件的位置可以随意定
1 | openssl genrsa -out httpd.key 2048 |
第二步:生成证书签署请求
1 | openssl req -new -key httpd.key -out httpd.csr -days 365 |
需要填写想应的信息:
1 | Country Name (2 letter code) [XX]:ZJ |
第三步:将请求通过可靠方式发送给 CA 主机
1 | cp httpd.csr ../CA |
第四步:CA 服务器拿到证书签署请求文件后颁发证书,这一步是在 CA 服务器上做的
创建openssl.cnf(默认使用的是/etc/pki/tls/openssl.cnf)
1 | cp /etc/pki/tls/openssl.cnf . |
查看证书信息的命令为:
1 | openssl x509 -in httpd.crt -noout -serial -subject |
输出结果:
1 | serial=01 |
(3)吊销证书
吊销证书的步骤也是在CA服务器上执行的,以刚才新建的httpd.crt
证书为例,吊销步骤如下:
- 第一步:在客户机上获取要吊销证书的
serial
和subject
信息 - 第二步:根据客户机提交的
serial
和subject
信息,对比其余本机数据库index.txt
中存储的是否一致 - 第三步:执行吊销操作
1
openssl ca -config openssl.cnf -revoke newcerts/01.pem
- 第四步:生成吊销证书的吊销编号 (第一次吊销证书时执行)
1
echo 01 > crlnumber
- 第五步:更新证书吊销列表查看 crl 文件命令:
1
openssl ca -config openssl.cnf -gencrl -out crl/ca.crl
所有示例的最终目录结构如下(使用tree命令查看)1
openssl crl -in crl/ca.crl -noout -text
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
- 加密文件:
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
- 计算文件的 MD5 值:
openssl md5 < 1.key
- 计算文件的 SHA1 值:
openssl sha1 < 1.key
安全协议
OpenSSL的目标是实现安全协议。其中相关协议和标准包括:SSL/TLS
、PKCS#1
、PCKS#10
、X.509
、PEM
、OCSP
等