OpenSSL

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后,计算生成本次会话所有到的“会话密钥”;

向客户端发送如下信息:

编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

服务端握手结束通知;

 


你可能感兴趣的:(OpenSSL)