SSL及使⽤openssl实现CA
TLS如何实现各种功能?数据如何加密在⽹络上传输?
⽹景(Netscape)公司在应⽤层和传输层加⼊了半层,把这个半层称之为SSL,SSL不是软件,可以理解是⼀个库,当http交给tcp层之前先通过ssl进⾏封装,所以http就成为https,ftp变为ftps等。SSL有三个版本V1、V2、V3,⽬前只有V2、V3在⽤。
由于SSL是私有的,所以国际化组织开发出TLS(安全传输协议)⽤于在两个通信之间提供保密性和数据完整性。TLSv1=SSLv3
SSL协议结构
SSL协议本⾝可以分为两层:底层为SSL记录协议(SSL record protocol);上层为SSL握⼿协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。
SSL握⼿协议:是SSL协议⾮常重要的组成部分,⽤来协商通信过程中使⽤的加密套件(对称加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥,实现服务器和客户端的⾝份验证。客户端和服务器通过握⼿协议建⽴⼀个会话。会话包含⼀组参数,主要有会话ID、对⽅的证书、加密
套件(包括密钥交换算法、数据加密算法和MAC算法)及主密钥。
SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报⽂都将使⽤新协商的加密套件和密钥进⾏保护和传输。
SSL警告协议:⽤来允许⼀⽅向另⼀⽅报告告警信息。消息中包含告警的严重级别和描述。
SSL记录协议:主要负责对上层的数据进⾏分块、计算并添加MAC、加密,最后把记录块传输给对⽅。
消息传输过程中使⽤基于密钥的MAC(Message Authentication Code,消息验证码)来检验消息的完整性。MAC是将密钥和任意长度的数据转换为固定长度数据的⼀种算法。利⽤MAC算法验证消息完整性的过程如图所⽰。发送者在密钥的参与下,利⽤MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利⽤同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值⽐较。如果⼆者相同,则报⽂没有改变;否则,报⽂在传输过程中被修改,接收者将丢弃该报⽂。
SSL会话建⽴
两台主机之间SSL会话是如何建⽴的?以http为例,https使⽤443端⼝
在没有使⽤SSL的时候建⽴三次握⼿后即可通信,当使⽤SSL时,三次握⼿后,
①客户端请求,服务端收到请求后与客户端协商建⽴SSL(如:协议版本、加密算法等)
②服务器把证书发给客户端
③客户端获取证书之后要验证证书(颁发机构信任)
④客户端⽣成⼀个会话密钥(对称加密密钥)并发给服务器端
⑤服务端就可加密数据发送
SSL程序软件--openssl
加密解密算法实现⼯具(程序)有openssl和gpg
OPENSSL:SSL的开源实现,实现了⼤部分算法,该软件有三部分组成
libcrypto:通⽤加密库,其他软件链接到库⽂件即可实现功能
libssl:TLS/SSL的实现,实现了数据传输的三种特性的库
openssl:命令⾏⼯具,可实现私有证书颁发机构以及加解密等功能。
openssl配置⽂件:/etc/pki/f 主要在实现CA时使⽤
查看openssl的⼦命令:[root@host]#openssl ?
openssl speed [算法名] #测试算法加密速度
openssl enc #先使⽤whatis查看,再使⽤man+whatis信息查帮助
使⽤enc⼦命令进⾏加密
openssl enc –e -des3 -salt -a -in inittab -out inittab.deb3
-e/d:e是表⽰加密,d是表⽰解密
-des3:指定加密算法
-salt:为了和openssl0.9.5以后的版本兼,容默认设置。这是经过加密后放在密码最前⾯的⼀段字符串,⽤途也是为了让破解更难。
-a :当进⾏加解密时,他只对数据进⾏运算,有时需要进⾏base64转换,设置此选项后加密结果进⾏base64编码,解密前先进⾏base64编码。-in :输⼊⽂件,缺省为标准输⼊
-out :输出⽂件,缺省为标准输出
使⽤ –d选项进⾏解密
openssl enc –d -des3 -d -salt -in inittab.des3 -out inittab
使⽤单向加密获得指纹
[root@host]#md5sum inittab 或者openssl dgst –md5 inittab
[root@host]#sha1sum inittab
如何给⽤户⽣成密码?openssl passwd -1 -salt 不使⽤salt选项会使⽤随机salt ,-1表⽰md5
openssl的rsa实现:rsa⼦命令是RSA key processing tool,⽽rsautil才是加解密⼯具,但是公钥⼀般不⽤于加密
⽣成随机数
rand⼦命令:openssl rand -base64 长度,⽣成指定长度的随机数
随机数的来源:收集磁盘IO的中断时间间隔或者敲击键盘的时间间隔作为随机数,⽣成的随机数会保存在⼀段内存空间(熵池),当使⽤随机数过量的时候,熵池没有随机数可⽤了可以通过⼤量磁盘IO让其重新⽣成
/dev/random 仅从熵池中取数据,没有数据之后会阻塞
/dev/urandom 熵池没有数据后软件⽣成随机数
使⽤openssl构建私有CA
步骤⼀:⽣成⼀对密钥,⽣成RSA,使⽤⼦命令genrsa,⽣成私钥,从私钥提取公钥
[root@host]#openssl genrsa #默认⽣成512位
[root@host]#openssl genrsa 2048 #指定⽣成多少位
[root@host]#openssl genrsa 2048 > server.key #保存结果
修改server.key权限为600,私钥⼗分重要应只允许属主访问
或者在⼦shell中直接⽣成指定权限的密钥⽂件,注意秘钥长度参数不能写在前
[root@host]#(umask 077;openssl genrsa -out server.key 2048)
[root@host]#openssl rsa -in server1024key -pubout #从私钥中提取公钥
-in 指定输⼊key位置⽂件,-pubout输出
步骤⼆:⽣成⾃签署证书;使⽤req⼦命令。
[root@host]#openssl req -new -x509 -key server1024.key - -day 365
Country Name (2 letter code) [XX]:CN #国家名称
State or Province Name (full name) []:Huizhou #省份名称
Locality Name (eg, city) [Default City]:zhongkai #城市名称
Organization Name (eg, company) [Default Company Ltd]:pk #公司名称
Organizational Unit Name (eg, section) []:IT #组织单位
Common Name (eg, your name or your server's hostname) []:openhost #主机名称
Email Address []:wjluo@pk #邮件地址
-new :新的申请
-x509:⽣成⾃签证书,专⽤于CA
-key server1024.key:指定密钥(私钥)⽂件
ssl协议是指什么-:输出保存的位置和⽂件名
-day 365:指定证书有效期
⽂本格式输出证书信息:openssl x509 -text -
此时,⽣成了密钥和⾃签证书之后仍不能使⽤,要根据/etc/pki/tls/opensslf配置⽂件的配置路径把证书放置在对应位置
【CA_default】
dir = /etc/pki/CA # CA的⼯作路径,最好使⽤绝对路径
certs = $dir/certs # 客户端证书保存位置
crl_dir = $dir/crl # 证书吊销列表保存位置
database = $ # 数据库,给哪些⼈发了证(索引信息)
new_certs_dir = $dir/newcerts # 新⽣成证书保存位置
certificate = $dir/cacert.pem # CA⾃⼰的证书(要按照名称⽣成)
serial = $dir/serial # 起始序列号,发出的证书编号
crlnumber = $dir/crlnumber # 证书撤销列表编号
crl = $dir/crl.pem # 证书撤销列表的⽂件是什么
private_key = $dir/private/cakey.pem # CA⾃⼰的私钥
RANDFILE = $dir/private/.rand # 随机数⽂件,会⾃动⽣成
default_days = 365 # 证书有效期限
default_crl_days= 30 # 证书吊销后保留多长时间
【req_distinguished_name】 #设置默认值,⽣成⾃签证书的时候不⽤交互输⼊。
创建配置⽂件中存在的相关⽬录⽂件,/etc/pki/CA
mkdir certs newcerts crl
touch serial
echo 01>serial(给予起始号)
⾃此,CA可以正常接受其他客户端申请
每⼀种服务都需要⾃⼰的证书,要有证书就需要公钥,要获得公钥就需要私钥。
以httpd为例:
1、新建/etc/httpd/ssl/⽬录,⽤于存放⽣成的⽂件
2、⽣成httpd应⽤的私钥
注意这个私钥和CA⽆关,是需要签署的服务(另⼀台主机)⽣成的。
[root@host]#(umask 077;openssl genrsa -out httdd.key 1024)
3、⽣成httpd的申请(填申请表)
[root@host]#openssl req -new -key httpd.key -out httpd.csr
填写完信息后最好会询问是否需要把请求加密存放,否就输⼊空密码
4、把请求(申请表)发送给CA
[root@host]#openssl ca -in httpd.csr - -day 365
5、当前⽬录就会有新签好的证书
6、可以发现serial⽂件序号⾃增1
吊销证书
(⼀)客户端
1、获取证书serial
# openssl x509 -in /path/to/ -noout -serial -subject
(⼆) CA
2、根据节点提交的serial和subject信息来验正与⽂件中的信息是否⼀致;
3、吊销证书
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
4、⽣成吊销证书的编号(如果是第⼀次吊销,⽣成此⽂件)
# echo 00 > /etc/pki/CA/crlnumber
5、更新证书吊销列表
# cd /etc/pki/CA/crl/
# openssl ca -gencrl -l
如果需要,查看crl⽂件的内容:
# openssl crl -in /path/l -noout -text
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论