史上最详细的Openssl搭建及ssl原理解析

一、SSL:secure sokets layer(安全套接字层)

1.套接字的概念

两个主机通信时,其实本质上也就是两个进程之间的通信,而进程通信当然需要标记,所以就用端口号与IP地址的组合称为套接字,这样就很容易理解了。

SSL的概念

SSL是在TCP/IP模型的应用层与传输层之间加上半层的SSL公共通用模块,调用这个模块http将会变成https。
图中的黄线,表示没有调用ssl模块时的情况,红线代表调用ssl模块的情况,经过ssl时服务器端会使用算法对数据进行加密,并进行身份认证,使客户端访问服务器时更加安全。
在这里插入图片描述

二、SSL保证的目标与防范的攻击

保密性confidentiality

目标: 对数据的保密性,使用算法对数据进行加密,保证数据传输时即时被其他黑客拦截到也不知道真实信息
典型攻击: 窃听,对通信量进行分析

完整性integrity

目标: 使用单向加密算法生成特征码,来保证数据的完整性
典型攻击: 更改(对数据进行更改)、伪装(通过IP伪装接收端)、重放(第三方截取数据后虽然不知道其内容是什么,但是会知道有什么作用,可以一直重复的发给接收方,接收方误以为是发送方端的数据,会一直接收)、否认(下订单却否认没下订单)

可用性availability

目标: 保证数据的可用性,保证数据到达接收放依然是可用的
典型攻击: 拒绝服务(DOS)利用TCP的漏洞,一直在与服务器发起TCP连接请求,但是连接后又会断开,这样就造成了服务器的资源浪费、分布式拒绝攻击(DDOS)第三方通过在网络上抓取肉机,一起对服务器发起DOS攻击,如果肉机数量过多,有可能会造成服务器的崩溃

三、解决方案

技术(加密或解密)、服务(用于抵御攻击的服务,也是为了上述安全目标设计的安全服务)

1.加密或解密

传统加密方法:替换加密方法、置换加密方法
现代加密方法:现代块加密方法(将数据进行分块通过算法进行逐个加密)

2.服务

认证机制:通过CA或者身份验证进行访问
访问控制机制:没有通过的不允许访问或者设置允许访问的条件

3.密钥算法和协议

对称加密、单向加密、认证协议

四、openssl介绍

1.简介

一款开源的加密软件,基于ssl/tls协议,实现密钥证书管理、对称加密、非对称加密等
ssl协议:Netscape(网景公司)在1994年颁发的。
tls协议:国际电子工程师协会在1999年发布的。

2.组成

libencrypt:加密解密库,用于实现加密和解密的库。
libssl:实现ssl安全通信机制的库。
openssl:多用途命令行工具。

五、密钥算法和协议

1.对称加密

概述
特性:会将原始数据分割成固定的块,来逐个使用相同的密钥进行加密,传输到对端后使用相同的密钥进行解密。
缺点:密钥过多,因为每次与用户传输都要生成一个只属于该用户的密钥来进行通信,密钥分发困难,因为密钥没有办法传输。
算法:
DES(数据加密标准):56位密钥,现在已经被破解了。
3DES:将原先的DES加密三次。
AES(先进加密标准):最新版的加密算法,192、256位密钥
等…

在这里插入图片描述

2.公钥加密技术

概述
将密钥分为公钥和私钥,首先发送方向接收方索要公钥,接收方生成私钥再从私钥中提取公钥后发送给发送方,发送方接收到公钥后使用该公钥加密要发送的数据发送给接收方,接收方再使用自己的私钥来进行解密。(使用公钥加密的数据必须使用与之对应的私钥来进行解密)
公钥:公钥通过在私钥中提取出来,可以公开给所有人,pubkey;
私钥:通过工具来创建,使用者自己留存,必须保证私钥的安全性,secret key;
用途
数字签名:发送方使用自己的私钥在证书上进行签名,这样其他人使用公钥解密时会验证发送方的身份。
密钥交换:发送方用对方的公钥加密一个对称密钥发送给对方,这样就可以保证密钥的传输安全性了。
算法
RSA(可以加密、解密也可以进行数字签名)、DSA(可以加密但是不能解密所以只能作为数字签名)

3.单向加密

概述
只能进行加密,但是不能解密,在原始数据中使用算法提取定长特征码。
特性
定长输出:用户会自定一个特征码长度然后进行特征码提取。
雪崩效应:因为是使用算法在数据内提取定长的特征码,所以其中特征码一旦丢失一位则不能通过验证。
功能
由于其定长输出和雪崩效应的特性,所以通常用于数据完整性验证。
算法
md5、sha、sha224、sha256等…

六、IKE密钥交换详解

