前言

早期互联网数据传输是基于TCP/IP模型完成数据交换,其各层对传输的数据包进行各协议的封装,从数据的发送方到接收方进行的数据交换都是基于明文传输。在传输的过程中数据的可以被中间人进行拦截或抓取,威胁了数据的保密性(窃听、通信量分析)、数据的完整性(更改、伪装、重放、否认)、数据的可用性攻击(拒绝服务DOS及DDOS)。为了了达到安全,出现了技术的解决方案:加密和解密来抵御攻击。

加密和解密算法和协议

1、对称加密:

  • 特性:
    • 1、加密和解密使用同一密钥,但双方加密算法可以不同
    • 2、将原始数据分割成固定大小块,逐个进行加密
    • 3、加解密速度比较快
  • 缺点:
    • 1、密钥过多
    • 2、密钥分发困难
  • 用途:
    • 常见用于数据传输过程中的数据加密,
  • 常见算法:
    • DES : Data ,基于64位明文产生64个密文,或者64位密文产生64位明文
    • 3DES: triple DES
    • AES : advanced Encryption standard,采用128、192、256、384位加密机制
    • Blowfish
    • Twofish
    • IDEA
    • RC16
    • CAST5

2、非对称加密(公钥加密)

  • 特性:
    • 1、密钥分为公钥和私钥,密码都是成对出现。
    • 2、私钥可以解公钥加密的数据,公钥也可以解私钥加密的数据
    • 3、公钥从私钥中提取产生,可以公开给所有人,称之为Public Key
    • 4、私钥通过工具创建,使用者自己留存,必须保证其私密性,称之为Secret Key
  • 缺点
    • 加解密速度慢,一般比对称加密要慢3个量级(一个量级是10倍)
    • 中间人攻击
  • 用途
    • 发送方使用公钥加密一个对称密钥,并发送给对方
    • 主要用于让接收方确认发送方的身份
    • 1、数字签名
    • 2、密钥交换
    • 3、数据加密
数字签名及密钥交换过程说明:
  • 1、发送方使用单向加密算法计算数据的特征码,用其私钥加密特征码,并附加在数据后面,
  • 2、发送方再使用对称加密算法生成密钥,加密整个数据,并拿到对方的公钥,加密对称加密的密码,发送给对方
  • 3、对方收到后使用自己的私钥解密,拿到对称加密算法的密码,再使用密码解密整个数据。

身份验证机制的实现:发送方使用自己的私钥加密数据后,接收方拿对方发布的公钥解密其数据,这个过程被称之为身份验证

密钥交换机制的实现: 发送方使用对方的公钥加密其密码,接收方使用自己的私钥解密后可以得到其密码,这个过程被称之为密钥交换

  • 常见算法
    • RSA : 能同时实现加密解密
    • DSS : Digital signarure standard
    • DSA : 只能实现签名,不能实现加解密

3、单向加密

  • 特性:
    • 1、定长输出
    • 2、雪崩效应
    • 3、只加密不能解密
  • 用途:
    • 实现数据的完整性验证
  • 常见算法:
    • MD5 : message digest5,固定128位的定长输出
    • sha1 : secure hash algorithm ,固定160位的定长输出
    • sha224,sha256,sha384,sha512

密钥交换机制(IKE ,Internet Key Exchange)

  • 实现算法:

    • RSA
    • ECDH(随圆曲线DH)
    • ECDHE(临时随圆曲线DH)
    • 公钥加密
    • DH(deffie-hellman)
  • DH交换密钥的实现原理
      A: p,g (生成两个大数)
      B: p,g(生成两个大数)
    
      A: x(生成一个随机数)
          --> p^x%g ---->(发送给B)
      B: y(生成一个随机数)
          -->p^y%g ----> (发送给A)
    
      A:(p^y%g)^x == p^yx%g 
      B: (p^x%g) ^y == p^xy%g(算得的密码都一样)

为什么会有CA机构的出现

由于基于公钥和私钥机制进行密钥交换时,会有中间人攻击的情况发生。故我们需要有一个第三方机构帮忙认证证书的真实性,不会被第三方利用。这个情况下,出现了签证机构,即CA。

