SSL及其开源实现OpenSSL+创建私有CA

SSL:Secure sockets Layer 安全套接字层,是工作于传输层和网络之间,利用加密和解密技术,保障应用层各应用程序在网络传输过程中安全传输。主要版本有V1.0, V2.0, V3.0,目前常用版本是V2.0.

SSl会话主要三步:

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

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

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

其中前两步称为会话握手,主要可分为四个阶段:

  第一阶段:ClientHello:客户端向服务器端发送会话,内容如下:

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

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

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

    支持的压缩算法;

  第二阶段:ServerHello:服务端器向客户端回应会话,内容如下:

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

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

    确认使用的加密方法;

    发送服务器证书;

    索要客户端证书;(一般是不需要此过程的)

  第三阶段:客户端收到服务器证书的操作:

    验正服务器证书,在确认无误后取出其公钥;(验证过程不再详述,可参考上篇博客。)

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

     一个随机数;(用于服务器公钥加密)

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

     客户端握手结束通知;

  第四阶段:服务器端收到客户端发送信息的作操:

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

    向客户端发送如下信息:

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

     服务端握手结束通知;

以上便是SSl简单的工作原理,那么SSL只是一种协议,他是如何具体实现这种安全机制的呢?下面我们来说一下SSL的开源实现OpenSSL。

OpenSSL,即开源实现SSL功能的工具,由三部分组成:

  libencrypto加密解密库,仅用于加密解密;

  libssl库,用于安全传输;

  openssl多用途命令行工具;

其中libencrypto和libssl主要由开发者使用,这里我们重点介绍openssl多用途命令行工具。

openssl由众多的子命令,分为三类:

  标准命令;

  消息摘要命令;(由dgst子命令调用)

  加密命令;(由enc子命令调用)

  查看当前openssl版本的命令为:openssl version

wKiom1cJv3eDvudaAAAJFVBnlvc052.png

  常用的标准命令有:enc(加密)、ca(建立私有CA)、req(申请证书)、genrsa(生成rsa算法密钥对)、rand(生成随机数)、dgst(单向加密)...

下面我们就来使用openssl工具手动加密:

对称加密:

  工具:openssl enc

  支持算法有:3des,aes,blowfish....

  enc命令:

    加密:~]# openssl enc -e -des3 -a -salt -in file -out file

     -e:表示加密;

     -des3:表示加密算法为3des,也可以使用别的加密算法;

     -a:以base64编码格式显示,默认为二进制格式;

     -salt:表示“加盐”;

     -in:表示要加密的文件;

     -out:表示加密后的文件;

    例如:用3des加密算法给/etc/fstab文件加密,加密密码为mageedu:

wKioL1cJw6-TR73vAADWREG5BlA489.png

   加密后可查看加密后的文件

    解密:~]# openssl enc -d -des3 -a -salt -in file -out file

     -d:表示是解密;

    例如:将上面加密码了的文件解密:

wKioL1cJx1fSaHJ_AABelz7Cg9M535.png

单向加密:

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

  dgst命令:

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

     -md5:表示MD5算法;也可以使用其它算法;

   例如:对fstab文件用MD5算法做单向加密,取其特征码:

wKioL1cJyMzQw1K4AAAOIK8utIs405.png

    也可以便用md5sum命令对其做单向加密,取其特征码:

wKioL1cJyRej0QO9AAAMnzN6EAo427.png

    对比发现,特征码是一样的,只是显示方式不一样。

生成用户密码:

  工具:openssl passwd,passwd

   openssl passwd -1(MD5) -salt SALT

     -1:表示MD5算法;目前只支持MD5算法;

     SALT:表示随机数,可以手动自己加,也可以使用命令获取;

    例如:获取mageedu加密后的密码:

wKiom1cJyjfjxdqMAAAfJ8LT9sk304.png

    发现随机数一点的变化,会造成密码很大的变化;

生成随机数:

  工具:openssl rand

   ~]# openssl rand [-hex|-base64] NUM

     -hex:表示以十六进制格式显示;

     -base64:表示以base64编码格式显示;

     NUM:表示随机数字节数;

    例如:生成一个10字节的随机数,以十六进制格式显示;

wKiom1cJy7qTHHE6AAATwjNPG6A833.png

    相同命令发现,随机数随机生成的,每个都不一样。

公钥加密:

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

     由于私钥保密性比较重要,所以私钥只允许属主有读写权限,所以用umask 077,生成的私钥权限将自动

  生成为600的权限。

     genrsa子命令:表示生成rsa算法的密钥对;

     -out:表示私钥生成后保存的路径;

    NUM_BITS:表示生成私钥的位数;

    例如:生成一个1024位的私钥,保存为/tmp/mykey

wKiom1cJ0BGh3rsbAACJaB9fMl8446.png

     生成1024位私钥,且权限为600;

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

    rsa:表示为rsa算法;

    -in:表示私钥位置;

    -out:表示提取公钥后存放位置;

    -pubout:表示提取公钥;

    例如:从上面的私钥中提取对应公钥,保存为/tmp/pubkey:

wKioL1cJ0mPzuPFVAAAyUTilCSg225.png

以上介绍了使用openssl工具各种算法手动加密的过程,接下来将介绍如何使用openssl工具来建立私有CA。

CA:有公共CA和私有CA,公共CA有专门机构来负责管理,这里我们只介绍小范围内的私有CA。

  建立私有CA有两种工具:openssl和OpenCA,openssl在小范围内使用,OpenCA一般在企业内使用,此处我们

介绍小范围内的私有CA的创建,使用openssl工具:

在创建私有CA前我们先CA的配置文件:/etc/pki/tls/openssl.cnf内包含CA的一些常用路径:

   CA工作目录:/etc/pki/CA

  颁发证书存放目录:/etc/pki/CA/certs

  吊销证书存放目录:/etc/pki/CA/crl

  新颁发证书存放目录:/etc/pki/CA/newcerts

  颁发证书索引存放文件:/etc/pki/CA/index.txt

  颁发证书序列号存放文件:/etc/pki/CA/serial

  吊销证书序列号存放文件:/etc/pki/CA/crlnumber

  CA自己私钥存放文件:/etc/pki/CA/private/cakey.pem

  CA自签证书存放文件:/etc/pki/CA/cacert.pem

那么构建私有CA就是在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需要的目录及文件即可;

  工具:openssl req

  步骤:

    (1)生成私钥;

      ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

wKiom1cJ4DDQMxI-AAA3t47Jd6w221.png

      注意:私钥存放位置必须为/etc/pki/CA/private/且名称必须是cakey.pem这是在配置文件中规定的。

    (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;

wKiom1cJ4bywWSaoAABkvzjUgw8260.png

        自签时会填写相应私有CA的一些信息;

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

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

        创建certs,crl,newcerts这三个目录文件,已存在的话无需创建;

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

        创建证书序列号和证书索引文件serial,index.txt;

wKioL1cJ4-LSu08-AAATDvxq4MU764.png

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

        第一次创建证书时,需将证书序列号输入到serial文件中;

wKiom1cJ466yys0wAAAMeSNqDFE453.png

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

  步骤:以httpd为例:

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

      ~]# mkdir /etc/httpd/ssl 

      ~]# cd /etc/httpd/ssl

      ~]# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

wKiom1cJ5kCz2JmMAAAe5OV03fs682.png

    (2)生成证书签署请求;

      ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days365

wKiom1cJ5z7T4OSLAABq_qmV09g188.png

      申请时填写的信息要能和CA自签证书中信息要能对应;

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

      ~]#scp httpd.csr root@ipadd:/PATH/FILE

      由于此处实验是在同一网内,可用这种方式,实际可用多种方式,只要确保请求信息能安全到CA主机

wKioL1cJ6S3Cw4l5AAA23l0KXqo272.png

      在CA主机中查看确定是否收到:

wKiom1cJ6LKA9OauAAAchxm6JeM200.png

    (4)在CA主机上签署证书;

      ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

wKiom1cJ6Wnx08nxAACIrcpskYY156.png

    (5)将签署好的证书发给申请主机:

      ~]#scp /etc/pki/CA/certs/httpd.crt root@ipadd:/PATH

      此处同样使用scp命令,不再多说。

wKioL1cJ6wXxBFqgAAA1KG3JBt4773.png

      可在申请证书的主机上查看是否收到签署的证书:

wKiom1cJ6o_gcjG6AAAHLPkvt2o565.png

至此,申请签署证书已经完成,可以使用签署的证书。注意:申请完成后,需要在申请主机和CA主机上把申请信息删除,保证安全。此处不再演示。

如果自己私钥丢失,需要向CA申请吊销证书:

  步骤:

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

      获取吊销证书方法:

        ~]# openssl x509 -in /PATH(证书路径) -noout -serial -subject

wKioL1cJ70Hz01zjAAATNO2MR8E037.png

    (2)CA主机吊销证书:

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

      吊销:# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

wKiom1cJ77fwC8LPAAATh2eGTkA019.png

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

      # echo 01 > /etc/pki/CA/crlnumber

wKioL1cJ8UXAMWl4AAAL4Ev3mR8995.png

    (4)更新证书吊销列表:

      # openssl ca -gencrl -out thisca.crl

wKioL1cJ8cGRNHLJAAASKGlL8DI178.png

      也可以查看crl文件:# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

wKioL1cJ8mXSuOA3AABcSW-HqUk599.png

至此,吊销证书已完成,不过在实验情况下,一般不会用到吊销证书,大家只需了解就行。

那么现在SSl和OpenSSL以及建立私有CA都已经跟大家介绍完成,可能其中有些不合理的地方,希望大家相互学习相互指教,谢谢!







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章