1.基于公钥加密的对称加密传输

1)加密发送数据过程

第一步:Alice生成数据,并使用单向加密算法计算出这段数据的特征码
第二步:Alice使用自己的私钥加密这段特征码,并将结果附加在数据后面,生成数字签名
第三步:Alice生成一个临时的对称密钥并加密这整段数据和特征码
第四步:Alice获取Bob的公钥并使用Bob公钥加密这整段数据
在这里插入图片描述

2)解密过程

第一步:Bob获取到数据包后,首先使用自己的私钥解密Alice使用自己的公钥加密
第二步:使用对称密钥解密整段加密的内容
第三步:再使用Alice的公钥解密特征码,使Alice的身份得到验证(数字签名)
第四步:Bob使用相同的单向算法计算这一段数据,并对照Alice发送过来的特征码,如果一致则接收数据,如果不一致则表名该数据已经被人篡改过会丢弃数据(验证数据的完整性)
在这里插入图片描述

3)基于公钥加密的对称加密Bug(中间人攻击)

第一步:Eve中间人假说自己是Bob并将自己的公钥发送给Alice
第二步:接收Alice发送过来的数据包,查看并发送给Bob,并假说自己是Alice
第三步:这样Bob就以为是在跟Alice通信,而Alice也就以为自己在跟Bob通信
在这里插入图片描述

3.DH算法

第一步:Bob生成p、g Alice生成p、g
第二步:Bob生成x,并生成计算p^x%g发送给Alice
Alice生成y,并计算p^y%g发送给Bob
第三步:Bob将接受的数据再加y平方p^xy%g
Alice将接受的数据再加x平方p^xy%g
#至此双方密钥交换完成,最后算法式子都为相同的

七、中间人攻击的终结者PKI(公钥基础设施)

1.组成

签证机构CA:负责证书的签发
注册机构CR:证书注册的接待窗口
证书吊销列表CRL:证书吊销或私钥丢失后会添加一条证书失效条目到CRL列表中
证书存取库:签发的证书都在这里,每次颁发证书时都会添加一条条目到存取库中

2.证书的内容

x.509v3:定义了证书结构以及证书协议的认证标准
版本号:v1、v2还是v3
序列号:从01开始的序列号,代表第几个证书
签名算法ID:签名时使用的算法
发行者名称:CA的名称
有效期限:证书有效期
主体名称:个人的名字
主体公钥:
发行者的唯一标识:标识号,CA的标识号,颁发者的唯一标识
主体的唯一标识:标识号,主体的标识号,拥有者的唯一标识
发行者的签名:将上述的所有内容发行者通过单向加密计算出特征码然后用自己的私钥加密特征码生成发行者签名,用来做发行者的身份验证

3.证书的颁发步骤

Alice首先将自己的公钥发送给CA,CA使用特殊的技术做防伪标识并将认证的公钥再发送回Alice,完成证书认证。
在这里插入图片描述

4.使用证书通信步骤

第一步:CA首先将自己的数字签名发放出去,以证明自己CA的身份
第二步:双方商量算法、对称加密、公钥加密和密钥交换的算法,并查看对方的证书认证CA是否是自己信任的CA
第三步:Bob收到Alice的数据包后首先会使用CA的公钥来解密证书中的发行者签名,来验证Alice的证书可靠来源,用同样的单向加密特征码验证证书的完整性
第四步:检车有效日期和主题名称,检查证书吊销列表
在这里插入图片描述

八、openssl的应用

1.ssl与tls的分层设计

最顶层

2.对称加密实现

加密文件:fstab
[root@localhost ~] openssl enc -e -des3 -a -salt -in /etc/fstab -out /media/fstab.text
#-e:加密
#-des3:使用的是des3算法进行加密的
#可以使用的算法有很多可以使用“openssl enc?”这条命令来查看
#-a:使用bash64格式显示
#-salt:加密时增加盐可以增加加密的复杂度,但缺点是盐如果相同则加密结果也相同
#-in:需要加密的文件
#-out:将加密文件输出到的路径和文件名
	enter des-ede3-cbc encryption password:
	Verifying - enter des-ede3-cbc encryption password:
#输入加密密码,这个密码需要在解密时使用

