OpenSSL
openssl命令:
查看帮助:给一个错误的命令就可以查看所有命令帮助。
查看软件版本:openssl version
标准命令: enc, ca, req, genrsa, ...
对称加密:
工具:openssl enc, gpg
支持的算法: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
-a表示64位文本文件,默认二进制文件,
单向加密:
工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
[root@yph7s ~]# md5sum fstab
12f17f09df2c25649fd28a59e49955da fstab
生成用户密码:
工具:passwd, openssl passwd
[root@yph7s ~]# whatis passwd
sslpasswd (1ssl) - compute password hashes
[root@yph7s ~]# man sslpasswd
openssl passwd -1 -salt SALT ---“-1”指md5
[root@yph7s ~]# openssl passwd -1 -salt 123456
Password:
$1$123456$QMBx42LRqK1ZWPfItmpYG0
生成随机数:
工具:openssl rand
[root@yph7s ~]# whatis rand
[root@yph7s ~]# man sslrand
~]# openssl rand -hex NUM ---16进制数字
[root@yph7s ~]# openssl rand -hex 10 -----10表示生出10位,
7347b0074352d7643192
~]# openssl rand -base64 NUM ---64为文本格式
[root@yph7s ~]# openssl rand -base64 10
xSIyOAD+K84dvQ== 最后的==属于标准输出,使用随机数时要去掉
公钥加密:
生成私钥:
[root@yph7s ~]# openssl genrsa 1024 >> private 1024位长度,必须是2^n位数
生成私钥: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
使用括号括起来的命令表示在子shell中执行,先设置umask,然后执行,完后退出子shell,对当前shell无影响
[root@yph7s ~]# (umask 077; openssl genrsa -out private2 2048)
umask 077是为了给私钥文件设置权限
提取公钥: ~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
[root@yph7s ~]# openssl rsa -in ./private -pubout -out ./public.key
Linux系统上的随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
伪随机数不安全;
熵池中随机数的来源:
硬盘IO中断时间间隔;
键盘IO中断时间间隔;敲键盘,复制数据
CA:
openssl配置文件:/etc/pki/tls/openssl.cnf
构建私有CA---以httpd为例:
CA服务机:cakey.pem私钥、cacert.pem自签证书、httpd.crt最终证书
客户机:httpd.key 客户机私钥、httpd.csr签署请求、httpd.crt最终证书
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;
CA主机:
(1) 生成私钥;
[root@yph7s ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
名字必须为cakey.pem
(2) 生成自签证书;
[root@yph7s ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655 ---只有作为CA主机时才会在此目录下创建
-new:生成新证书签署请求;
-x509:专用于创建私有CA时,生成自签格式证书;
-key:生成请求时用到的私有文件路径;
-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
Country Name (2 letter code) [XX]:CN -----国家的名字
State or Province Name (full name) []:BeiJing ------省份名字
Locality Name (eg, city) [Default City]:BeiJing -----城市名字
Organization Name (eg, company) [Default Company Ltd]:Alibaba ----公司名字
Organizational Unit Name (eg, section) []:ops --------部门名字
Common Name (eg, your name or your server's hostname) []:a.com ----主机名
Email Address []:[email protected] -----管理员邮件地址
(3) 为CA提供所需的目录及文件;CA服务器
[root@yph7s ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
[root@yph7s ~]# touch /etc/pki/CA/{serial,index.txt}
[root@yph7s ~]# echo 01 > /etc/pki/CA/serial -----序列号
等把CA客户的请求拷过来后
[root@yph7s ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365--为申请授权签证
[root@yph7s ~]# cat /etc/pki/CA/index.txt
V170116191737Z01unknown/C=CN/ST=BeiJing/O=Alibaba/OU=p\x08ops/CN=www.magedu.com/emailAddress=webadmin @magedu.com
[root@yph7s ~]# scp /etc/pki/CA/certs/httpd.crt [email protected]:/etc/httpd/ssl/ ---将证书发给请求者
然后把httpd.csr删掉,避免泄露
服务机都可以看证书信息
[root@yph7s ~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=beijing/O=alibaba/OU=sho/CN=www.magedu.com/[email protected]
CA客户机:
(1) 用到证书的主机生成私钥;
[root@localhost ~]# mkdir /etc/httpd/ssl
[root@localhost ~]# cd /etc/httpd/ssl
生成私钥:
[root@localhost ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
(2) 生成证书签署请求
[root@localhost ssl]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
Locality Name (eg, city) [Default City]:BeiJing -----一定要与主机CA在同一域,同一单位,应该是公司保持一致
Organization Name (eg, company) [Default Company Ltd]:Alibaba ----公司名字,
Common Name (eg, your name or your server's hostname) []:www.magedu.com ----一定与客户端访问的名字一致
(3) 将请求通过可靠方式发送给CA主机;
[root@localhost ssl]# scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/
一般是不能通过网络发送的,应该是CA派人拷贝走
客户机查看证书中的信息:
[root@localhost ssl]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=beijing/O=alibaba/OU=sho/CN=www.magedu.com/[email protected]
CA吊销证书:一般会自动吊销,不用我们手动吊销,只需了解就行。openca是常用吊销命令,不是这个,
步骤:
(1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
吊销:
# openssl ca -revoke /etc/pki/CA/newcerts/##.pem ---证书序列号
(3) 生成吊销证书的吊销编号(第一次吊销证书时执行) ---服务器第一次吊销时,再吊销第二个人就不了
# echo 01 > /etc/pki/CA/crlnumber
(4) 更新证书吊销列表
# openssl ca -gencrl -out thisca.crl
查看crl文件:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
加密类型:
对称加密:加密和解密使用同一个密钥;
公钥加密:密钥分为公钥与私钥
公钥:从私钥中提取产生;可公开给所有人;pubkey
私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key;
特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
用途:
数字签名:发送方用私钥加密数据数据特征码的结果。主要在于让接收方确认发送方的身份;确认来源合法性
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
数据加密:安全性很低,一般不用
单向加密:即提出数据指纹;只能加密,不能解密;
特性:定长输出、雪崩效应;
功能:完整性验证;
算法:
md5:Message Digest 5, 128bits
sha1:Secure Hash Algorithm 1, 160bits 安全的哈希算法
sha224, sha256, sha384, sha512
密钥交换: IKE(Internet Key Exchange)互联网秘钥交换
公钥加密
密码本身不用在互联网传输,所有比较安全
DH(Deffie-Hellman)地狱男爵
A:p, g --用生成器生成非常大的质数,这两个是公开的
B:p, g
A:生成 x ---只有自己知道
然后计算S1= p^x%g
把S1给B
B:生成 y----y只有B知道
计算-S2=p^y%g
把S2给A
A再计算:S3 =S2^x
B再计算: S4=S1^y
(p^y%g)^x=(p^x%g)^y 即S3=S4,S3和S4就是二人的秘钥
外人只最多窃取p,g,S1和S2,但计算不出x和y,因为数太大非常困难,在数学界都是难题
加密具体流程:
Alice:
(1)Alice用单向加密MD5等计算出数据特征码
(2)然后用自己的秘钥加密特征码,生成数字签名
(3)把数字签名附加到数据后面----------确保完整性和来源合法性。
(4)Alice用一次性秘钥结合对称加密算法加密数据和数字签名,生成一个对称加密的解密密钥
(5)再拿jack的的公钥加密这个对称加密的解密密钥
jack:
(6)jack拿自己的私钥解密,从而拿到对称加密的解密密钥
(7)jack拿对称加密的解密密钥,进行解密操作后,就得到了数据和数字签名
(8)拿Alice公钥配对,验证来源合法性
(9)用相同的单向加密计算数据的特征码,与配对数字签名后得到的特征码是否一致,从而验证数据完整性。
但是Alice和jack如何拿到对方的公钥,网上直接传输很危险,如果公钥被劫持,悄悄替换成间谍的公钥了呢
CA是个大家都认可的平台,大家都信任CA,通过CA传输公钥
如何知道你拿到的CA证书不是假的呢,CA一般都是当面交易的,不会被劫持。正版windows系统内置的有CA证书,盗版就不一定了。
用CA的公钥解密CA证书,再用定向加密计算并比较证书特征码。看证书的有限期,看主题名称是否一致,看证书是否被吊销
CA证书是自己给自己发的,
PKI:Public Key Infrastructure公钥基础设施:
签证机构:CA ---商水县公安局,但使用范围是全国
注册机构:RA ---袁老乡派出所
证书吊销列表:CRL ----公钥丢失,申请吊销
证书存取库:
X.509v3:定义了证书的结构以及认证协议标准
版本号 -----身份证二代
序列号 ----隐藏
签名算法ID
发行者名称
有效期限
主体名称 --姓名
主体公钥
发行者的惟一标识 ----商水县公安局的id
主体的惟一标识 ----身份证号
扩展
发行者的签名
SSL会话主要三步:
1、客户端向服务器端索要并验正证书(公钥);(支付宝,网银等服务器也会向客户端索要证书)
2、双方协商生成“会话密钥”;---对称加密和解密用同一个秘钥
3、双方采用“会话密钥”进行加密通信;
SSL 握手四步走
第一阶段:客户端ClientHello:发出加密通信请求
客户端发送自己支持的协议版本,比如tls 1.2;
客户端生成一个随机数,稍后用户生成“一次性会话密钥”
客户端发送自己支持的加密算法,比如AES、3DES、RSA;
客户端发送自己支持的压缩算法;
第二阶段:服务器端ServerHello,服务器的回应
服务器确认双方都支持的加密通信协议版本,比如tls 1.2;如果协议版本不同就拒接服务
服务器端生成一个随机数,稍后用于生成“一次性会话密钥”
服务器确认双方都支持的加密方法;
服务器发送自己的证书;
(服务器所有客户端证书,一般网站不会验证)
第三阶段:客户端
验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者(必须与域名一致)、证书有效期、吊销列表)
发送以下信息给服务器端:
一个随机数(第二个);用于服务器公钥解密
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
客户端握手结束通知;
第四阶段:服务器端
收到客户端第二次发来的随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
向客户端发送如下信息:
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务端握手结束通知;