首页 运维杂谈SSL/TLS协议及Openssl工具的实现

SSL/TLS协议及Openssl工具的实现

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

前言

早期互联网数据传输是基于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彩分层设计:

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

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

动作 发送方
Client hello Client
(2)Server Hello Server
(3)Certificate Server
(4)Server hello done Server
(5)Client Key Exchange Client
(6)Change cipher spec Client
(7)Finished Client
(8)Change cipher spec Server
(9)Finished Server
  • 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 hello Client
(2)Server Hello Server
(3)Certificate Server
(4)Certificate Request Server
(5)Server hello done Server
(6)Certificate Client
(7)Client Key Exchange Client
(8)Certificate Verify Client
(9)Change cipher spec Client
(10)Finished Client
(11)Change cipher spec Server
(12)Finished Server

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

  • 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.crl -noout -text

文/马哥Linux团队
文章出处:运维部落

本文链接:https://www.yunweipai.com/8907.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部