OpenSSL基础
·传输层协议:TCP,UDP,SCTP
port:进程地址,进程向内核注册使用某端口(独占)
·同一主机上的进程间通信:IPC,message queue,shm,semerphor
·不同主机上的进程间通信:socket
cip:port <– –> sip:port
cip:55637 <– –> sip:80
监听模式:LISTEN(ip:port)
·加密需要:
不加密流量的易受攻击性:
密码/数据嗅探
数据操作
验证操作
相当于邮寄明信片
不安全的传统协议:
telnet 、FTP 、POP3 等等;不安全密码
http 、smtp 、NFS 等等;不安全信息
Ldap 、NIS 、rsh
·设计基本原则:
使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用安全模式
安全不是似是而非
从STRIDE 思考
在入口处检查
·SSL:Secure Sockets Layer
http –> ssl –> https
·安全的目标:
保密性:confidentiality
完整性:integrity
可用性:availability
·攻击类型:
威胁保密性的攻击:窃听、通信量分析
威胁完整性的攻击:更改、伪装、重放、否认
威胁可用性的攻击:拒绝服务(Dos)
·解决方案:
技术(加密和解密)、服务(用于抵御攻击的服务,为了上述安全目标而特地设计的安全服务)
加密和解密:
传统加密方法:替代加密方法、置换加密方法
现代加密方法:现代块加密方法
服务:
认证机制
访问控制机制
密钥算法和协议:
对称加密
公钥加密
单项加密
认证协议
Linux系统:OpenSSL(ssl),GPG(pgp)
·OpenSSL由3部分组成:
libcrypto库:加密解密的库
libssl库:加密模块应用库,实现ssl及tls
openssl:多用途命令行工具
加密算法和协议:
·对称加密:加密和解密使用同一密钥
DES:Data Encryption Standard
3DES:Triple DES
AES:Advanced Encryption Standard (128bits,192bits,256bits,384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性:
1、加密、解密使用同一个密钥
2、将原始数据分割成为固定大小的块、逐个进行加密
缺陷:
1、密钥过多
2、密钥分发困难
3、数据来源无法确认
·公钥加密:密钥分为公钥和私钥
公钥:从私钥中提取产生;可公开给所有人;public key
私钥:通过工具创建,使用者自己存留,必须保证其私密性;secret key
特点:用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
用途:
数字签名:主要在于让接收方确认发送方的身份
密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
数据加密
算法:RSA、DSA、ELGamal
DSS:Digital Signature Standard
DSA:Digital signature Algorithm
DSA:只能签名不能加密
缺点:密钥长,加密解密效率低下
实现加密:
接收者
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
发送者
使用接收者的公钥来加密消息M
将P(M)发送给接收者
接收者
使用密钥S来解密:M=S(P(M))
实现数字签名:
发送者
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
使用密钥S来加密消息M
发送给接收者S(M)
接收者
使用发送者的公钥来解密M=P(S(M))
结合签名和加密
·单向加密:即提出数据指纹(特征码);只能加密,不能解密
特征:定长输出、雪崩效应
功能:实现完整性
算法:
md5:Message Digest 5 ,128bits
sha1:Secure Hash Algorithm 1 ,160bits
sha224 ,sha256 ,sha384 ,sha512
工具
md5sum | sha1sum [ –check ] file
openssl 、gpg
rpm -V
md5sum /path/to/file
对文件进行哈希计算
例如:
md5sum f1 > f1.md5
md5sum –check f1.md5
比较文件的hash值是否变化
·密钥交换:IKE(Internet Key Exchange)
公钥加密
DH(Deffie-Hellman)<迪菲-赫尔曼>
ECDH(椭圆曲线DH)
ECDHE(临时椭圆曲线DH)
A:p,g 协商生成公开的整数a,素数p
B:p,g
A:产生一个随机数x
通过DH算法发送给B一个数据
–> p^x%g ==> B
密钥:A:(p^y%g)^x=p^yx%g
B:产生一个随机数y
通过DH算法发送给A一个数据
–> p^y%g ==>A
密钥:B:(p^x%g)^y=p^xy%g
DH:
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,生成为密钥
·数据传输方式:
加密通信中数据块的结构:key<对称加密>(data+SA[hash(data)])+PB(key)
用hash算法:计算出data的特征码
用自己的SA<私钥>:签名data的特征码
用对称加密<key>加密:data和签名后的hash(data)
用对方的PB<公钥>加密:对称加密的密钥<key>
把对称加密的数据和PB加密的数据一同发给对方
·PKI:Public Key Infrastructure
公钥基础设施:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:
X.509v3:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者的唯一标识
主体的唯一标识
扩展
发行者的签名
证书获取:
证书类型:
证书授权机构的证书
服务器
用户证书
获取证书两种方法:
使用证书授权机构
生成签名请求(csr)
将csr发送给CA
从CA处接收签名
自签名的证书
自已签发自己
·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、最上层:用各种组件拼装而成的各种成品密码学协议软件
协议的开源实现:OpenSSL
SSL/TLS
·SSL:安全套接字层(ssl 1.0,2.0,3.0)
·TLS:传输层安全(tls 1.0,1.1,1.2,1.3)
·OpenSSL
libcrypto
libssl
openssl
·SSL回话主要三步:
客户端向服务器端索要并验证证书
双方协商生成“会话密钥”
双方采用“会话密钥”进行加密通信
·SSL Handshake Protocol
第一阶段:ClientHello
支持的协议版本:比如tls 1.2
客户端生成一个随机数,稍后用于生成“会话密钥”
支持的加密算法:比如AES、RSA
支持的压缩算法
第二阶段:ServerHello
确认使用的加密通信协议版本:比如tls 1.2
服务器端生成一个随机数,稍后用于生成“会话密钥”
确认使用的加密方法
服务器证书
第三阶段:
验证服务器证书,在确认无误后取出其公钥(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
发送以下信息给服务器端
一个随机数
编码变更通知,表示随后额信息都将用双方商定的加密方法和密钥发送
客户端握手结束通知
第四阶段:
收到客户端发来的第三个随机数<客户端在第三阶段产生的随机数>per-master-key后,计算生成本次会话所用到的“会话密钥”
向客户端发送如下信息:
编码变更通知,表示随后额信息都将用双方商定的加密方法和密钥发送
服务器端握手结束通知
·PKI:公钥基础设施
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
OpenSSL命令
·组件:
libcrypto,libssl主要由开发者使用
openssl:多用途命令行工具
·openssl:
众多子命令,可分为三类:
标准命令
消息摘要命令(dgst子命令)
加密命令(enc子命令)
标准命令:enc ,ca ,req ,genrsa,…..
openssl ?
查看openssl命令的众多子命令
·对称加密:
工具: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 -in fstab.ciphertext -out fstab.test
-e:加密
-d:解密
-a:[-a/-base64]使用base64位的输出格式
-salt:加点盐ftp://10.1.0.1/pub/exam/%E9%9D%A2%E8%AF%95%E9%A2%98/%E6%90%9C%E7%8B%90/QQ%E5%9B%BE%E7%89%8720141202142644.jpg
-in:对那个文件进行加密/解密
-out:加密/解密输出的文件路径及文件名
·单向加密:
工具:openssl dgst ,md5sum ,sha1sum ,sha224sum ……
dgst命令:
# openssl dgst -md5 /PATH/TO/SOMEFILE
·生成用户密码:
工具:passwd ,openssl passwd
openssl passwd -1 -salt SALT
-1:使用sha1的密钥长度生成密码
默认只支持sha1,不支持sha256以及sha512
·生成随机数:
工具:openssl rand
# openssl rand -hex NUM
hex encode output
生成16位进制的随机数,1位占4字节
# openssl rand -base64 NUM
base64 encode output
生成的随机数要去掉最后面的2个=符号
·公钥加密:
加密解密:
算法:RSA ,ELGamal
工具:openssl rsautl ,gpg
数字签名:
算法:RSA ,DSA ,ELGamal
工具:openssl rsautl ,gpg
密钥交换:
算法:DH
生成密钥:
生成私钥:# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
可以加 -des3 使用3des对私钥进行加密
提出公钥:# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
Linux系统上的随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
伪随机数不安全
熵池中随机数的来源:
硬盘IO中断时间间隔
键盘IO中断时间间隔
随机数不够用时:
1、击键<不建议>
2、cp或mv一个大的文件,从而产生大量硬盘IO终端<建议>
CA:
·公共信任的CA,私有CA
·建立私有CA:
openssl
OpenCA
·openssl命令:
配置文件:/etc/pki/tls/openssl.cnf
[ CA_default ] dir = /etc/pki/CA # Where everything is kept //CA目录 certs = $dir/certs # Where the issued certs are kept //CA签名的证书所放路径 crl_dir = $dir/crl # Where the issued crl are kept //吊销列表 database = $dir/index.txt # database index file. <必须touch出文件来> //已签名证书的数据库文件 new_certs_dir = $dir/newcerts # default place for new certs. //新证书存放路径 certificate = $dir/cacert.pem # The CA certificate //CA自己的证书路径及文件名 serial = $dir/serial # The current serial number <必须touch出文件来> //每个证书的序列号及文件名 crlnumber = $dir/crlnumber # the current crl number //吊销证书的序列号及文件名 # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key <很重要> //CA自己的私钥路径及文件名 default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha256 # use SHA-256 by default preserve = no # keep passed DN ordering # For the CA policy [ policy_match ] countryName = match //match必须同CA服务器 stateOrProvinceName = match organizationName = match organizationalUnitName = optional //optional可以选的 commonName = supplied //supplied自己给出 emailAddress = optional
·构建私有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 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请求签署证书
步骤:(以http为例)
(1)用到证书的主机生成私钥
# mkdir /etc/httpd/ssl
# cd /etc/httpd/sl
# (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 365
(3)将请求通过可靠方式发送给CA主机
# scp /etc/httpd/ssl/httpd.csr root@IP.A.DD.R:/tmp/
(4)在CA主机上签署证书
# openssl ca -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
-subject :给谁发布的
(5)把CA主机上签署的证书发给http主机
·吊销证书:
步骤:
(1)客户端获取要吊销的证书的serial(在使用证书的主机上执行)
# openssl x509 -in /etc/pki/CA/certs/httpd.crt -nount -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
thisca.crl 是CA签署的其他公钥的签名
查看crl文件
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
作业:用openssl实现证书申请
创建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 3655
(3)为CA提供所需的目录及文件
# ls -ld /etc/pki/CA/{certs.crl,newcerts}
一般默认有上面三个目录,无这3个目录时,创建之
# touch /etc/pki/CA/{serial,index,txt}
# echo 01 > /etc/pki/CA/serial
要用到证书进行安全通信的服务器,需要向CA请求签署证书
步骤:(以http为例)
(1)用到证书的主机生成私钥
# mkdir /etc/httpd/ssl
# cd /etc/httpd/sl
# (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 365
(3)将请求通过可靠方式发送给CA主机
# scp /etc/httpd/ssl/httpd.csr root@IP.A.DD.R:/tmp/
(4)在CA主机上签署证书
# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
(5)把CA主机上签署的证书发给http主机
原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/48461
评论列表(1条)
我们常常处于测试的目的会自建CA来模拟https协议的实现,以后学习中也会用的很多,望熟练掌握,尝试着用脚本来实现CA主机的自签和授权,挑战一下自己