CA颁发证书的机制

  • 1、客户生成相应的私钥,并提取公钥
  • 2、向CA机构发送申请信息,其中需要提供主体名称、主体公钥、主体的唯一标识,生成一个签署请求文件。
  • 3、CA机构对其提供的请求文件提取特征码,使用自己的私钥对特征码签名,生成证书(证书中包含信息请见以下)

PKI(Public infrastructure,公钥基础设施)

  • 四个组件组成
    • 签证机构 : CA
    • 注册机构 : RA
    • 证书吊销列表 : CRL
    • 证书存取库 : CB
  • 证书的基本格式(X.509标准)
    • 1、证书序列号
    • 2、序列号
    • 3、签名算法ID
    • 4、发行者名称
    • 5、有效期限
    • 6、主体名称
    • 7、主体公钥
    • 8、发行者的唯一标识
    • 9、主体的唯一标识
    • 10、扩展
    • 11、发行者的签名

加密通信的实现协议

  • SSL (Secure socket layer)

    由网景公司研发,SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可选的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上, 用于在实际的数据传输之前,通讯双方进行身份认证、协商加密算法、交换加密密钥等

    • V1.0
    • V1.2
    • V3.0
    • 协议版本
  • TLS (Transport layer security)

    TLS是开源SSL的实现,由IETF公司于1999年发布,其支持多种算法。TLS彩分层设计:

    • 协议版本:
    • V1.0
    • V1.1
    • V1.2(目前主流版本)
    • V1.3
    • 最底层:基础算法原语的实现,AES,RSA,MD5
    • 向上一层: 各种算法的实现
    • 再向上一层: 组合算法实现的半成品
    • 再向上:用于各种组件拼装而成的各种成品密码学协议软件

Handshake握手过程(无需验证客户端证书)

动作发送方
Client helloClient
(2)Server HelloServer
(3)CertificateServer
(4)Server hello doneServer
(5)Client Key ExchangeClient
(6)Change cipher specClient
(7)FinishedClient
(8)Change cipher specServer
(9)FinishedServer
  • 1、TLS客户端通过Client Hello消息发送所支持的TLS版本、加密算法、压缩算法、密钥交换算法、MAC算法等信息发送给TLS服务端
  • 2、TLS服务端确认本次通信采用TLS版本加密通信,并通过Server Hello消息通知SSL客户端,并将自己的公钥信息的数字证书发送给TLS客户端
  • 3、服务端发送Server hello Done消息,通知客户端版本和加密套件协商结束,开妈进行密钥交换
  • 4、客户端验证服务端的证书合法性后,利用证书中的公钥加密客户端随机生成的premaster secret(随机数字做为密码),发送给服务端
  • 5、客户端发送Change cipher spec消息,通知服务端后续采用协议商好密钥和加密方法进行加密和MAC计算
  • 6、客户端计算已交互的所有握手信息(除Change cipher spec消息)进行Hash值计算,并使用协商好的密钥进行加密Hash值,并通过Finished消息发送给服务器,服务端利用同样的方法计算已交互的握手消息的Hash值,并与解密的Hash值比较,如果二者相同,则证明密钥和加密套件协商成功
  • 7、同样服务端也会发送Change cipher spec消息,通知客户端后续报文采用协商好的密码和加密套件处理Hash值,客户端利用同样的方法计算已交互的握手消息的Hash值,并与之对比,如果相同则证明密钥和套件协商成功

Handshake握手过程(验证客户端的证书过程)

动作发送方
Client helloClient
(2)Server HelloServer
(3)CertificateServer
(4)Certificate RequestServer
(5)Server hello doneServer
(6)CertificateClient
(7)Client Key ExchangeClient
(8)Certificate VerifyClient
(9)Change cipher specClient
(10)FinishedClient
(11)Change cipher specServer
(12)FinishedServer

客户端的身份验证是可选的, 由服务器决定是否验证客户端的身份(银行网银类似是需要验证客户端的身份)

  • 1、服务器发送Certficate Requset消息,请求客户端的证书
  • 2、客户端通过Certificate消息将携带自己的证书发送给服务端
  • 3、服务端验证该证书的合法性
  • 4、客户端计算已交互的握手信息、主密钥的hash值,利用自己的私钥对其进行加密,发送给服务端
  • 5、服务端计算已交互的握手信息,主密钥的hash值,利用客户端的公钥解密后,进行hash值对比,如果相同则客户端身份验证成功
