OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能以及ssl协议,并提供程序供测或其他目的使用。
传输层协议:TCP, UDP, SCTP
port:进程地址,进程向内核注册使用某端口(独占)
同一主机上的进程间通信:IPC , message queue,shm,semerphor
不同主机上的进程间通信:socket
cip:port <-- --> sip:port
cip:55673 <-- --> sip:80
监听模式:LISTEN(ip:port)
SSL:Secure Socket Layer
http --> ssl --> https
安全的目标:
保密性:confidentiality
完整性:integrity
可用性:availability
***类型:
威胁保密性的***:窃听、通信量分析;
威胁完整性的***:更改、伪装、重放、否认
威胁可用性的***:拒绝服务(DoS)
解决方案:
技术(加密和解密)、服务(用于抵御***的服务,也即是为了上述安全目标而特地设计的安全服务)
加密和解密:
传统加密方法:替代加密方法、置换加密方法
现代加密方法:现代块加密方法
服务:
认证机制
访问控制机制
密钥算法和协议
对称加密
公钥加密
单向加密
认证协议
Linux系统:OpenSSL(ssl),GPG(pgp)
OpenSSL由三部分组成:
libencrypto库
libssl库
openssl多用途命令行工具
加密算法和协议:
对称加密:加密和解密使用同一个密钥;
DES:Data EncryptionStandard;
3DES:triple DES
AES:Advanced EncryptionStandard;(128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
1. 加密、解密使用同一个密钥
2. 将原始数据分割称为固定大小的块,组个进行加密;
缺陷:
1. 密钥过多;
2. 密钥分发困难;
公钥加密:密钥分为公钥与私钥
公钥:从私钥中提取产生;可公开给所有人;pubkey
私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key
特点:用公钥加密的数据,只能使用与之配对的私钥解密;反之亦然;
用途:
数字签名:主要在于让接收方确认发送方的身份;
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
数据加密
算法:RSA,DSA,ELGamal
DSS:Digital SignatureStandard
DSA:Digital SignatureAlgorithm
单向加密:即提出数据指纹;只能加密不能解密;
特性:定长输出、雪崩效应;
功能:保证数据完整性;
算法:
md5:message digest 5, 128bits
sha1:secure hashalgorithm 1, 160bits
sha224,sha256,sha384,sha512
密钥交换:IKE(InternetKey Exchange)
公钥加密
DH(deffie-Hellman)
A: p,g
B: p,g
A:x --> p^x%g==>B
A:(p^y%g)^x=p^yx%g
B: y
--> p^y%g ==>A
B: (p^x%g)^y=p^xy%g
PKI:Public Key Infrastructure
公钥基础设施:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:
x.509v3:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体公钥
发行者的唯一标识
扩展
发行者的签名
SSL:Secure sockets 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. 用各种组件拼装而成的各种成品密码学协议软件;
SSL/TLS
SSL:安全套接字层(ssl 1.0,ssl2.0,ssl3.0)
TLS:传输层安全(tls 1.0,tls1.1,tls 1.2,tls 1.3)
SSL会话的主要三步:
客户端向服务器端索要并验证证书;
双方协商生成“会话密钥”;
双方采用“会话密钥”进行加密通信;
SSL Handshake Protocol:ssl握手协议
第一阶段:ClientHello
支持协议的版本,比如tls 1.2;
客户端生成一个随机数,稍后用户生成“会话密钥”
支持的加密算法,比如AES、3DES、RSA;
支持的压缩算法;
第二阶段:serverhello
确认使用的加密通信协议版本,比如tls 1.2;
服务器端生成一个随机数,稍后用于生成“会话密钥”
确认使用的加密方法;
服务器证书;
第三阶段:
验证服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
发送以下信息给服务器端:
一个随机数;
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
客户端握手结束通知;
第四阶段:
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有用到的“会话密钥”;
向客户端发送如下信息;
编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
服务端握手结束通知;
Openssl(2)
组件:
libcrypto,libssl主要由开发者使用;
openssl:多用途命令行工具;
openssl:
从多子命令,分为三类:
标准命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
标准命令: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
单向加密:
工具:openssl dgst,md5sum,sha1sum,sha224sum,…
dgst命令:~]#openssl dgst –md5/path/to/somefile
一般可以验证文件的完整性。
生成用户密码:
工具:passwd,openssl passwd
openssl passwd -1 –salt SALT
Note:salt不同,相同的密码,输出也不同。
生成随机数:
工具:openssl rand
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
公钥加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl,gpg
数字签名:
算法:RSA,DSA,ELGamal
密钥交换:
算法:DH
生成密钥:
生成私钥:#(umask077 ;openssl genrsa –out /path/to/private_key_fileNUM_BITS)
提出公钥:#openssl rsa –in /path/from/private_key_file -pubout
Linux系统上的随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;伪随机数不安全;
熵池中随机数的来源;
磁盘IO中断时间间隔
键盘IO中断时间间隔
CA:
公共信任的CA,私有CA;
建立私有CA:
openssl
OpenCA
openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
构建私有CA示例:准备两台主机,一台作CA主机192.168.19.128,一台作用户主机192.168.19.134(证书请求主机)
构建私有CA:在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;
步骤:
1) 生成私钥:
~]# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2) 生成自签证书;
~]# opensslreq -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem-days 3655
-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/serial
要用到证书进行安全通信的服务器,需要向CA请求签署证书;
步骤:(以httpd为例)
1) 用到证书的主机生成私钥:
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]#(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
2) 生成证书签署请求
3) 将请求通过可靠方式发给CA主机;
~]#scp /etc/httpd/ssl/httpd.csr [email protected]:/tmp/
可在CA主机上查看请求主机发送的证书请求;
4) 在CA主机上签署证书;
~]# opensslca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看 证书信息:
~]# openssl x509 -in/etc/pki/CA/certs/httpd.crt -noout -serial -subject
5) CA所在的主机将签署完的证书,发送回请求主机;
~]#scp /etc/pki/CA/certs/httpd.crt [email protected]:/etc/httpd/ssl/
吊销证书:
步骤:
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/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