网络安全议题,几乎是业内人士避不开的话题,要做到网络安全,主要旨在三个方面的目标:保密性,完整性和可用性。本文在此主要对基础的加密和解密技术,ssl协议,以及ssl协议的实现实例做一些简要描述和梳理。


加密和解密:

    目前对于网络安全的***,很大部分集中在“威胁保密性的***”,也就是我们进场所说的数据泄露,加密和解密是目前最为直观的解决保密性问题的手段。

几种加密方式:

  • 对称加密;

     特点:加密和解密使用同一个密钥;将数据分割成多个固定大小的块,逐个加密;

     缺点:密钥过多(对于服务器端,需要与多人通信);密钥分发困难;

     算法:DES,3DES,AES等;

  • 非对称加密;

    特点:公钥加密的数据,只能够通过与之配对的私钥才能解密;反之亦然;

       私钥:secret key,通过工具创建,使用者自己保存,必须要保证私密性;

       公钥:pubkey,从私钥中提取而来,可以公开给所有人;

     用途:数字签名;密钥交换;数据加密(非对称加密效率低,一般不用作数据加密);

     算法:RSA,DSA等;

  • 单向加密:

       用途:提取数据指纹(特征码),验证数据完整性;只能加密,不能解密;

       特点:定长输出,雪崩效应;

       算法:md5,sha{1-6}等;


SSL协议和OPENSSL

    secure socket layer,安全的套接字层,位于应用层和传输层之间;SSL协议由网景公司在1994年研发,目前已经发展到3.0版本,其与继任者Transport Layer Security,简称TLS都是为网络通信提供保密性和完整性的安全协议。SSL协议的1.0到3.0版本都被发现安全漏洞,所以SSL目前快要淡出,其继任者TLS快要成为事实上的标准了。


OPENSSL:SSL协议的实现。

  • 在centos 7 的OPENSSL包中,主要包含三个部分:libcrypto,libssl和openssl。前两者主要为开发者使用,我们最常用的还是openssl。

  • SSL handshake protocol:SSL握手的过程;

    • 第一阶段:client hello;C端向S端发送;

      向S端发送自己所支持的协议版本(如tls 1.2),发送一个随机数(用于生成“会话密钥”),支持的加密算法(如AES,RSA等,便于协商生成会话密钥,可以使用相同加密算法),以及支持的压缩算法;

    • 第二阶段:server hello;S端回应;

      确认使用的协议版本;S端生成一个随机数(用作生成会话密钥);确认使用何种加密算法;以及发送服务器证书;(假如S端需要验证C端,会有索要C端证书的信息发送到C端);

    • 第三阶段:C端握手结束;

      验证服务器证书,确认无误后取出公钥(验证发证机构,证书完整性,持有者,有效期,吊销列表等);验证后发送以下信息给S端:一个随机数(用于服务器公钥加密);编码变更通知(表示随后信息会以协商好的加密方法发送);C端握手结束;

    • 第四阶段:S端握手结束;

      S端受到C端发来的第三个随机数pre-master-key后,计算生成本次会话的“会话密钥”,并向C端发送信息如下:编码变更通知(表示随后信息会以协商好的加密方式发送);S端握手结束;


下面是一个简单的加密传输图示:

wKiom1eCTs-xq9TrAAHIljU7t9Q542.jpg-wh_50

(图片可查看附件)


OPENSSL相关命令:标准命令,消息摘要命令,加密命令等;

主要介绍标准命令:enc,ca,req,genrsa;

  • 对称加密:openssl enc;

    支持算法:3des,aes,blowfish等;

    例:openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext;将fstab文件用3des算法加密;

  • 单向加密(数据特征码):openssl dgst,gpg,md5sum等;

    例:openssl dgst -md5 /PATH/TO/SOMEFILE == md5sum /PATH/TO/SOMEFILE;两者算法一致,得到的特征码也是一样的;

    生成用户密码:openssl passwd -1 -salt 12345678;-1表示md5算法,-salt可以指定随机数;

    生成随机数:openssl rand -base64 NUM;NUM表示字节数;-base64表示文本格式;-hex表示格式为16进制;

  • 公钥加密:openssl genrsa

    • 算法:RSA(加密解密,数字签名),DH(经常用作密钥交换),DSA(数字签名);

    • 生成密钥:

      • openssl genrsa 1024;

      • openssl genrsa 1024 > /tmp/mykey2.private 1024;重定向到文件中;

      • openssl genrsa 1024 -out  /tmp/mykey2.private 1024;使用out也可以;

      • 经常用法:(usmak 077openssl genrsa 1024 -out  /PATH/mykey2.private 1024)保证权限为600

    • 提出公钥:

      • openssl rsa in /PATH/FROM/PRIVATE_KEY -pubout;  

  • 系统随机数生成器:

    • /dev/random:仅从熵池返回随机数,随机数用尽,就会发生阻塞;

    • /dev/urandom:从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,不会阻塞;


PKI:Public Key Infrastructure,公钥基础设施;主要包含以下四个部分:

  1. 签证机构:CA;

  2. 注册机构:RA;

  3. 证书吊销列表:CRL;

  4. 证书存取库:


自建私有CA;

  • 工具有openssl和openCA;此处以openssl为例;

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

    1. 生成私钥;

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

自签证书:CA需要先给自己签发证书;
  • openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655;;
    如果不是自签证书,不加-x509即可;
    -new:生成新证书签署请求;
    -key:生成请求时用到的私有文件路径;
    -x509:生成自签格式证书,专门用于创建私有CA时使用;
    -out:生成的请求文件路径,如果是自签操作将会直接生成签署证书,没有请求这一步;
    -days:证书的有效时长,默认单位day;
    最后按照提示填好相关信息即可!

为CA提供所需目录及文件;
  • mkdir -pv /etc/pki/CA{certs,crl,newcerts};

  • touch /etc/pki/CA{serial,index.txt};

  • echo 01 > /etc/pki/CA/serial;


需要用到证书进行安全通信的服务器,需要向CA请求签署证书,步骤如下:
  1. 生成秘钥:

  • mkdir /etc/httpd/ssl

  • cd /etc/httpd/ssl

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

生成签署请求:
  • openssl req -new -key http.key -out httpd.csr -days 365;

  • 填写相关信息;

  • 并把生成的httpd.csr发送到之前创建好的Ca主机上;(使用scp等工具)

私有CA签署证书(这一步由请求的CA操作)
  • openssl ca -in /PATH/TO/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365;

  • 然后再将生成的证书文件发送给请求的服务器主机即可;

查看证书信息:openssl x509 -in http.crt -noout -serial -subject;-subject指看主要部分内容,-serial指查看序列号;


以上。