写在前面:

    博客书写牢记5W1H法则:What,Why,When,Where,Who,How。


本篇主要内容:

● 安全协议

● 数据安全问题及解决方案

● 密钥算法及通讯过程

● 使用OpenSSL命令行工具创建私有CA、签发证书、维护crl证书吊销列表



回顾:

   资源子网:关注数据包组成(应用软件)

   通讯子网:关注数据传输过程(linux内核来实现)

   TCP/IP:

      应用层协议:http/ftp...

      传输层协议:tcp/udp/sctp

      互联网层协议:ipv4/ipv6

      物理层:ppp,以太网

   主机通讯:

      本机不同进程:IPC,message queue,shm,semerphor

      不同主机进程socket(是由成对的IP:port组成的,client IP:port <--> Server IP:port)

         不同主机通讯需要先连接到port,进而找到通讯进程,所以port是被进程独占的。进程使用端口需向内核注册使用。

         不同主机通讯,服务端端口必须一直处于监听(listen)状态以供客户端访问。而客户端通过约定俗成来找到常见服务的端口(如http服务的80端口,访问时不必明确指出);通过DNS服务来找到服务端IP地址。

         端口分配:

            1-1024:系统服务占用(如80、22、21、)

            < 4W :半随机,有一些不太常见的服务占用(mysql 3306,oracle 1521)

            > 4W :随机

安全协议:

   SSLSecure Sockets Layer(安全套接字层)

      版本:V1.0 V2.0 V3.0(现用)

   TLSTransport Layer Security(传输层安全)

      IETF:1999年

      V1.0 V1.1 V1.2(现用) V1.3

   SSL、TLS协议分层设计

      1、最底层:基础算法原语的实现,aes, rsa, md5

      2、向上一层:各种算法的实现; 

      3、再向上一层:组合算法实现的半成品;

      4、用各种组件拼装而成的各种成品密码学协议软件;

   SSL、TLS协议是一个公共功能库,在传输层与应用层之间的半层。当应用程序调用时使用,不调用则不使用。

   如:http服务调用SSL或TLS功能库之后,就转换成了安全的https服务了。

wKioL1cGgK2Q3YzmAAAJnIBxp2c567.png



安全的目标:

   保密性:confidentiality

   完整性:integrity

   可用性:availability

***类型;

   威胁保密性:窃听、通信量分析

   威胁完整性:更改、伪装、重放、否认(通信中的一方)

   威胁可用性:拒绝服务(DoS)

解决方案:

   (1)技术上:

      加密解密:

      使用某种算法得到非明文信息,而参与算法的一串字符即为密码。

         传统加密方法:

            替代加密算法、置换加密算法

         现代加密方法:

            现代块加密方法:

               将整个数据分割成多个块,单独进行加密,进行复杂的运算,使得必须得到全部数据和密码才能够解密。

   (2)服务:

      使用安全服务,可抵御***的服务。

         认证机制

         访问控制机制

         密钥算法和协议


密钥算法和协议

   为了解决加密解密传输过程中,密码交换过程的安全的服务。

   对称加密:

      特点:

         (1) 加密解密使用同一个密钥

         (2) 将原始数据分隔成为固定大小的块,逐个进行加密

      缺陷:

         (1) 密钥过多(对服务器端来说,会产生大量密钥)

         (2) 密钥分发困难

      常用算法:

         DES:Data Encryption Standard(已不安全)

         3DES:Triple DES(64bits)

         AES:Advanced Encryption Standard(128bis、192bits、256bits、384bits)

         Blowfish

         Twofish

         IDEA

         RC6

         CAST5

   非对称加密

      特点:

         成对出现公钥和私钥;

         公钥加密,必须用私钥解密;

         私钥加密,必须用公钥解密。

      公钥:

         从私钥中提取产生,可公开给所有人,pubkey。

      私钥:

         通过工具创建,使用者留存,必须保证私密性,secret key。

      用途:

         数字签名:

            私钥加密,公钥解密。用于使接收方确认发送方身份。

         密钥交换IKE(Internet Key Exchange):

            公钥加密,私钥解密。发送方使用对方公钥加密一个对称加密密钥,并发送给对方。

            密钥交换也可以使用DH(Deffie-Hellman)来实现

         数据加密:

      常用算法:

         RSA:可用于签名和加解密

         DSA:仅签名

         ELGamal

      非对称加密方式通讯过程:

wKioL1cGga-wkr-aAAA-dYmKcsA643.png


   单向加密

     特征:

         提取数据指纹。只能加密,不能解密

         定长输出

         雪崩效应。初始结果的微小改变导致结果的巨大变化

      功能:

         完整性验证

      常用算法:

         md5:Message Digest 5,128bits定长输出

         sha1:Secure Hash Algorithm 1,160bits定长输出,即40个字母数字的组合

            sha224/sha256/sha384/sha512

   认证协议

   密钥交换

      常用算法:

         RSA

         公钥加密

         DH

            此算法通过随机大质数的数学算法得到,不会将密码在互联网上传送,比公钥加密的方式更具优势。

         ECDH(椭圆曲线DH)

         ECDHE(临时椭圆曲线DH)

      