说明:change cipher spec消息属于SSL密码变化协议,其他握手过程交互的消息均属于SSL握手协议,统称为SSL握手消息。计算Hash值,指的是利用Hash算法(MD5或SHA)将任意长度的数据转换为固定长度的数据

OpenSSL开源软件

1、简介

Openssl是开源软件,各应用程序可以使用openssl进行安全通讯,避免窃听、同时确认另一端连线者的身份,openssl被广泛应用在网页服务器之上。其是C语言所写,实现了基本的加密功能,也是SSL/TLS协议的应用实现。此软件是以Eric Young以及Tim Hudson两人所写的SSLeay的分支,于1998年12月发布第一个版本

2、Openssl的版本
  • V0.91c (1998年12月发布)
  • V1.0.1 : 支持TLS v1.2(2012年3月发布)
  • V1.0.2 (2015年1月发布)
3、OpenSSL的组成部分:
  • 加密解密库:Libencrypt,主要开发者使用
  • Libssl : 实现SSL安全通信机制的库
  • OpenSSL工具:多用途命令行工具
openssl加密工具
对称加密工具:openssl enc
  • 加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher
  • 解密 :openssl enc -d -des3 -a -salt -out fstab -in fstab.cipher

      -e : 加密
      -d : 解密 
      -a : 以base64编码进行输出
      -salt : 加盐
      -in :指定从那个文件读入
      -out : 输出至那个文件
单向加密工具:openssl dgst
  • openssl dgst -md5 fstab

      -md5 :指定算法
生成用户密码:openssl passwd
  • openssl passwd -1 -salt 12345678

      -1 : 指定加密算法
      -salt : 加盐,并且为123456
生成随机数:openssl rand
  • openssl rand -base64 10 (base64编码格式)
  • openssl rand -hex 10 (16进制编码格式)
  • openssl passwd -1 -salt $(openssl rand -hex 4)
生成私钥:openssl genrsa
  • openssl genrsa 1024 > /tmp/mykey.private
  • openssl genrsa 1024 -out /tmp/mykey.private 1024
  • (umask 077;openssl genrsa -out /tmp/mykey.private 1024)
提取公钥:openssl rsa
  • openssl rsa -in /PATH/FROM/private.key -pubout
  • openssl rsa -in /PATH/FROM/private.key -pubout -out pub.key
查看证书:opensll x509
  • openssl x509 -in httpd.crt -noout -serial -subject :只查看序列号和subject
Openssl CA的工作目录
  • /etc/pki/CA
Openssl配置文件
  • /etc/pki/tls/openssl.cnf
    • $dir/certs : 签发的证书存放位置
    • $dir/crl : 吊销的证书存放位置
    • $dir/index.txt : 证书的索引信息
    • $dir/serial : 索引序列号
    • $dir/private/cakey.pem : CA自己的私钥
    • $dir/cacert.pem : CA公钥位置
    • [req] : 此ID中定义了签署证书的属性

构建CA及签发证书的步骤

########自建CA########
1、生成私钥
    (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2、生成自签证书
    openssl req -x509 -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
3、为CA提供所需的目录及文件
    mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
4、建立证书索引序列号
    echo 01 > /etc/pki/CA/serial

########客户端生成私钥及生成签发证书请求########
1、到客户端相应的目录中,生成私钥 
    mkdir /etc/httpd/ssl
    (umask 077; openssl genrsa -out httpd.key 2048)
2、生成签署请求文件(实为导出公钥信息)
    openssl req -new -key httpd.key -out httpd.csr -days 365

########服务器端签署证书########
1、openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

#######拷贝签署的文件至客户端指定目录#######
1、cp /tmp/httpd/csr /etc/httpd/ssl

CA吊销证书

1、客户端获取要吊销证书的serial
2、CA端主机执行吊销操作
    openssl ca -revoke /etc/pki/CA/newcert/SERIAL_ID(证书的真正序列号)
3、生成吊销证书的吊销编号(只是第一次吊销证书时执行)
    echo 01 > /etc/pki/CA/crlnumber
4、更新证书吊销列表
    openssl ca -gencrl -out thisca.crl

#####查看crl文件
openssl crl -in /PATH/FROM/CRL_FILE.