一、加密解密介绍

   

    在OSI模型和tcp/ip模型中,应用发送某个数据到服务器,通过很多条路径才能到达服务器,在发送的路上,因为数据是明文,且任意人都可以查看,这就给数据带来了风险。因此,加密就很有必要了。

            wKioL1cMUjvChSAsAAAkTPwwEz0469.png                

1、加密算法

  加密在很早之前就已经存在。远在计算机还没问世之前世界上就已经出现了,例如中国古代的虎符和信牌,或者矾书等。到现在为止密码或加密技术已经广泛应用在生活中的各种场景中,尤其是在这个互联网时代中加密技术更是发展到了极致。

  1)对称加密

   通信双方使用同一个密钥对明文进行加密和解密。这样就确保了就算是通信的信息被第三方知道,由于没有密钥也不能解密被加密的信息;这种加密方法确保了数据的安全性,但使用的密钥必须由安全的方式在两方之间传输。 


算法:DES:Data Encryption Standard

        3DES:Triple DES

        AES:Advanced Encryption Standard (128bits,192bits,256bits,348bits)高级加密

        Blowfish

        Twofish

        IDEA

        RC6

        CAST5


    

     缺陷:

   1、密钥过多

   2、密钥分发困难

       

 2)公钥加密

  公钥加密也称非对称加密,密钥分为私钥和公钥。其中公钥是从私钥中提取的。而且加密解密的方式是:公钥加密必须用与之对应的私钥来解密,反之亦然;

  一般私钥只有加密者本身具有,对应的公钥所有人都可以得到。公钥加密主要可以实现对身份的验证。例如,A用私钥加密一个文件要送给BB接受到后只有用与A的私钥相对于的公钥解密,如果能解密则说明这个文件是A发送的。

    

     算法:RSA,DSA,ELGamal

 DSS:Digital Signature Standard

 DSA:Digital Signature Algorithm


    


 用途:

数字签名:主要在于让接收方确认发送方身份

密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方


 3)单向加密

  单向加密的特点是只能加密不能解密。而且这种加密算术也称为hash散列函数,这种算法会把不同长度的数据压缩成固定长度的一段字符。

  这种加密方法一般用来验证数据的完整性。发送方用单向加密加密数据后会得到一个特征码,接收方收到数据后也用同样的算法加密数据也得到一个特征码。把这两个特征码作比较如果相同则说明数据没有被改动过。

   

算法:md5:Message Digest 5,128bits

   sha1:Secure Hash Algorithm 1,160bits

sha224,sha256,sha384,sha512

 

 二、加密解密过程

  wKioL1cMVmjhsWK5AAC27Lo_n10652.jpg


 上图中描述了发送方加密数据并传送给接收方,接收方解密的过程。下面来详细解释一下这个过程:

   

   加密过程:   

     1、使用单向加密算法加密明文数据,生成一个特征码。保证了数据的完整性。   

     2、Bob用自己的私钥加密特征码,附在明文数据后面(使之成为一个新数据),保证了身份认证。 (加密后的特征码称为数字签名)

     3、Bob利用对称加密算法(一次性密钥)对所有的数据加密。   

     4、Bob再用Alice的公钥(通过可靠的手段获取,第三方认证机构CA)对生成的密钥进行加密。

  

  解密过程:   

     1、使用Alice的私钥先解密获取密钥。   

     2、用得到的密钥去解密加密了的数据和特征码。   

     3、使用Bob的公钥去解密特征码,得到在Bob发送数据的特征码。   

     4、Alice用同样的加密算法去计算数据的特征码   

     5、再比较3,4步中的特征码是否一致。

  

   三种算法结合,以实现可靠的通信(保证数据的完整性,私密性,用户认证)



 三、PKI和CA

 

  在上面的介绍中,虽然用到了众多加密算法,但公钥是在网络中传输,双方无法验证其可信度,则需要第三方权威认证机构(CA)才能保障

 

PKI是Public KeyInfrastructure的首字母缩写,翻译过来就是公钥基础设施;PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。


    PKI:公钥基础设施:

签证机构:CA

注册机构:RA

证书吊销列表:CRL

证书存取库:



