Openssl安全与认证
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Openssl安全与认证相关的知识,希望对你有一定的参考价值。
SSL :secure socketslayer 安全的套接字层。这是网井公司为了给httpd传输协议加密在应用层和传输层加了一层库,实现传输加密用的,这个库能够在写程序的时候,调用这个库,完成加密解密功能,能帮着完成秘钥分发功能;如果不调用也可以正常的时候只使用httpd不进行加密,所以这个是公用的一个库。
http协议调用了SSL,则成为https。但是httpd和https在实现机制上差别非常大
通信安全的目标:
保密性:确保任何无关的第三方看到confidentiality
完整性:通信双方在通信过程中,整个报文不能产生信息丢失,一旦丢失要让接收人知道 integrity (分系统完整和通信完整)
可用性:加密后,让对方能够看到看懂 availablity
攻击类型:
威胁保密性的攻击:窃听、通信量分析
威胁完整性的攻击:更改、伪装、重放、否认
威胁可用性的攻击:拒绝服务(DoS)
解决方案
技术:加密和解密
服务(用来抵御攻击的服务,为了实现上述安全目标而特地设计的服务)
加密和解密:
传统加密方法:
替代加密算法
置换加密方法
现代加密方法:
现代块加密算法
服务:
认证机制
访问控制机制
秘钥算法和协议(用来实现秘钥的算法和相关协议,怎么交换秘钥)
对称加密 用于数据加密(保密性)
非对称加密(公钥加密),用于身份认证、秘钥交换,(但是数据加密可有不怎么用,比对称加密慢3个数量级)
单项加密 保证数据的完整性,一般是对数据求特征码
认证协议 秘钥交换协议常用DH,rsa
linux在系统上面为了实现安全有两个:OpenSSL(ssl) ,GPG(pgp)
OpenSSL 有三部分组成:
提供加密解密库,libencrpt库,专用于加密解密
实现SSL安全通信机制的库,libssl库
openssl多用途命令行工具
加密的算法和协议:
对称加密:
DES:date encryption standard,2003年就被破解
3DES:triple DES (3轮DES加密机制)以前的1000倍,
AES:advanced encryption standard 高级加密标准,安全程度很高(支持128bits,192位,256位,384位)
Blowfish
Twofish
IDEA
RC6
CAST5
对称加密特性:
1.加密和解密使用同一个秘钥,加密和解密算法可能不同
2.将原始数据分割为固定大小的块,逐个加密
对称加密的缺陷:
1.秘钥过多(服务器端与每个用户都是用一个专用的秘钥,用户一多,秘钥也就多了,秘钥相同,数据可被查看)
2.秘钥分发困难(秘钥交换算法)
3.无法实现数据来源确认
公钥加密:秘钥分为公钥和私钥 (加密工具是用公钥,解密工具使用私钥)
公钥:公开给所有人,pubkey,公钥是从私钥中提取出来的
私钥:通过工具创建,使用者自己留存,必须保证其私密性:secret key
公钥加密的算法:
RSA 即能签名又能加密
DSA Digital Signature Standard 只能用于签名,不能用于加密解密 有时又叫DSS数字签名标准
ELGamal 数字签名算法
公钥加密特点:
用公钥加密的数据只能使用与之配对的私钥解密;用私钥加密的数据只有与之配对的公钥才能解密
公钥加密用途:
数字签名 主要让接受方确认发送方的身份
秘钥交换 发送方用对方的公钥加密一个对称秘钥,并发送给对方,以实现秘钥交换
数据加密(这个功能比较少用)
公钥加密的缺点:
不适合加密大数据,只适合小数据,(公钥解密耗费的时间比对称加密要费时500倍)
公钥加密数据的流程:
1.用户通过服务器给的公钥加密数据,发送给服务器;
2.服务器收到加密的数据后,用自己的私钥解密,解密成功则予以响应;
3.服务器通过单项加密对用户请求的数据求出特征码(这里使用了对称加密)
并用自己的私钥加密这个特征码,形成签名
服务器把(数据和数字签名)通过临时生成的秘钥,进行对称加密
之后用客户端的公钥生加密这个秘钥,并附加到这段数据加密后的后面,
4.用户收到数据后,先用自己的私钥解密“附属在最后面的(对称加密的秘钥)”,解密成功则是自己的,这个过程就是秘钥交换,这个时候客户端得到临时加密时的秘钥口令
5.之后客户端拿着秘钥口令解密(数据和数字签名)外面的对称加密层,解密成功说明是服务器发送的文件(也是自己请求的数据),完成保密性
6.之后客户端还要通过相同的加密算法单项加密数据生成一个特征码,这个特征码如果根服务器发送过来的解密后的特征码相同,则证明数据没有被篡改过,验证数据完整性成功,数据传输完成,完成完整性
通过这种方式,完成了完整性和保密性,同时完成了身份验证
不足,因为有的时候客户端可服务器端从来没交流过,需要互传公钥文件,但是这个时候可能会出现中间人,模拟两段通信,对着服务器端说我是客户端,对着客户端说我是服务器端,这样就不安全,这个家伙成了中间代理人,所有数据都要经过它,甚至它都可以进行修改,为了解决这个问题出现了CA
CA:为了保证通信双方都能口可靠的拿到对方的公钥,一种可靠的机制。
把公钥发送给CA机构,CA机构处理后给服务端,服务端把证书发送给客户端,并继续用自己的私钥加密数据后传输
在用户与服务之间通信,是怎样利用CA工作的:
客户端在接受数据前,首先拿到CA颁发机构的公钥:
之后用这个CA公钥解密服务器证书的数字签名,能解密说明证书来源可靠;
用同样的单向加密去计算数据得出特征码,之后与解密证书数字签名得到的附加的特征码比较,一样则证书完整性可靠;
之后检查证书的有效期限
验证要通信的对象的名字是否与证书一致
检查证书是否已经被吊销,没有吊销才能使用
CA把自己的公钥要提请给每一个人,CA先给自己发证,包含了CA自己信息和公钥,服务端只有拿到CA的证书才能够解密CA颁发给服务器证书,验证信息是否正确,验证证书是否正常
一个第三段冒充服务器端去向CA申请服务器端,怎么办?
一般证书办法机构会进行严格审核,这一块儿不太能成为问题
怎么能够可靠获得CA的公钥证书(用这个去解密CA颁发的公钥证书)
CA要本地交易,很少通过网络传输
那需要CA认证的这么多,怎么才能一一的去颁发呢?
首先有根CA,之后关联众多CA证书颁发机构公司,且CA的信任是可以传递的,且全球CA机构是有限的,且存在从属关系
CA给了微软一份,操作系统里面自带CA证书,且证书可信,(盗版除外)
不过证书想要伪装是非常难的
Linux上面是要自己手动加载CA的
如果私钥丢失,要向CA机构申请吊销证书,减少危害
单向加密:
只能加密,不能解密,提取数据指纹(提取特征码)
特性:定长输出,雪崩效应
功能:数据完成性校验
算法:
md5 : message digest 5 128bits
sha1 : secure hash algorithm1 160bits 定长输出
sha224, sha256, sha512
秘钥交换: (和单项加密相关)
IKE internet key exchange 互联网秘钥交换
常见实现方式(两种):
公钥加密
DH算法 (deffie-hellman) ECDH(椭圆曲线DH) ECDHE(临时椭圆曲线DH)
一般更倾向于使用DH,原因:使用公钥加密是在网上要传输密码的,虽然加密了,但是仍可以被暴力破解;而DH算法不用让密码在互联网上传送,能够更加安全。
vDH:
主机A和B通信
1、两个主机进行协商
A: a,p协商生成公开的整数a,大素数p
B: a,p
2、两主机各自根据数进行计算,并交换
A: 生成隐私数据:x (x<p),计算得出a^x%p(取模),发送给B
B: 生成隐私数据:y, (y<p) 计算得出a^y%p(取模),发送给A
3、解密
A:计算得出(a^y%p)^x = a^xy%p,生成为密钥
B:计算得出(a^x%p)^y = a^xy%p, 生成为密钥
在这个过程中其他用户可以看到,p,a,也能够看到取模后的值,但是这个过程反算x或y非常困难,从而达到加密目的
上面的图我们虽然说是非对称加密的流程,但是我们可以看的出,图中的流程包含了4个加密的组合才完成了安全的数据传输,而在这个过程最重要的过程就是CA的认证过程,那下面我们就来搭建一下数据库
PKI:public keyinfrastructure 公钥基础设施
签发机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:这里是公钥存取的位置,任何人都可以下载
以上几个组件是维护CA认证系统正常运行的重要组件
数字证书:
最常用的数字证书:x509v3目前比较通行的版本 ,(这是国际标准组织定义的)v3是目前用的比较多的
证书格式的版本号
序列号 (已经发了多少个)
签名算法
发行者名称 (证书颁发者CA自己的信息,CA组织的名称,地址等
有效期
主体名称 持有者的名称 人或者机器名称,持有者的名称
在互联网访问时,https://www.zou.com/ 这个路径名称和服务器证书持有者的名称要保持一致,否则证书不可信
主体公钥 持有者的公钥(持有者把自己的公钥发送给CA机构制作的,这个位置就是放的发送过来的公钥)
发行者的唯一标识 CA的id
主体的唯一标识 持有者的id
扩展信息
证书的基本约束
使用策略
密钥的使用限制
发行者的签名 CA数字签名(首先CA机构会把上面的所有信息进行单向加密的出特征码,之后会拿CA自己的私钥加密刚才单向加密的特征码,从而形成数字签名并附加在后面,用来生成发行者的签名)
基于SSL的通信:
SSL握手所做的的工作(主要有三步):
客户端向服务气短索要并验证证书
双方协商生成“会话密钥”
双方采用“会话密钥”进行加密通信
SSL handshake Protocol 的工作流程(分为4个阶段)
第一阶段:clientHello
客户端与对方发送Hello,发送随机谁,发送加密请求,向服务器发送自己所支持的协议版本,比如tls1.2
客户端生成一个随机数,稍后用互生成“会话秘钥”
客户端说明自己支持的加密算法,比如AES、RSA
客户端说名支持的压缩算法
第二阶段:serverHello
服务器开始回应,也发送hello,与随机数
服务器确认使用的加密通信协议版本,比如tls1.2,如果服务器端不支持客户端的协议版本,则byebye,断开
服务器端生成一个随机数,稍后用于生成“会话秘钥”
服务器发送自己的证书
第三阶段:
客户端验证服务器端证书,确认无误后取出其公钥 (两端互相发证书,并对两端进行身份验证是理论验证,(初加密狗,网银验证外))
发送以下信息给服务端:
一个随机数,用于加密 (这些随机数来来回回,混合在一起就成了没有规律的随机数了)
编码变更通知,随后信息都将用商定的算法加密和秘钥发送
客户端握手结束通知
第四阶段:
收到客户端发来的第二个随机数 (在会话中总共是第三个),计算生成本次会话所用到的“会话秘钥”
向客户端发送如下信息:
编码变更通知,随后发送的信息都是通过协商的加密方法和秘钥发送
服务器端握手结束通知
openssl 命令
子命令分为3类:
标准命令
消息摘要命令(dgest子命令)
加密命令(enc子命令)
[[email protected] ~]# openssl version OpenSSL 1.0.1e-fips 11 Feb 2013 版本号,现在最新的官网应该是1.1 [[email protected] ~]# openssl ? 后面给一个错误的参数,之后会显示帮助信息,(某人没有-h选项) openssl:Error: ‘?‘ is an invalid command. Standard commands ca rand enc dgest genrsa gendsa version x509 ..........省略 Message Digest commands消息摘要命令 (see the `dgst‘ command for more details) 后面为dest支持的算法 md2 md4 md5 rmd160 sha sha1 Cipher commands 加密命令 (see the `enc‘ command for more details) 下面显示的是enc所支持的算法 aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb base64 bf ......省略 zlib |
标准命令使用比较多的:
enc 和加密相关
ca 和ca相关
req 生成证书签署请求的
genrsa 生成rsa算法秘钥对
使用openssl完成对称加密:
工具:openssl enc ,gpg
支持算法:3des, aes, twofish, blowfish ,
查看使用enc帮助信息:man enc
-e 加密
-des3 这里是按照des3算法加密 (使用什么算法可以在enc下面的子命令去查看,算法有很多)
-d 解密
-a 使用base64位编码格式(如果不编码则使用二进制格式的编码)
-salt 加些盐
-in FILE_NAME 加密这个指定的文件
-out file_Name 加密后文件的名字
[[email protected] mnt]# cp /etc/fstab . [[email protected] mnt]#openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher 加密 enter des-ede3-cbc encryption password: 输入加密密码 Verifying - enter des-ede3-cbc encryption password: 再次输入加密密码 [[email protected] mnt]# ls fstab fstab.cipher [[email protected] mnt]# cat fstab.cipher U2FsdGVkX1+LdtZGW/Raaa+eNHYzuugjGQvBsIXe3BwSDs27DeX67GeXFn0rskjA 66gruhac5fkEwC8mqTgL5PbGEMi292ofztjDtWiY18yr6aEPl/6NB8adwPSNPdO7 NApgZlYIVs+/V/7Isx0+La+zGf2kDC5S5SEY5arK000EtslcDrEpebBHcmqGKGAJ jVPDqTLcQbU2z3p/yrVm9tj9Or7Ud7HhQOcTWj6WqhHsU0oRKh4zyqSbJvNWyG6t LOw0gd/+qbEofF95SfC5WDtxi6Z4uTqbZcEwjSCFIGd/tBNRe9Ob25Ix2FAVIbBu z38fE3UFnypQ7g/9ZIuo85ejdzY+tuJS7qTVrjE9hPS4JIU5InGOFBpf0dfIyNxq LeHlzQan4f2Ah9QCt7orCSzB1aDHkm/wni6IgKMKx55RXp+sBhEs2UL2wav6KHlM EU1F+ABuqiQCE95gDq/HsLgceKi+TbaEDlcvq1VHk/I= [[email protected] mnt]# openssl enc -d -des3 -a -salt -in fstab.cipher -out fstab.plain 解密 enter des-ede3-cbc decryption password: 输入解密密码 [[email protected] mnt]# ls fstab fstab.cipher fstab.plain [[email protected] mnt]# cat fstab.plain # # /etc/fstab # Created by anaconda on Wed Jun 15 13:41:54 2016 .....省略 |
openssl完成单向加密:
工具: openssl dgst ,gpg(很少使用) (也可以使用md5sum Fielname 求特征码)
用法:使用dest子命令:
[[email protected] mnt]# md5sum fstab 3234370d9b20a490e35c98222a535133 fstab [[email protected] mnt]#openssl dgst -md5 fstab MD5(fstab)=3234370d9b20a490e35c98222a535133 使用相同的算法,结果应该相同 |
openssl生成用户密码
工具:passwd, openssl passwd
获取帮助信息:whatis passwd --> man sslpasswd
使用格式:
-1 使用md5加密 (这里为数字1,不是字母l)
-salt SALT_STR 加盐,后面跟上盐的字符串,最多8位
[[email protected] mnt]# openssl passwd -1 -salt 12345678 Password: $1$12345678$tRy4cXc3kmcfRZVj4iFXr/ [[email protected] mnt]# openssl passwd -1 -salt 12345678 Password: $1$12345678$tRy4cXc3kmcfRZVj4iFXr/ 单向加密,盐不变,输入的密码不变,最后结果一定一样 [[email protected] mnt]# openssl passwd -1 -salt 12345670 Password: 雪崩效应 $1$12345670$7DdNL8JzTsaXAqPxVDm.W. 当把盐改变了,即使密码还是一样,但结果大不一样 |
openssl生成随机数:
工具:openssl rand
获取帮助信息:man sslrand
格式:
-bash64 使用bash64编码
-hex 16进制数字编码
[[email protected] mnt]# openssl rand -base64 8 X0PlMi7A/XI= [[email protected] mnt]# openssl rand -base64 9 6JqhqdlqhWHu [[email protected] mnt]# openssl rand -hex 5 使用16进制编码,你会发现5字节会有10个随机数 15970a4de5 下面是随机数结合密码使用,生成密码: [[email protected] mnt]# openssl passwd -1 -salt $(openssl rand -hex 4) Password: $1$64939ce7$XjTc5WGxHP.4VkD8MFt4o. [[email protected] mnt]# openssl passwd -1 -salt $(openssl rand -hex 4) Password: 之后我们会发现即使我们输入密码相同,随机数绝对不相同,生成不同结果 $1$7c111a52$E4rN6Ut/nTGNetpZEQ7Ti. |
openssl实现公钥加密:
三种功能:
数字加密
支持算法:RSA ELGamal
工具:openssl rsautl ,gpg
数字签名
支持算法:RSA ,DSA ,ELGamal
工具: openssl rsautl , gpg
秘钥交换
支持算法: DH
生成秘钥对: openssl genrsa 位数只能是512,1024,2048,4096,
这里要使用到()利用子shell环境
[[email protected] mnt]# openssl genrsa 1024 Generating RSA private key, 1024 bit long modulus ........................................................................................................++++++ e is 65537 (0x10001) -----BEGIN RSA PRIVATE KEY----- 明显可以看的出这是生成的私钥 MIICXQI........中间省略.........Z -----END RSA PRIVATE KEY----- 但是我们一般都是要把私钥保存到文件当中,这里有两种方法(当然这两种还要结合别的): 1.以上是关于Openssl安全与认证的主要内容,如果未能解决你的问题,请参考以下文章 |