[root@localhost ~] cd /media/
[root@localhost media] cat fstab.text
	U2FsdGVkX1+m7MJ8EILz2qbudiV9xe9sjeFFmzEI2h1KQ4W6Q+wm1fsX2orW1gZ6
	jCuBMHO4A/lrRdm9Xwkw9XXhWJ+SM4kkLOM8ua0boFUOiv+l1eIQGHgzF71Dd4xg
	ypHtnb3tzvZvZfOgXUhVR2towe+DQk/Kcnmk0giBBprNLVp1XETQuxVSldge4+Rx
	XVhdqWXbul4QiV3xi9SoRQq8bh00krDbx1HtpqdTk3v5JKDev+et+zXN5GC7oBtr
	ZeObQ4pHVXHV3uxe6iCj2OwqNhfoRoFLEMAZev0T7414gbA/pClUOqHXzMV0aKWc
	AiD0NCN8aeBoyvtH9H381PNH/bqX38IQBkuHIlC1VJBkiyR8X5mBXkcWNehrH1YA
	/Rj2nIAwh6M=
#生成的文件

解密文件:fstab.text
[root@localhost media] openssl enc -d -des3 -a -salt -out /media/fstab -in /media/fstab.text
#-d:解密文件

enter des-ede3-cbc decryption password:
#输入刚才的加密密码

[root@localhost media] cat fstab
	#
	# /etc/fstab
	# Created by anaconda on Thu Nov 28 23:33:10 2019
	#
	# Accessible filesystems, by reference, are maintained under '/dev/disk'# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
	#
	/dev/mapper/centos-root /                       xfs     defaults        0 0
	UUID=294503a5-a82e-427a-a89d-35059beabf61 /boot                   xfs     defaults        0 0
	/dev/mapper/centos-swap swap                    swap    defaults        0 0

3.单向加密的实现(特征码)

#计算fstab.text的特征码
[root@localhost media] openssl dgst -md5 /media/fstab.text
	MD5(/media/fstab.text)= 72f7db27a52382af04974d7b6e8e1638
#-md5:使用md5算法来进行计算

4.生成用户加密密码

#生成用户的加密密码
[root@localhost ~] openssl passwd -1 -salt 12345
Password:	#输入要设置的密码
$1$12345$A7Krl2STMc2/TPiam.CTU1
#生成的加密密码可直接加入到shadow文件中
#-1:使用md5算法进行加密
#-salt:加盐,使密码更加复杂,12345不是设置的密码,只是加的盐

5.生成随机数

linux中的随机数解释

  1. /dev/random:仅从熵池中获取随机数,熵池随机数耗尽后,阻塞;
  2. /dev/urandom:从熵池中获取随机数,熵池随机数耗尽后,再通过软件来生成随机数,不阻塞;但是软件生成的随机数有可能会相同所以不安全
  3. 熵池:是描述系统混乱不堪的物理量,熵池越大表示系统运行的越混乱,有序性越差
  4. 熵池中随机数的来源:硬盘IO中断的时间间隔,键盘IO中断的时间间隔
[root@localhost ~] openssl rand -hex 1024
#hex编码进行生成的1024位的随机数,hex编码是64位的
[root@localhost ~] openssl rand -base64 1024
#使用base64编码生成的1024位随机数

6.生成用户密码与随机数结合

[root@localhost ~] openssl passwd -1 -salt $(openssl rand -base64 4)
Password:
$1$+xPRiA==$HH9ta9lNHbyPVD3m.lh/U0
#通过随机数加的盐生成用户的加密密码

[root@localhost ~] openssl passwd -1 -salt +xPRiA==
Password:
$1$+xPRiA==$HH9ta9lNHbyPVD3m.lh/U0
#使用相同的盐再来生成一个加密密码,可以看到盐一样生成的加密密码也是相同的

7、生成密钥

生成私钥
[root@localhost ~] (umask 077;openssl genrsa -out /bak/key 1024)
#带上小括号表示这段命令在子进程shell中执行,原本shell不受影响
#genrsa:使用rsa进行计算私钥
#-out:密钥输出路径
#1024:1024位的私钥
[root@localhost ~] cat /bak/key
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQD2SgMOWAyXyuHntfU50YILSwQd63yhONyjzn1tXc+QhxNq9Aoy
......==
-----END RSA PRIVATE KEY-----

生成公钥
[root@localhost ~] openssl rsa -in /bak/key -pubout
writing RSA key
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2SgMOWAyXyuHntfU50YILSwQd
63yhONyjzn1tXc+QhxNq9Aoy0eHHMvRo39eJMYi+Aw+xH0j35q5jvOyIAIi0e1Xq
LT+XMahXx1ZslmOwHz8TyGSxO+gIAeW8+QXJk0QceT6AjfyegUnZAe3NZ0EMviFK
CJkjcx0F3D/DhH9mjQIDAQAB
#在私钥中提取的公钥
#-pubout:展示为文本格式的公钥

九、搭建私有CA

1.查看配置文件