CA是PKI的核心,负责管理PKI结构下的所有用户的证书。通信双方认证对方身份必须要通过CA。

常用的证书格式是 x509 格式,它包含有下面的信息:

版本号(version)

序列号(serial number),CA 用于唯一标志此证书

签名算法标志(signatur algotithm ientifier)

发行者的名称,即 CA 自己的名称

有效期,起始日期和终止日期

主体自己的公钥

发行商的唯一标识

整数主题的唯一标志

扩展信息

签名:CA 对此证书的数字签名


wKiom1cMV_XBUkd2AACHls86u7w043.jpg四、SSL/TLS协议


SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。(顺便插一句,网景公司不光发明了 SSL,还发明了很多 Web 的基础设施——比如“CSS 样式表”和“JS 脚本”)
为啥要发明 SSL 这个协议捏?因为原先互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。
到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。
很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段‘



SSL:安全套接字层(ssl 1.0,ssl 2.0,ssl 3.0)

TLS:传输层安全(tls 1.0,tls 1.1,tls 1.2, tls 1.3)


SSL会话主要三步:

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

双方协商生成“会话密钥”

双方采用“会话密钥”进行加密通信


第一阶段:ClientHello:

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

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

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

  支持的压缩算法


第二阶段:ServerHello

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

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

  确认使用的加密方法

  发送服务器证书


第三阶段:

  验证服务器证书,确认无误后取出其公钥(发证机构、证书完整性、证书持有者、证书有效期、吊销列表),发送以下信息给服务器端:

一个随机数;

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

客户端握手结束通知;


第四阶段:

  收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到得“会话密钥”,向客户端发送如下信息:

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

服务端握手结束通知

  

 五、OpenSSL

  openssl 是一个强大的命令行工具,它可以实现对称加密/解密,非对称密钥的生成,单向加密提取特征码,对密码单向加密,生成随机数等等功能

    

   openssl由三部分组成:

libencrypto库

libssl库

openssl多用途命令行工具

   

   openssl 从多子命令,分三类:

标准命令

消息摘要命令(dgst子命令)

加密命令(enc子命令)


      wKiom1cMZHrB9qntAABnu4qcTSc443.png


标准命令:enc,ca,req,genrsa,...


      1、对称加密:

  工具:openssl enc,gpg

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


 enc命令:

  

对文件加密:


  wKioL1cMaF7ACmwoAACJ8eWeIzo704.png

   

   对加密文件解密:

                                                             wKiom1cMaTbz11CWAABK38y1Rvs586.png


  

  2、单向加密:

工具:openssl dgst,md5sum,sha1sum,sha224sum,..


  dgst命令:

       

       计算文件特征码

        wKiom1cMa6CwSz2RAAARd89VRps484.png

       

  3、用指定的salt生成用户密码

         wKioL1cMb7_AO9OzAABY3iRCHbo774.png

     

 4、生成随机数

      工具:openssl rand

         

        基于16进制,10个字节

           [root@localhost ~]# openssl rand -hex 10

            123723c30b7f4ee983b8

    

        基于base64,10个字节,使用时要把=去掉

         

           [root@localhost ~]# openssl rand -base64 10

           todxC2dH2wmuBQ==

    

       用命令替换生成随机数,每次生成的随机数都不同

            

            [root@localhost ~]# openssl passwd -1 -salt $(openssl rand -hex 4)

            Password: 

            $1$cc692c2e$GgsplB0lEtKPkGN4wvpY30 

            [root@localhost ~]# openssl passwd -1 -salt $(openssl rand -hex 4)

            Password: 

            $1$25d87a6b$W3LoQ0fTyoO1ebRurO.PI1

            [root@localhost ~]# openssl passwd -1 -salt 25d87a6b

            Password: 

            $1$25d87a6b$W3LoQ0fTyoO1ebRurO.PI1 认证相同时,随机数一致


 5、公钥加密:

     

    5.1 加密解密:

    算法:RSA,ELGamal

    工具:openssl rsault,gpg


    5.2 数字签名:

    算法:RSA,DSA,ELGamal

    工具:openssl rsault,gpg


    5.3 密钥交换:

    算法:DH


     

    5.4 生成密钥:

     

   生成私钥:~]#(umask 077;openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE 

     

      [root@localhost ~]# (umask 077; openssl genrsa -out /tmp/mykey3.private 2048)

      Generating RSA private key, 2048 bit long                        

      ...............................................................................

      .............+++

     .................+++

      e is 65537 (0x10001)


  

    提出公钥:~]#openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout


    

    [root@localhost ~]# openssl rsa -in /tmp/mykey3.private  -pubout

    writing RSA key

    -----BEGIN PUBLIC KEY-----

    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyekVqCskbq4DaX/xLs+K

    ulelRpA51evvNGKevM+3mn5SZuD8/gdTMqBrx4dbkHJFmp0EzimbPkbLZFxc6oJF

    UsO+iUG2IVjN/Dy4Bic9f/0BUXVAaqiwzSSvsY6vdq9rsiOEeY/Hb3Hp1a/EP9PB

    w0GFiUhKb0UWQYO61ZXkcKx1B3FLZI28WgZXVyRHaoN4Qs28YUlunvM+4cT2uTf/

    CUvxilpFCVr/2zy5gAza9DqhmjQh6ebigT7c8urQFoRX5orKk1BHA3HBVRq3s7oR

    r02BguvNWdGwN6PCiDUWwHSGcNP3VwJwC8KCZVZbEt6bfYgx7Tz4jlAtIWg1MhP2

    7wIDAQAB

    -----END PUBLIC KEY-----



 六、openssl构建私有CA

    私有 CA 先要生产 CA 自己的证书,CA 证书的路径在 /etc/pki/tls/openssl.conf 中配置

   


    6.1构建私有CA:

在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可


    步骤:


    (1)生成私钥:

wKiom1cMe0Pg7mr-AAAYQLseObs855.png



    (2)生成自签证书;

wKioL1cMgS6iEwniAABq-DFE0gs993.png

     自签署证书 cacert.pem


   命令中选项的意义

     -new:生成新证书签署请求

-x509:生成自签格式证书,专用于创建私有CA时

-key:生成请求时用到的私有文件路径

-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书

-days:证书的有效时长,单位是day;


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

       [root@localhost private]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}

       [root@localhost private]# touch /etc/pki/CA/{serial,index.txt}

       [root@localhost private]# echo 01> /etc/pki/CA/serial



  6.2要用到证书进行安全通信的服务器,需要向CA请求签署证书:


   步骤:(以httpd为例)
   

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

    [root@localhost ~]# cd /etc/httpd/conf

    [root@localhost conf]# ls

    httpd.conf  magic

    [root@localhost conf]# cd ..

    [root@localhost httpd]# ls

    conf  conf.d  conf.modules.d  logs  modules  run  

    [root@localhost httpd]# mkdir ssl

    [root@localhost httpd]# cd ssl/

    [root@localhost ssl]# ls

     [root@localhost ssl]# (umask 077; openssl genrsa -out http.key 2048)

      Generating RSA private key, 2048 bit long modulus

      ...............................................................................

      ..........................................+++

     e is 65537 (0x10001)

     [root@localhost ssl]# ll

    total 4

    -rw------- 1 root root 1675 Apr 12 13:07 http.key

 

  (2) 生成证书签署请求 

    [root@localhost ssl]# openssl req -new -key  httpd.key -out httpd.csr -days 365

  (3) 将请求通过可靠方式发送给CA主机;
    U盘复制或其它可靠方式                


  (4) 在CA主机上签署证书;
    [root@localhost ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

                    
  查看证书中的信息:

    [root@localhost ~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject 


 七、吊销证书:


  步骤:

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

    [root@localhost ~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject

   (2)CA主机吊销证书

先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;


吊销:

[root@localhost ~]#openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem


其中的SERIAL要换成证书真正的序列号;


   (3)生成吊销证书的吊销编号(第一次吊销证书时执行)

[root@localhost ~]#echo 01 >/etc/pki/CA/crinumber


   (4)更新证书吊销列表

[root@localhost ~]# openssl ca -gencrl -out thisca.crl


查看crl文件:

[root@localhost ~]#openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text