CA:

   非对称加密的过程中,由于通讯双方互不认识,为了正确的获得对方的公钥,防止中间人***,我们需要一个双方都认可的第三方来认证,而这个第三方就是CA。

   CA为通讯双方签发证书(证书中含有公钥),为双方身份提供担保。


PKI:Public Key Infrastructure

   即公钥基础设施

   组成部分:

      签证机构:CA

      注册机构:RA

      证书吊销列表:CRL

      证书存取库:

   X.509v3

    定义了证书结构及认证协议标准

      版本号:X.509目前有3个版本,最多用的是v3版本

      序列号:本章证书是CA签发的第多少张证书

      签名算法ID:数字签名中单向加密所使用的算法

      发行者名称:CA的名称

      有效期限

      主体名称

      主体公钥

      发行者的唯一标识

      主体的唯一标识

      扩展信息

      发行者签名


SSL会话步骤:

   (1) 客户端向服务器端索要并验证证书;

   (2) 双方协商生成“会话密钥”;

   (3) 双方采用“会话密钥”进行加密通讯;

      其中1、2步骤为握手阶段(Handshake)

      SSL Handshake Protocol:

         第一阶段:ClientHello:

            支持的协议版本,比如tls 1.2;

            客户端生成一个随机数,稍后用户生成“会话密钥”

            支持的加密算法,比如AES、3DES、RSA;

            支持的压缩算法;

         第二阶段:ServerHello

            确认使用的加密通信协议版本,比如tls 1.2;

            服务器端生成一个随机数,稍后用于生成“会话密钥”

            确认使用的加密方法;

            服务器证书;

         第三阶段:

            验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)            

            发送以下信息给服务器端:

               一个随机数;

               编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

               客户端握手结束通知;

         第四阶段:

            收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;

            向客户端发送如下信息:

               编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

               服务端握手结束通知;


linux系统上密钥算法和协议的实现工具:

   GPG(pgp)

   OpenSSL(ssl)

      组成:

         libencrypto:库,加密解密算法的实现

         libssl:库,SSL半层功能库的实现,用于通讯

         openssl:命令行工具


openssl命令行工具实现密钥算法与协议:

openssl

   子命令:

      标准命令 

         enc, ca, req, genrsa, ...

      消息摘要命令

         dgst子命令

      加密命令

         enc子命令

   实现对称加密:

      工具:openssl  enc

      其他工具:gpg

      支持的算法:3des, aes, blowfish, towfish

      enc命令:

         加密

            ~]# openssl  enc  -e  -des3  -a  -salt  -in FILE   -out FILE_AFTER_ENC

         解密

            ~]# openssl  enc  -d  -des3  -a  -salt  -out FILE   -in FILE_AFTER_ENC

   实现单向加密:

      工具:openssl dgst

      其他工具:md5sum, sha1sum, sha224sum, ...

      dgst命令:

         ~]# openssl  dgst  -md5  /PATH/TO/SOMEFILE

      生成用户密码:

         工具:openssl passwd

         其他命令:passwd命令

         命令:

            ~]# openssl  passwd  -1  -salt  SALT

      生成随机数

         工具:openssl  rand

         命令:

            ~]# openssl  rand  -hex  NUM

            ~]# openssl  rand  -base  NUM

   公钥加密:

      加密解密:

         算法:RSA,ELGamal

         工具:openssl  rsautl, gpg

      数字签名:

         算法:RSA, DSA, ELGamal

         工具:openssl  rsautl, gpg

      密钥交换:

         算法:DH

   生成密钥对:

      生成私钥: 

         ~]# (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)

            NUM_BITS为2的n次方

      提出公钥: 

         ~]#  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout

   创建私有CA:

      工具:openssl、OpenCA

      配置文件/etc/pki/tls/openssl.cnf

         定义了证书目录、序列号文件、数据库文件等等

      目标:

         在确定配置为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;

               生成过程需要输入一些信息:

                  国家代码,省、城市、公司名、部门名、主机名、Email

         (3) 为CA提供所需的目录及文件;

            ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}

            ~]# touch  /etc/pki/CA/{serial,index.txt}

            ~]# echo  01 > /etc/pki/CA/serial

               serial为序列号存储文件,“01”将作为第一个CA签发的证书的序列号,文件为空时不能正确签发证书。


   其他需安全通信的服务器向CA请求签发证书:

      步骤:(以httpd为例)

         (1) 用到证书的主机生成私钥;

            ~]# mkdir  /etc/httpd/ssl 

            ~]# cd  /etc/httpd/ssl

            ~]# (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

            注意:这里填写的信息应该与CA证书保持一致,主机名必须与外界访问的域名相同。

         (3) 将请求通过可靠方式发送给CA主机;

         

         (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

         (5) 将证书通过可靠方式发回给请求主机


   吊销证书:

      步骤:

         (1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):

            ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -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 

            查看crl文件:

            # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text