浅谈Openssl与私有CA搭建

    随着网络技术的发展、internet的全球化,信息共享程度被进一步提高,各种基于互联网的应用如电子政务、电子商务日益增多并愈加被人们工作和生活依赖。但是,由于互联网的开放性和通用性,网络上的信息是对所有人公开的,这就使网络上的数据传输过程中存在被窃听、篡改等安全隐患,并极有可能给用户带来不可估量的损失。为此,各种保证数据在互联网上安全传输的机制纷纷出现,而OpenSSL(Sercure Socket Layer)技术就是其中之一。

    什么是SSL?

    SSL(Sercure Socket Layer)  由于数据在传输层和网络层传送以及封装均已明文方式存在,不能加密,而应用层只能对数据本身加密不能保证数据传过程中的安全,SSL则是工作在TCP/IP协议与应用层协议之间,实现数据传输的安全和数据完整性的一种协议。该协议能通过多种加、解密方式结合证书机制来完成安全认证、访问控制、数据保密性、数据完整性和通讯的不可否认性等功能。而OpenSSL则是SSL的开源实现。

    数据的加密、解密

    根据密码算法和协议,数据的加密、解密方式可以分为四类:

      1、对称加密   所谓对称加密是指通信的双方使用同一个密钥来进行加解密。算法使用DES、AES、Blowfish、Twofish、IDEA、RC6、CAST5等,使用该加密方式的客户端,对每一个通讯对象都要维护一个密钥并且无法保证密钥交换、身份验证和数据完整性验证,并且易于受到基于字典穷举方式攻击。

      2、非对称加密 又称公钥加密。使用此种加密方式通讯方会通过算法生成成对存在的私钥和密钥,使用私钥加密的数据只能用自己的公钥解密,反之亦然。因此可以以较为公开的方式将公钥传送给通讯对方,而对方可以通过是否能使用此公钥来解密相应的数据信息来验证通讯方的身份,完成网络通讯安装的身份验证。该加密方式使用的算法有RSA(用于加密和身份验证)、DSA(只能实现身份验证)EIGamal等,由于这些算法的密钥位数过长(一般都是2048位及以上),因此一般不用于加密数据,只是用于身份验证。

      3、单向加密   又称数据完整性校验加密方式,可以利用算法计算数据指纹信息,此种方式得出的数据指纹信息具有定长和雪崩效应(数据中的微小变化将会导致数据指纹信息的巨大变化)的特性,常用来实现数据完整性的验证。

    网络数据传输的加密、解密过程

         blob.png

    如上图场景,加密解密过程如下:

         第一步,用户B向服务器A发起访问请求,并携带自己的证书信息。

         第二步,服务器A收到用户B发来的证书后,查找系统内置或通过其它可靠途径获得证书公钥解密(非对称加密)证书的签名信息,完成CA的合法身份验证,并得到签名信息的特征码,而后使用同样的算法提取签名信息的特征码与之对比,完成签名信息的完整性校验。随后从用户B中发来的证书中提取用户B的公钥信息,最后将自己的证书发送给用户B。

         第三步,用户B收到服务器A发来的证书,使用与之同样的证书验证流程验证证书的合法性以及完整性,提取服务器A的公钥信息。

         第四步,服务器A将需要发送给用户B的数据分段后通过以下步骤对其进行加密(以数据段S0为例进行详解):

                 1、使用单向加密算法,提取数据的SO的特征码信息。 #用到单向加密

                 2、使用自己的私钥加密上一步提取出来的特征码信息,而后将其附在数据S0后面,组成数据段S1。#用到公钥加密

                 3、通过算法生成密钥,利用对称加密对数据段S1进行加密,生成加密后的数据段S2。#用到对称加密

                 4、使用用户B的公钥将上一步生成的密钥加密后将其附在数据段S2后面,生成数据段S3。最后将S3发送给用户B。#用到公钥加密

         第五步,用户B收到服务器A发来的数据段S3后通过一下步骤进行解密:

                 1、使用自己的私钥解密数据段S3,得到服务器A生成的对称加密密钥和数据段S2。#使用公钥加密和对称加密完成密钥交换

                 2、使用上一步解密得到的密钥解密数据段S2得到加密后的数据特征码(由服务器A通过单向加密基于数据段SO提取而得)和明文数据段S0。

                    #用到对称加密

                 3、使用自己的私钥解密上一步得到的数据特征码,然后使用与服务器A相同的单向加密的算法提取明文数据S0的特征码与之比对,比对结果正确则说明数据时完整的。#通过单向加密和公钥加密同时完成整数据完整性认证和身份验证

    PKI 公钥基础设施

    通过上面的详述,我们已经对网络数据传输加密解密的过程有了清晰的认识,而这个过程中的关键之处即通讯双方公钥(证书)的获取是要依赖于PKI这个服务平台来实现的,下面来详细的了解一下它。

      PKI(Public Key Infrastructure) 公共基础设施,是一种提供公钥加密和数字签名的平台,目的是为了管理密钥和证书。一个完整的有效的PKI由如下组成部分:

         1、认证机构CA       数字证书的申请及签发机关,CA必须具备权威的特性。

         2、数据证书库      用于存储已签发的数据证书和公钥,用户可由此获得所需的其他用户的证书以及公钥。

          3、密钥备份和恢复系统 为防止用户解密密钥丢失造成数据无法解密而存在,此功能必须由可信机构完成,并且密钥备份只备份解密密钥,签名密钥为保证其唯一性不做备份。

          4、应用接口(API) 为方便用户使用加密、数字签名等安全服务而提供的良好的应用接口,使得各种应用能以安全、一致可信的方式与PKI交互,确保网络环境的完整性和易用性。

          5、证书作废系统    PKI的必备组件,用来作废那些由于于用户密钥丢失、证书过期、以及证书持有者身份变更等导致证书信息已不可用的证书。

       CA     

       通常来说,CA是PKI系统的核心,为实现证书发放、证书更新、证书撤销和证书验证等功能,CA由以下几个部分组成:

          1、注册服务器:用于实现客户在网上提出证书申请和填写证书相应的证书申请表。

          2、证书申请受理和审核机构:用来接受客户的证书申请并进行审核。

          3、认证中心服务器:用于数字证书的生成、发放,提供发放证书的管理、证书吊销列表的生成和处理。

       具体实施时,CA要做以下工作:

          1、验证并标识证书申请者的身份。

          2、确保用于证书签名的公钥加密密钥对的保密性。

          3、确保签名过程的安全性,确保签名私钥的安全性。

          4、证书资料(证书序列号、CA标识等)的管理。

         5、确保并检查证书的有效期。

          6、确保数字签名证书的唯一性。

          7、及时更新并发布证书吊销列表。

          8、维护证书签订过程的日志记录。

          9、将证书发送给申请人。 

      数字证书的通用格式为X509格式,其证书结构如下图:

          blob.png

    OpenSSL

   在我们的linux平台上,加密和解密、PKI以及CA等一系列的保证网络数据安全传输的机制,都是通过openssl这个开源的工具来实现的,因此能深刻的了解它对于学习后面的高级相关应用是至关重要的。

   执行yum -y install openssl,安装完成后,我么可以通过rpm -ql openssl来查看其安装后生成的、比较常用的路径和文件。如下图

   blob.png

   openssl是一个多用途的命令行工具,可以调用子命令分别实现加密、解密,创键私有CA以及CA管理的功能。

    blob.png

    openssl的用法

    1、查看openssl版本号 使用openssl version

    blob.png

    2、对称加密

     工具 openssl enc  算法DES 3DES AES Blowfish Twofish RC6 IDEA CAST5等。

     用法 openssl enc

              -e 加密操作

              -d 解密操作

              -ciphername 指定算法 

              -a 指定基于base64编码处理数据

              -in /path/from/somefile 指定需要加密的文件的

              -out /path/to/somefile 指定文件加密后存储位置

              -salt 添加字符串增加密码强度

    例:将/var/log/messages拷贝至/tmp/下使用DES算法进行加密解密,并使用cat查看验证。

       blob.png

      加密并验证 

       blob.png      

      解密并确认

    3、单向加密

      工具 openssl dgst,md5sum,sha1sum,chsum 

         openssl dgst -[md5|sha1] [-out /path/tosomefile] /path/form/somefile

             – [md5|sha1] 指定算法

             -out /path/to/somefile 将提取的特征码信息保存到指定文件,不指定输出到屏幕

                /path/from/somefile 指定需要执行单项加密的文件

     例:将/var/log/messages拷贝至/tmp/下,分别使用openssl dgst -md5 和md5sum对其进行单向加密

       blob.png

    4、加密用户密码

      openssl passwd -1 -salt SALT SALT一般是8位的字符串 (-1 指定使用md5进行加密,CentOS 6 一般使用sha512)

     例:

      blob.png

     其中-salt后面的字符串可以使用随机获取字符来替代,

      openssl 随机生成字符串 

      openssl rand [-hex|-base64] number (number指定生成随即字符串的位数)

              -hex 指定十六位编码模式

              -base64 指定base64编码模式

     例:blob.png

     5、公钥加密

      生成密钥 openssl genrsa -out /path/to/keyfile number 

      例:

      blob.png

     提取公钥信息 

           openssl rsa -in /path/from/privat_keyfile [-out /path/to/pub_keyfile] -pubout 如果-out选项不指定则输出结果到屏幕


     blob.png

    6、搭建私有CA

    由于证书的注册费用相当昂贵,而有时候我们只是需要在公司内部或VPN相连的虚拟内网中利用CA认证来管理服务器资源,这个时候我们就可以利用openssl来搭建私有的CA服务器,用以签名、颁发证书,管理已签名证书和已吊销证书等。

    首先,配置服务器端 

          第一步,配置CA服务器的主配置文件,设定默认私有CA配置信息。

          blob.png

          blob.png

          第二步,初始化CA环境,在/etc/pki/CA/下建立证书索引数据库文件index.txt和序列号文件serial,并为证书序列号文件提供初始值。

          blob.png

          第三步,生成密钥,生成自签署证书。

           生成密钥并保存到/etc/pki/CA/private/cakey.pem

          blob.png

          生成根证书

          命令 openssl req 常用的选项如下

                      -new  生成新证书请求

                      -x509 特指生成根证书 而不是证书请求

                      -key /path/from/file_key.pem  指定生成的密钥文件(根证书必须是/etc/pki/CA/private/cakey.pem, 主配置文件中已定义)

                      -out /path/to/file_cert.pem   指定根证书的名字以及存放路径(必须是/etc/pki/CA/cacert.pem,主配置文件中已定义)

                      -days 证书的有效期限

          本CA的根证书创建:

          blob.png

         至此,CA搭建完毕。

    7、这台虚拟服务器配置了http服务,我们可以来为http服务器申请证书,并在本机签名证书来验证CA。

         第一步,创建目录/etc/httpd/ssl用来存放密钥文件和证书申请文件;创建密钥文件和证书申请文件

         blob.png

         第二步 签署,证书,由于节点和CA都在同一台主机,因此可以直接签署

              证书签署命令openssl ca -in /path/from/somefile.csr -out /path/to/somefile.crt -days -in指定证书请求文件,-out指定证书生成文件以及路径

         blob.png

      验证index.txt和serial序列号更新

        blob.png

    8、同样以http服务器为例,以一台主机作为节点验证私有CA

         第一步,创建目录/etc/httpd/ssl用来存放密钥文件和证书请求文件、证书;创建密钥文件、创建证书请求文件。

         blob.png

         第二步,将证书请求文件发送给CA;CA签完证书后将证书发送给节点主机

         节点与CA间的文件发送,使用scp (sercure cp)命令

         scp /path/from/somefile x.x.x.x:path/ (其中x.x.x.x是主机IP地址)

        blob.png

        已发送到CA主机,到CA上去签署证书

        blob.png

         CA签署完证书,并将证书发送回节点/root下,节点可以自定义存放至/etc/httpd/ssl/下。

        blob.png

       上图验证信息库。

    9、吊销证书

        把第8部分申请的证书吊销,用来验证吊销列表

        第一步,查看证书的序列号

        openssl x509 -in /path/from/certficate_file.crt -noout -serial -subject

                 x509 指定证书类型

                 -in /path/from/certficate_file.crt 指定需要吊销的证书

                 -noout 不输出多余信息

                 -serial 输出序列号 

                 -subject 输出摘要信息

       blob.png

       CA上查看index.txt比对subject信息

       blob.png

       第一次执行证书吊销要创建吊销列表文件,并传递初始值,然后吊销证书

       blob.png

       吊销证书

       openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem(SERIAL.pem是需要吊销的证书的序列号对应的证书文件)

       blob.png

      更新并生成吊销列表

      blob.png

      查看吊销列表

      openssl crl -in /path/from/some.crl -noout -text 

                  -in /path/from/somefile.crl 指定吊销列表文件

                  -noout 不输出额外信息

                  -text  文本显示

      blob.png

    如有错误之处,敬请指正!

      

     

      

       

       

             

               

            

           

                 

                      

                    

           

           

                

    

 

    

    








  

    

原创文章,作者:Silently,如若转载,请注明出处:http://www.178linux.com/4879