一、openssl加解密原理
数据加密解密过程
数据加密需要实现的功能:数据私密性,数据完整性,身份认证和秘钥交换。
美国NIST,为了计算机的安全,提出了几个要求:
1、数据保密性
数据保密性
隐私性
2、完整性
数据完整性
系统完整性
3、可用性
4、真实性 && 可追溯性
OSI:x.800
安全攻击:
被动攻击:窃听
主动攻击:伪装、重播、消息修改、拒绝服务
安全机制:
加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证
安全服务:
认证
访问控制
数据保密性
连接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性
1.1、密码算法和协议
1.1.2、对称加密
采用单密码系统的加密算法,同一个密钥可以同时用作信息的加密和解密,也称做单密钥加密。
常用的对称加密算法:
DES (56)
3DES
AES (128,192,256,384,512)
Blowfish
Twofish
IDEA
RC6
CAST5
明文:clear text, plain text
密钥:
密文:
加密、解密算法
特性:
1、加密、解密使用同一口令;
2、将明文分隔成固定大小的块,逐个进行加密
优点:算法公开、计算量小、加密速度快、加密效率高。
缺陷:
1、密钥过多; 2、密钥传输;
密钥交换、身份验正、数据完整性
1.1.2、公钥加密
非对称加密
密钥:public key, secret key
p/s
公钥:其密钥长度非常长
身份认证:
密钥交换
常用的公钥加密加密算法:
RSA, DSA, EIGamal
RSA
1.1.3、单向加密
提取数据的惟一的特征码,用来校验数据在传输过程中是否被修改。
1、定长输出;
2、不可逆;
3、雪崩效应
常用的单向加密加密算法:
md5: 128bits
sha1: 160bits
SHA256、SHA384、SHA512
HMAC
eg: md5sum /tmp/fstab
sha512sum /tmp/fstab
Bob --> data, fingerprint --> data,
数据指纹
Bob使用自己的私钥加密生成特征码,别人再拿Bob的公钥进行解密
能用公钥解开特征码,保证了数据来源,解开后再加密和原有特征码一致,保证了数据的完整性。
1.1.4、认证协议
密钥交换:IKE(Internet Key Exchange)
DH算法
1.2、加解密过程描述
1、 Bob生成数据
2、 用单向加密算法计算这段数据的特征码
3、 用自己的私钥加密这段特征码并附加在数据的后面——用自己的私钥进行签名
4、 再生成一个一次性对称密钥将这个数据整个加密
5、 加密完后再用Alice的公钥去加密这个一次性密码
6、 放在这个数据的后面一并发给Alice。
7、 Alice得到后先用自己的私钥解密这段密码
8、 拿到密码后解密加密的数据,再用同样的单向加密算法计算这个特征码
9、 并用Bob的公钥去解密单向加密算法生成的特征码,验证对方身份
10、 看计算和解密的特征码是否一致。
11、 Alice接收数据
Bob把证书给Alice。Alice得到证书后先用CA的公钥解密特征码,能解密才行,再用同样的单向加密算法解密这段特征码,两个特征码一致才行。
密钥交换:IKE(Internet Key Exchange)
DH算法
Bob把信息发给CA,CA用单向加密算法计算整个证书的特征码,并用私钥加密这段特征码并附加在证书的后面,Bob把证书给Alice。Alice得到证书后先用CA的公钥解密特征码,能解密才行,再用同样的单向加密算法解密这段特征码,两个特征码一致才行。
1.3、公钥基础设施PKI
PKI:Public Key Infrastructure
公钥基础设施
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:
用户 ->证书存取库-> RA -> CA
->证书吊销列表
x.509: 定义了证书结构和认证协议标准;
IP安全、TLS/SSL和S/MIME
证书结构
证书版本号
证书序列号
算法参数
发行者名称
有效期限
证书拥有者名称(主题名称)
公钥信息
发行者的ID
证书拥有者信息(主题ID)
CA的签名
SSL: Secure Socket Layer
sslv1, sslv2, sslv3
TLS: Transport Layer Security
tlsv1
http(80/tcp) --> ssl --> https(443/tcp)
Linux:gpg, (pgp); openssl
1.4、openssl的运用
全名:开放式安全套接层协议
OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并通过丰富的应用程序供测试或其他目的使用。
SSL协议标准目标是保证两个应用间通信的保密性和可靠性,可在服务器段和用户端同时实现支持。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认知,还可选择对用户进行认知。SSL协议要求建立在可靠的传输层协议(TCP)上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成了加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
openssl: 多用途命令行工具,各功能分别使用子命令实现
libcrypto: 公共加密库
libssl: ssl协议的实现
openssl命令工具:
# openssl version
1.4.1、openssl基本用法
查看是否安装:rpm -ql openssl
Standar commands: 命令功能
Message Digest command: 信息摘要支持的算法
Cipher: 加密支持的算法
查看openssl的安装文件,配置之前可以先去读/etc/pki/tls/openssl.cnf配置文件,了解openssl工具家目录下各个文件夹的作用。这里看到CA的家目录是在/etc/pki/CA/,现在看下里面的目录结构
certs: 签发证书存放的地方
private:存放CA的私钥
crl:吊销的证书存放的地方
newcerts:签发新证书存放的地方
serial:签发证书的序列号(需创建),serial起始序列号需要制定
index.txt:数据库的索引文件(需创建)
crlnumber:吊销的证书序列号(需创建)
openssl命令选项:
-e 进行加密操作,可以不写默认为加密
-d 进行解密操作
-a 当进行加解密时,它只对数据进行运算,有时需要进行base64转换。设置此选项后,加密结果进行base64编码;解密前先进行base64解码。
-salt 加密过后放在密码最前面的一段字符串
-in 读取那个文件进行加密
-out 输出到哪里
-des3 指定算法
1.4.2、对称加密中的openssl
工具:gpg, openssl enc
算法:DES, 3DES, AES, Blowfish, Twofish, RC6, idea, CAST5
# openssl enc -des3 -a -salt -in /path/from/somefile -out /path/to/somecipherfile
#openssl enc -d -des3 -a -salt -in /path/from/somecipherfile -out /path/to/somefile
注意:enc -ciphername 表示对称算法名字
-d 进行解密操作
-a 当进行加解密时,它只对数据进行运算,有时需要进行base64转换。设置此选项后,加密结果进行base64编码;解密前先进行base64解码。
-salt 加密过后放在密码最前面的一段字符串
1.4.3、单向加密中的openssl
验证数据特征码的机制
特性:
One-Way
Collison-free
算法:
md5: 128bits
sha1: 160bits
sha256
sha384
sha512
# openssl dgst [-md5|-sha1] [-out /path/to/filename] /path/from/somefile
openssl dgst主要用于数据摘要,它也可以用于数据签名以及验证签名,默认md5.
MAC: 消息摘要码,单向加密的一种延伸类的应用
应用:用于实现在网络通信中保证所传输的数据的完整性
机制:
CBC-MAC
HMAC:使用md5或sha1算法
用户密码:passwd命令计算一个密钥的哈希值或者计算列表中的每个密钥的hash值
# openssl passwd -1 -salt SALT
注意:-1 用MD5基于BSD的密钥算法
生成随机数:
# openssl rand -base64|-hex num
eg:openssl passwd -1 -salt `openssl rand -hex 4`
1.4.4、公钥加密的openssl
算法:RSA, EIGamal
工具:gpg, openssl rsautl
数字签名:
算法:RSA, EIGamal, DSA
DSA: Digital Signature Algorithm
DSS: Digital Signature Standard
密钥交换:IKE
算法:公钥加密、DH
Diffie-Hellman
生成密钥:
# (umask 077; openssl genrsa -out /path/to/keyfile NUMBEROFBITS )
-out指定生成文件的,需要注意的是这个文件里包含了公钥和私钥两部分,也就是说这个文件即可以用来加密也可以用来解密。
eg:opessl genrsa -out rsa_pri.pem 1024
提出公钥:
# openssl rsa -in /path/from/private_key_file -pubout
二、openssl建立私有CA
2.1、建立私有CA总体流程
1、生成密钥
2、自签署证书
节点:
1、生成密钥对儿
2、生成证书签署请求
3、把请求发送给CA
CA:
1、验正请求者信息;
2、签署证书;
3、把签好的证书发送给请求者;
Openca
2.2、建立私有CA具体流程
2.2.1、建立CA服务器
2.2.1.1、生成密钥
公钥加密的算法
#(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
命令详解:
umask 077:保证秘钥文件其他人无读写权限,在()内执行,只对当前子shell有效
-out /path/to/somefile:指定生成秘钥位置
2048:秘钥长度,可自定义
#openssl rsa -in private /etc/pki/CA/private/cakey.pem -pubout -text //可提取公钥
2.2.1.2、自签证书
#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
req: 生成证书签署请求
-news: 新请求
-key /path/to/keyfile: 指定私钥文件
-out /path/to/somefile:
-x509: 生成自签署证书
-days n: 有效天数
2.2.1.3、初始化工作环境
# touch /etc/pki/CA/{index.txt,serial}
# echo 01 > /etc/pki/CA/serial
命令详解:
index.txt:证书缩影数据库
serial:签署证书编号文件
echo 01 > serial #设定编号初始值
2.2.2、节点申请证书
2.2.2.1、生成密钥对儿
我们给web服务生成请求用于https,在其配置文件目录创建用于保存私钥和证书的目录
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
2.2.2.2、生成证书签署请求
# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr
2.2.2.3、把签署请求文件发送给CA服务
# scp
eg:scp httpd.csr 172.11.100.7:/etc/pki/CA/csr/
2.2.3、CA签署证书
2.2.3.1、验正证书中的信息
2.2.3.2、签署证书
#openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days N
eg:#openssl ca -in /etc/pki/CA/csr/httpd.csr /etc/pki/CA/csr/httpd.crt -days 1000
2.2.3.3、发送给请求者
scp /etc/pki/CA/csr/httpd.crt 172.11.100.6:/etc/httpd/ssl
2.3、吊销证书
(一)节点
1、客户端获取证书serial
# openssl x509 -in /path/to/certificate_file.crt -noout -serial -subject
eg:openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
(二) CA
2、根据节点提交的serial和subject信息来验正与index.txt文件中的信息是否一致;
cat /etc/pki/CA/index.txt
3、吊销证书
#cd /etc/pki/CA/newcerts
#ls -ltr
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
4、生成吊销证书的编号(如果是第一次吊销)
# echo 00 > /etc/pki/CA/crlnumber
5、更新证书吊销列表
# cd /etc/pki/CA/crl/
# openssl ca -gencrl -out thisca.crl
如果需要,查看crl文件的内容:
# openssl crl -in /path/to/crlfile.crl -noout -text