Openssl开源安全套接字协议
简介
SSL (Secure Socket Layer)叫做安全套接字协议,是一种应用层协议,主要用于传输数据的加密。 OpenSSL是SSL协议开源形式,是广泛使用的商业及SSL工具,同时OpenSSL也是一种命令行工具。
在网络中,主机之间的进程通信是通过套接字方式来实现的,服务器监听在某个 TCP Socket之上(IP:Port),客户端在本地打开一个随机的 Socket,然后通过TCP/IP协议,将请求通过交换机、路由器层层转发到目标服务器上,然后服务器可以判断出客户端请求的资源,进而转交到应用层相关服务上,服务端应用进程从磁盘中获得相应的资源信息,然后封装成相应的网络数据包格式以同样的方式层层传输给客户端对应的端口上。无论数据从应用层向下层传输还是从下层到应用层传输,每个层次中的协议都仅仅是对数据进行封装解封装,而里面的数据本身并没有发生变化,所以数据在发送过程当中是什么就还是什么,也就是说是明文发送的,没有加密,任何人只要获取到了相关的数据包就能够通过其他方法获知其中的明文内容;这也就相当于将自己的隐私亮相于大众广庭之下!因此就需要有一种加密机制能够保护互联网数据在传输工程中的隐私性了。
为此NIST组织就规定了安全通讯的几个要素,包括保密性、完整性和可用性。所谓保密性就是隐私性,完整性是指数据在传输过程中要保证能够完整,另外还能够保证在传输后能够还原回原来的数据,并且还原后的数据还能够使用。
而事实上,在互联网上通信的数据面临着多种多样的安全风险,这些安全风险包括:被动风险和主动风险。被动风险主要是通过窃听等方式来窃取用户的信息;主动风险是通过身份伪装、重放、消息篡改、拒绝服务风险方式来进行各种风险行为。对此互联网也必须采取一些安全机制来防范这些风险。安全机制有:加密、数字签名、访问控制、数据完整性验证、认证交换、流量填充、路由控制、公证等方式,这些安全机制是通过安全服务来实现的,对应的有:认证服务、访问控制服、数据保密性服务、数据完整性服务、不可否认性服务。为了保证这些服务的实现,还需要通过一些密码算法和协议(加密机制)来完成,常见的密码算法和协议有:对称加密、公钥加密、单向加密、认证协议。
在Linux系统上常用的加密解密工具有两个:OpenSSL和gpg。pgp是一个协议,而gpg是实现这个协议的一个软件,因此说gpg是pgp的实现。
常见的加密算法和协议
-
对称加密:加密和解密使用同一个密钥,依赖于算法和密钥,但其安全性依赖于密钥而非算法;
常见的算法:
DES: Data Encryption Stand,56bits
3DES:
AES: Advanced Encrpytion Standard, (128bits, 192, 256, 384, 512bits)
Blowfish
Twofish
IDEA
RC6
CAST5
特性
(1)、加密、解密使用同一密钥;
(2)、将明文分隔成固定大小的块,逐个进行加密。
缺陷:
(1)、密钥过多;
(2)密钥分发; -
非对称加密:采用的是公钥加密方法,当然还需要另一个密钥来解密,这个密钥称之为私钥,两者统称为密钥对儿。
私钥:secret key,仅允许个人使用;
公钥:public key,公开给所有人获取。
公钥是从私钥中提取出来的;使用公钥加密的数据,只能使用于此公钥配对儿的私钥解密,反之也是如此。
用处:
(1)、身份认证:私钥拥有者用自己的私钥加密的数据,只要用其公钥能解密,即可认证其身份;
(2)、密钥交换:与被通信方通信之前,首先获取到对方的公钥,自己生成一个加密密码,用对方的公钥加密,并发送给对方;
(3)、数据加密:
算法:
RSA
DSA
ELGamal
特性:
(1)、密钥长度较大,例如512bits,2048bits,4096bits
(2)、加密解密分别使用密钥对儿中的密钥相对进行;
(3)、常用于数据签名和密钥交换。 -
单向加密:只能加密,不能解密,因为解密过程是一个二次加密的过程;主要是提出数据的特征码;
特性:
(1)、定长输出:无论原来的数据是多大级别,其加密结果长度一样;
(2)、雪崩效应:原始数据微小改变,将会导致结果巨大变化;
(3)、不可逆:
算法:
MD5:128bits定长输出;
SHA1:160bits定长输出;
SHA256
SHA384
SHA512
CRC32
用处:
(1)、数据完整性(完整性校验);
(2)、系统账号密码校验。
如:
/etc/shadow文件当中密码字段是有多个字段组成,其中就包含有密码的特征值,然后在结合用户输入的明文密码进行二次加密,将所得到的密文和文件中的密码字段进行比对,比对成功则认证成功,否则失败。 - 密钥交换,IKE( Internet Key Exchange):双方通过交换密钥来实现数据加密解密;密钥交换有以下两种:
公钥加密:将公钥加密后通过网络传输到对方进行解密,这种方式还有很大可能被截取破解,不常用;
DH:( Deffie-Hellman):双方共有一些参数,共同协商加密算法,除此之外双方还有属于自己的私有参数,通过共有的参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自已私有的参数进行特殊算法,经过双方计算后的结果是相同的,而这个结果就是密钥。
如:
A有p和g两个参数,A还有一个属于自己的私有参数x;
B有p和g两个参数,B还有一个属于自己的私有参数y;
A: P^X%G
B: P^Y%G
然后上方交换计算后的结果,此时
A拿到B的P^Y%G,B拿到A的P^X%G,双方再和自己私有参数进行相同的算法,即:
A:对(P^Y%G)再求x次方得(P^Y%G)^X=P^XY%G
B:对(P^X%G)再求y次方得(P^X%G)Y=P^XY%G
最后A和B的结果是一样的。
注意:整个过程中对于第三方人员来说只能获取p、g两个值,AB双方交换的是经过计算后的值,因此这种加密方式是很安全的。
一次加密通信过程
发送者:
1、使用单向加密算法提取生成数据的特征码;
2、使用自己的私钥加密特征码附加在数据后面;
3、生成用于对称加密的临时密钥;
4、用此临时密钥加密数据和已经使用私钥加密后的特征码;
5、使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方;
接收方:
1、使用自己的私钥解密加密的临时密钥:从而获得对称密钥;
2、使用对称密钥解密对称加密的数据和私钥加密的特征码密文:从而获得数据和特征码密文;
3、使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码;
4、使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较
数字证书
在双方通讯过程中,数据的加密解密依赖于对方的公钥,因此就需要一种可靠机制能够保证公钥数据的安全性,这种机制就是CA,CA是一个证书颁发机构,这个机构负责证书的颁发,谁需要就去CA购买,买完之后去验证证书就可以了。那我们如何知道或者确定一个证书就是正规的CA颁发的呢?
我们来捋一捋
A要给B进行通信,A将自己的公钥发给B,那B就需要知道A发过来的公钥是否为正规的CA顾发的,A在获得CA给其颁发的证书时会在证书上面盖上一个戳,那因此我们就需要通过验证戳的真实性来验证A的公钥的合法性,所以上面的问题关键点就在于验证CA所盖的戳了,那怎么验证呢?解铃还须系铃人,我们可以通过验证CA自身的证书就可以嘛!那CA的证书又从哪里获得呢?我们不可能从互联网上去下载,因为从互联网上获得的证书是不可信赖的,既然不能通过互联网获得,就这得从操作系统上获得,也就是说系统发行厂商会把这些CA证书做进操作系统里面,在需要的时候可以直接去比对,如果操作系统中没有固化的这些CA证书,那么就可以说明该CA证书是不合法的。
CA只是PKI(Public Key Infrastructure 公钥基础设施)的一个组成部分,PKI包括:
签证机构:CA,相当于我们办理×××时的公安局(真正颁发证件的机构)
注册机构:RA,相当于我们办理×××时的派出所(帮你拍照信息录入的机构)
证书吊销列表:CRL,相当于我们证件丢失时挂失的内容
证书存取库:当别人去请求认证时的资料库
数字证书的格式(x.509 v3)由以下几个部分组成
版本号(version);
序列号(serial number):CA用于唯一标识此证书;
签名算法标志( Signature algorithm identifier);
发行者的名称:即CA自己的名称
有效期:两个日期,起始日期和终止日期;
证书主体名称:证书拥有者自己的名字;
证书主体公钥信息:证书拥有者自己的公钥;
发行商的惟一标识;
证书主体的惟一标识;
护展信息:
签名:CA对此证书的数字签名;
证书通常有两类用途:用户证书和主机证书(如:httpd);
SSL
SSL( Secure Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。TLS(SSL的维承版本)与SSL在传输层对网络连接进行加密。
SSL为Netscape所研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)技术,可确保数据在网络上传输过程中不会被截取及窃听。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协设提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL提供的服务有
(1)、认证用户和服务器,确保数据发送到正确的客户机和服务器;
(2)、加密数据以防止数据中途被窃取;
(3)、维护数据的完整性,确保数据在传输过程中不被改变。
Openssl
Openssl是 ssl 的一个开源项目,其由三部分组成:
openssl:多用途命令行工具,每种功都能使用专用的子命令来实现;
libcrypto:加密、解密库文件;
libssl:ssl协议实现
openssl命令:
子命令分类:标准命令、消息摘要命令、加密解密相关的命令
加密文件(对称加密)
算法:des, 3des, aes, blowfish, twofish, idea, casts
工具:openss enc, gpg
enc工具:
# openssl enc -e -CIPHERNAME -a -salt -in /PATH/FROM/SOMEFILE -out /PATH/TO/SOMECIPHERFILE
# openssl enc -d -CIPHERNAME -a -salt -in /PATH/FROM/SOMECIPHERFILE -out /PATH/TO/SOMEFILE
单向加密:
算法:md5,shal
工具:openssl dgst, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum
# openssl dgst -CIPHER /PATH/TO/SOMEFILE...
MAC:消息认证码,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性;
生成用户密码:
# openssl passwd -1 -salt 8bits 随机数
生成随机数:
# openssl rand -hex | -base64 NUM
公钥加密:
工具:gpg, openssl rsautl
数字签名:RSA, DSA, ELGamal
DSA:Digital Signature Algorithm
DSS:Digital Signature Standard
密钥交换:
公钥加密、DH
生成密钥对儿:
操作过程:生成私钥,从私钥中提取公钥
# openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS
注意:在bash命令行上放在小括号中执行的命令,其实是通过打开一个子shell进程进行的;
# (umask 077: openssl genrsa -out /PATH/TOPRIVATE_KEYFILE NUM_BITS)
私钥中手动提取公钥:
# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
随机数生成器:random、urandom
首先说一说熵池的概念,在操作系统上有一个叫做熵池的地方,他是用来保存硬件中断产生的随机数(每一次硬件终端都会产生一个随机数)。
/dev/random:仅从熵池中返回随机数,当熵池中的随机数耗尽时,取随机数的进程将会被阻塞;
/dev/urandom:先从池中取随机数,当熵池中的随机耗尽时,就通过伪随机数生成器生成随机数;
数字证书的获取
获取证书的方法有两种:向RA注册中请,或者自己建立私有CA。向RA注册中请CA是需要花钱购买的,通常用于企业生产环境当中,以满足业务的需求;但有时我们仅仅是用于企业内部自身使用或者是个人测试使用,因此我们就没必要去花钱购买CA证书,而 OpenSSL 工具可以满足我们创建私有CA的步骤。
使用OpenSSL构建私有CA的步骤:
1、生成私钥;
2、生成自签署证书;
(1)、私钥用于签发证书时,向证书添加数字签名使用
(2)、证书:每个通信方都导入此证书至“受信任的证书颁发机构”;
涉及的配置文件:/etc/pki/tls/openssl.cnf
工作目录: /ete/pki/CA
建立私有CA:
# openssl req - new x509 -key /etc/pki/CA/private/cakey.pem -out /ete/CA/cacert.pem -days 365
其中:
-new:生成新的证书签署请求;
-key:私钥文件路径,用于提取公钥;
-days N:证书有效时长,单位为“天”;
-out:输出文件保存位置
-x509:直接输出自签署的证书文件,通常只有构建CA时才这么用;
3、提供辅助文件
# touch /etc/pki/CA/index.txt
# echo 01 > /etc/pki/CA/serial
给节点申请证书:
1、节点申请证书
在证书申请的主机上进行如下步骤:
(1)生成私钥;
(2)生成证书签署请求;
注意:
(a)其中的subject信息部分,要与CA的保持一致;
(b) Common Name要使用此主机在通信时使用真实名字;
(3)把请求发送给CA。
吊销证书
1、获取吊销证书的序列号
# openssl x509 -in /PATH/FROM/CRT_FILE -noout -scrial -subject
2、实现证书吊销
(1)吊销证书
# openssl ca -revoke /PATH/FROM/CRT_FILE
(2)生成吊销证书的编号
# echo 01 > /etc/pkie/CA/crlnumber
(3)更新证书吊销列表
# openssl crl -gencrl -out THISCA.crl