[root@localhost ~] cat /etc/pki/tls/openssl.cnf
#文件中有很多内容,这里就只介绍一些重要的
#此文件是openssl的配置文件
.......
	####################################################################
	[ CA_default ]
	
	dir             = /etc/pki/CA           # 以下内容都属于这个文件
	crlnumber       = $dir/crlnumber        # 吊销证书的序列号crl
	crl             = $dir/crl.pem          # 存储被吊销的crl证书
	RANDFILE        = $dir/private/.rand    # 证书密钥存储目录
	
	x509_extensions = usr_cert              # 证书的扩展内容
	
	name_opt        = ca_default            # 主体名称
	cert_opt        = ca_default            # 证书的证明
	
	# copy_extensions = copy
	
	# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
	# crlnumber must also be commented out to leave a V1 CRL.
	# crl_extensions        = crl_ext
	
	default_days    = 365                   # 证书默认的有效期
	preserve        = no                    # keep passed DN ordering
......

2.构建私有CA

在确定配置CA生成一个自签证书,并为CA提供一个需要的目录或文件即可。

1.准备工作
[root@localhost ~] mkdir -pv /etc/pki/CA/{cert,crl,newcerts}
#cert:证书存放目录
#crl:吊销证书存放位置
#newcerts:新建证书存放位置
[root@localhost ~] touch /etc/pki/CA/{serial,index.txt}
#serial:证书的序列号存放文件
[root@localhost ~] echo 01 > /etc/pki/CA/serial
#输入证书起始序列号01

2.生成私钥
[root@localhost ~] (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
#生成2048位的密钥

3.生成自签证书
#当指定私钥进行签署证书时,系统会自动在私钥中提取出公钥,其实是用公钥来签署的证书(注意!!!)
[root@localhost ~] openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
#-new:生成新证书的签署请求
#-x509:生成自签格式的证书
#-key:指定私钥地址
#-out:签署证书的存放路径
#-days:指定证书有效天数
	You are about to be asked to enter information that will be incorporated
	If you enter '.', the field will be left blank.
	-----
	Country Name (2 letter code) [XX]:	#国家名
	State or Province Name (full name) []:	#省名
	Locality Name (eg, city) [Default City]:	#市名
	Organization Name (eg, company) [Default Company Ltd]:	#组织名
	Organizational Unit Name (eg, section) []:	#部门名
	Common Name (eg, your name or your server‘s hostname) []:	#主机名或服务器名
	Email Address []:	#管理员邮箱地址
[root@localhost ~] cat /etc/pki/CA/newcerts/01.pem 
#证书签署后就可以在CA目录下查看到新签署的证书

4.客户端生成私钥
#新开启一台终端作为CA服务器的客户端,并生成私钥
[root@localhost ~] mkdir /etc/httpd/ssl
[root@localhost ~] (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 1024)
	Generating RSA private key, 1024 bit long modulus
[root@localhost ~] cat /etc/httpd/ssl/httpd.key

5.客户端生成证书签署请求
[root@localhost ~] openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
-----
#输入的内容要与证书服务器的信息一致
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:
Email Address []:

6.客户端将请求通过可靠的方式传输给CA服务器
#这里使用scp将客户端的签署证书请求发送给了服务器端
[root@localhost ~] scp /etc/httpd/ssl/httpd.csr 10.0.0.1:/media/
root@10.0.0.1's password:
httpd.csr                                                                      100%  651     0.6KB/s   00:00

7.在CA服务器签署证书
[root@localhost CA] openssl ca -in /media/httpd.csr -out /etc/pki/CA/cert/httpd.crt -days 365
#签署证书
[root@localhost CA] openssl x509 -in /etc/pki/CA/cert/httpd.crt -noout -serial -subject
#查看证书内容
[root@localhost CA] scp /etc/pki/CA/cert/httpd.crt 10.0.0.2:/etc/httpd/ssl
#将证书传送回客户端

8.在服务器端吊销证书
1)在客户端获取吊销证书的serial
[root@localhost ~] openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
serial=01		#数值为01
2)在CA服务器上吊销证书
#根据客户端提供的serial来对比CA服务上的index.txt的信息是否一致
[root@localhost CA] cat /etc/pki/CA/index.txt
3)在newcerts中吊销证书的存档
[root@localhost CA] openssl ca -revoke /etc/pki/CA/newcerts/01.pem
4)生成吊销证书的编号
#只是第一次吊销证书时使用,创建记录吊销证书编号的文件
[root@localhost ~] echo 01 > /etc/pki/CA/crlnumber
5)更新证书吊销列表
[root@localhost ~] openssl ca -gencrl -out /etc/pki/CA/crl/thisca.crl
6)查看crl文件
[root@localhost ~] openssl crl -in /etc/pki/CA/crl/thisca.crl -noout -text
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值