一、什么是OpenSSL
在电脑网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通讯,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。
OpenSSL由三部分组成:
libencrypto库
libssl库
openssl多用途命令行工具
二、OpenSSL加密算法和协议
1、对称加密算法
特性:
加密、解密使用同一个密钥
将原始数据分割成为固定大小的块,逐个进行加密
缺陷:
密钥过多
密钥分舵困难
常用算法:
DES、3DES、AES、Blowfish、Twofish等等
2、公钥加密算法
密钥分为公钥与私钥:
公钥:从私钥中提取产生;可以公开给所有人
私钥:通过工具闯将,使用者自己留存,必须保证其私密性
特点:用公钥加密的数据,只能使用与之对应的私钥解密,反之亦然
用途:
数字签名:主要用于让接收方确认发送放的身份
密钥交换:发送发用对方公钥加密一段对称密钥,并发送给对方
算法:
RSA:1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,RSA就是他们三人姓氏开头字母拼在一起组成的。
DSA:Digital Signature Algorithm 数字签名算法
3、单向加密
特性:定长输出、雪崩效应
# 雪崩效应指,其中以为发生变化,都会给结果带来翻天覆地的变化
功能:数据完整性
算法:
md5:Message Digest 5, 128bits 消息摘要
sha1:Secure Hash Algorithm 1, 160bits 安装的hash算法
sha224、sha256、sha384、sha512(都为sha家族,224长度为224位,其他意义相同)
4、密钥交换
公钥加密:通过获取对方的公钥对数据进行加密,只有对方的私钥才能解密
DH算法(Deffie-Hellman):由两个人名组成
三、公钥加密解密过程图解
四、各加密算法管理命令
openssl:默认在Centos 7上面默认安装,可以直接使用,有很多子命令可以分别管理。
子命令分为三类:
标准命令
信息摘要命令(dgst命令)
加密命令(enc子命令)
标准命令:enc,ca,req,genrsa等等
1、对称加密
工具:openssl enc
支持的算法:3des,aes,blowfish,towfish
enc命令:
加密:# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext
2、单向加密
工具:openssl dgst,md5sum,sha1sum,sha224sum等等
dgst命令:
# openssl dgst -md5 /PATH/TO/SOMEFILE
1
2
3
4
5
6
7
8
9
10
|
# openssl dgst -md5 /etc/fstab
MD5(
/etc/fstab
)= e5ee5d6d40cf1983771c8650df455135
# md5sum /etc/fstab
e5ee5d6d40cf1983771c8650df455135
/etc/fstab
# sha1sum /etc/fstab
5f3a9f070f56a355ca68d86028c95dca5c4bcb2f
/etc/fstab
# sha224sum /etc/fstab
fd8e80dc3e6479d254b50e7f0c05d7897a99ed951c3f81ec1fec362a
/etc/fstab
# sha512sum /etc/fstab
9893ded3aa749d79e6e714dd3ca81454e05243f7655633cef06719365c1e7b27a372705752ac751a2adeced881952627d02767c9aa305db31ee1de87b428804a
/etc/fstab
|
3、生成用户密码
工具:passwd,openssl passwd
1
2
3
|
# openssl passwd -1 -salt $(openssl rand -hex 10)
Password:
$1$0d9d2f2e$Ty3KtAwkijG5zIU08ixay.
|
4、生成随机数
工具:openssl rand
# openssl rand -hex NUM
# openssl rand -base NUM
1
2
3
4
|
# openssl rand -hex 10
6d989f629da63bb40948
# openssl rand -base64 10
3JXUSebo5uMlfw==
|
# 注意复制base64的随机数时,不要复制后门的“==”号
5、公钥加密
生成密钥:
生成私钥: # (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
提出公钥: # openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
# 注意:因为私钥必须保证其安全,所以其umask应该为077,放在括号中执行,表示在子shell中执行,可以不影响当前shell
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# (umask 077;openssl genrsa -out /opt/http)
Generating RSA private key, 1024 bit long modulus
.........................++++++
...............++++++
e is 65537 (0x10001)
# openssl rsa -in /opt/http -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCw554Lm/+x+eGJRfqk5YpDLkLj
NvAO2t8P6DQHc5l2pnm1vw6KnWTPB0V4S2P87E2fI1QV0RplTD832FBpina
/fsz4
iGjv1CfjA8kwQ0wMJfrqqtOHAsmeKUmAqJvtSGhLy8b0Lx1AWxGBPKg32PmmhCQE
tnROn
/cXwb8Od80unwIDAQAB
-----END PUBLIC KEY-----
|
五、PKI及创建私有CA
PKI:公钥基础设施(Public Key Infrastructure)
签证机构:CA
注册机构:RA
证书吊销列表:CRL
整数存取库
SSL:Secure sockets Layer
由Netscape公司在1994年研发,其版本有V1.0,V2.0,V3.0 其中V3.0最为主流,但是前一段时间google验证出其有bug,所以建议使用TLS
TLS:Transport Layer Security
有IETF研发:其版本有V1.0, V1.1, V1.2, V1.3主流版本为V1.2
创建私有CA:
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可
步骤:
(1) 生成私钥;
1
|
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
|
(2) 生成自签证书;
1
|
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
|
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于创建私有CA时;
-key:生成请求时用到的私有文件路径;
-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
(3) 为CA提供所需的目录及文件;
1
2
3
|
# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
# touch /etc/pki/CA/{serial,index.txt}
# echo 01 > /etc/pki/CA/serial
|
测试并申请签署证书:
步骤:(以httpd为例)
(1) 用到证书的主机生成私钥;
1
2
3
|
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
|
(2) 生成证书签署请求
1
|
# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365[object Object]
|
(3) 将请求通过可靠方式发送给CA主机;
这里使用scp(本次仅用于测试使用,密钥传输时必须保证其安全,可以使用u盘复制)
1
2
3
|
# scp httpd.csr 172.18.250.108:/opt/
root@172.18.250.108's password:
httpd.csr 100% 1094 1.1KB
/s
00:00
|
(4) 在CA主机上签署证书;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
Using configuration from
/etc/pki/tls/openssl
.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1(0x2)
Validity
Not Before: Apr 10 15:45:54 2016 GMT
Not After : Apr 10 15:45:54 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = beijing
organizationName = ops
organizationalUnitName = ops
commonName = ops.com
emailAddress = admin@ops.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
08:A3:DD:98:D3:E0:42:58:5E:B7:24:43:6C:3D:B1:D8:02:34:16:46
X509v3 Authority Key Identifier:
keyid:75:63:44:2C:46:80:2F:84:CE:EF:C6:F1:F2:E7:75:2E:EF:17:37:C2
Certificate is to be certified
until
Apr 10 15:45:54 2017 GMT (365 days)
Sign the certificate? [y
/n
]:y
1 out of 1 certificate requests certified, commit? [y
/n
]y
Write out database with 1 new entries
Data Base Updated
|
查看证书中的信息:
1
|
# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
|