1 概述
为解决两台主机之间的数据传输的通信安全,我们必须遵循以下三个安全目标
- 保密性:数据是被加密的,就算被第三方截获也无法查看原始数据
- 完整性:数据到达目标时是完整的,没有被破坏的
- 可用性:信息是可用的
针对以上三个安全目标对应的攻击类型有:
- 威胁保密性的攻击:窃听、通信量分析
- 威胁完整性的攻击:更改、伪装、重放
- 威胁可用性的攻击:拒绝服务(Dos)
针对以上攻击类型的解决方案有:
技术:加密和解密以及服务(用于抵御攻击的服务,也即是为了上述安全目标而特地涉及的安全服务)
- 传统加密方法:替代加密算法,置换加密算法
- 现代加密方案:现代块加密方法
-
2 加密、解密
密钥算法和协议:对称加密、非对称加密、单项加密、认证协议
Linux系统下的加解密工具:OpenSSL(ssl),GPG(pgp)
OpenSSl由三部分组成: libencrypt库
- libssl库
- openssl多用途命令行工具
2.1 加密算法和协议
2.1.1 对称加密
加密和解密使用的是同一个密钥;数据加密(保密性)
DES: Data Encryption Standard,该加密方式已经寿终正寝了
3DES:Triple DES ;
AES: Advanced Encryption Standard;(128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CASTS
特性:
1、加密、解密使用同一个密钥
2、将原始数据分割成为固定大小的块,逐个进行加密
缺陷:
1、密钥过多;
2、密钥分发困难;2.1.2 公钥加密
密钥分为公钥与私钥,
公钥:从私钥中提取产生,可公开给所有人,pubkey
私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key
特点:用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然;
用途:
数字签名(身份认证):主要用户让接收方确认发送方的身份
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
数据加密:不常用,因为此种方式加密效率太低,比对称加密要慢3个数量级
基于非对称密钥的通信过程:模拟A给B发送数据
1、A首先对原始数据进行单向加密,比如常见的MD5算法,定长输出一个数据特征码
2、A利用自己的私钥对特征码进行加密,并附加在数据后面
3、A生成一个临时的对称密钥,对以上的整个数据进行加密
4、A利用B的公钥加密第3步的对称密钥,附加在数据后面并将以上所有数据发送给B
其实以上有一个最大的漏洞,就是A怎么确认拿到B的公钥就一定是B的,会不会有人冒充B呢,此时就引入了CA
算法:RSA、DSA、ELGamal2.1.3 单向加密
即提出数据指纹,只能加密,不能解密
特性:定长输出、雪崩效应
功能:校验数据的完整性
算法:
md5:Message Digest 5,128bits
sha1:Secure Hash Algorithm 1, 160bits,除此之外sha还有sha224,sha256,sha384, sha5122.1.4 密钥交换
IKE(Internet Key Exchange)
1、公钥加密,通过公钥来加密对称密钥,并发送给对方
2、DH(Deffie-Hellman)
下面对DH算法做个简单的说明:A、B分别为两个用户;p,g为他们协商生成的随机数
A:p,g
B:p,g
A:x
—>p^x%g ==>B
A: (p^y%g)^x
B:y
—>p^y%g ==>A
B: (p^x%g)^y
其它IKE算法:RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)2.2 PKI
公钥基础设施:Public Key Infrastructure,分为以下四个部分组成
- 签证机构:CA
- 注册机构:RA
- 证书吊销列表:CRL
-
2.3 X.509
目前共有三个版本,v1, v2, v3:定义了证书的结构和认证的协议标准,以下定义了一个ca签署的证书需要包含了哪些字段属性:
版本号
序列号
签名算法ID
发行者的名称
有效期限
主题名称
主体公钥
发行者的唯一标识
主体的唯一标识
扩展
发行者的签名2.4 SSL/TLS
SSL:Secure socker Layer
Netscape: 1994
v1.0,v2.0,v3.0, 因漏洞情况,在加上是商业的原因,几乎被废弃使用
TLS:Transport Layer Security
IETF:1999
v1.0,v1.1,v1.2,v1.3,几乎已经成为现在实际使用的事实标准
分层设计:
1、最底层:基础算法语言实现,aes,rsa,md5
2、向上一层:各种算法的实现
3、再向上一层:组合算法实现半成品
4、用各种组件拼装而成的各种成品密码学协议软件
协议的开源实现:OpenSSL
SSL会话主要的三个步骤
客户端向服务器端索要并验证证书;
双方协商生成“会话密钥”
双方采用“会话密钥”进行加密通信
SSL Handshake Protocol
第一阶段:ClientHello:
支持的协议版本,比如TLS 1.2;
客户端生成的一个随机数,稍后用户生成“会话密钥”
支持的加密算法,比如AES,RSA
支持的压缩算法
第二阶段:ServerHello
确认使用的加密通信协议版本,比如TLS 1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”
确认使用的加密方法
服务器证书;
第三阶段:
验证服务器证书,确认无误后取出其公钥; (证机构, 证书完整性, 证书持有者,证书有效期, 吊销列表)
发送以下信息给服务器端:
一个随机数
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送
客户端握手结束通知
第四阶段:
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所用到的“会话密钥”
服务端握手结束通知3 OpenSSL
3.1 组件:
1、libcrypto,libssl主要由开发者使用;2、openssl:多用途命令行工具;
Openssl:有多个子命令,分为三类:
标准命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
标准命令:enc,ca,req,genrsa,…3.2 对称加密
工具: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.ciphertext3.3 单向加密
工具:openssl dgst,md5sum,sha1sum,sha224sum,…
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE3.4 生成用户密码
工具:passwd,openssl passwd
]# openssl passwd -1 -salt SALT3.5 生成随机数
工具:openssl rand
]# openssl rand -hex NUM
]# openssl rand -base64 NUM3.6 公钥加密
加密解密
算法:RSA,ELGamal
工具:openssl rsautl,gpg
数字签名
算法:RSA,DSA,ELGamal
工具:openssl rsautl,gpg
密钥交换
算法:DH
生成密钥对
生成私钥:]# (umask 077; openssl genrsa -out /tmp/myprivate.key 2048)
提出公钥:]# openssl rsa -in /tmp/myprivate.key -pubout4 Linux系统上的随机数生成器
/dev/random:仅从熵池返回随机数,随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,非阻塞;
伪随机数不安全;
熵池中随机数的来源:- 硬盘IO中断时间间隔;
- 键盘IO中断时间间隔;
5 CA
CA可分为两种:公共信任的CA,私有CA
建立私有CA的工具:openssl、OpenCA
配置文件:/etc/pki/tls/openssl.cnf5.1 构建私有CA
在确认配置为CA服务器上生成一个自签名证书,并为CA提供所需的目录及文件即可;
1)生成私钥:
]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2)生成自签名证书:
]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
-new:生成新证书签署请求
-x509:生成自签格式证书,专用于创建私有CA时;
-key:生成请求时用到的私有文件路径(从私钥文件中提取公钥)
-out:生成的请求文件路径,如果自签操作将直接生成签署过的证书
-days:证书的有效时常,单位时day;
3)为CA提供所需的目录及文件
]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
]# touch /etc/pki/CA/{serial,index.txt}
]# echo 01 >/etc/pki/CA/serial5.3 签署证书
要用到证书进行安全通信的服务器,需要向CA请求签署证书:
步骤:(以http为例)
1)用到证书的主机生成私钥
]# mkdir /etc/httpd/ssl && cd /etc/httpd/ssl
]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
2)生成证书签署请求
]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 3650
3)将签署请求通过可靠方式发送给CA主机
4)在CA主机上签署证书
]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 3650
查看证书中的信息
]# openssl x509 -in /etc/pki/CA/certshttpd.crt -noout -serial -subject5.4 吊销证书
1)客户端获取要吊销的证书的serial(在使用证书的主机执行)
]# openssl x509 - in /etc/pki/CA/certshttpd.crt -noout -serial -subject
2)CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致
吊销:
]# openssl ca -revoke /etc/pki/CA/netcerts/SERIAL.pem
其中的SERIAL要换成证书真正的序列号
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