美文网首页
note_18.2_openssl

note_18.2_openssl

作者: 人間失格_430b | 来源:发表于2019-03-28 15:54 被阅读0次

    OpenSSL

    libcrypto
    libssl
    openssl

    SSL会话主要三步:

    客户端向服务器端索要并验正证书;
    双方协商生成“会话密钥”;
    双方采用“会话密钥”进行加密通信;

    SSL Handshake Protocol:

    • 第一阶段:ClientHello:
      支持的协议版本,比如tls 1.2;
      客户端生成一个随机数,稍后用户生成“会话密钥”
      支持的加密算法,比如AES、3DES、RSA;
      支持的压缩算法;

    • 第二阶段:ServerHello
      确认使用的加密通信协议版本,比如tls 1.2;
      服务器端生成一个随机数,稍后用于生成“会话密钥”
      确认使用的加密方法;
      服务器证书;

    • 第三阶段:
      验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
      发送以下信息给服务器端:
      一个随机数;
      编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
      客户端握手结束通知;

    • 第四阶段:
      收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
      向客户端发送如下信息:
      编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
      服务端握手结束通知;

    • PKI:公钥基础设施
      签证机构:CA
      注册机构:RA
      证书吊销列表:CRL
      证书存取库


    OpenSSL(2)

    组件:
    libcrypto, libssl主要由开发者使用;
    openssl:多用途命令行工具;

    openssl:
    从多子命令,分为三类:
    标准命令
    消息摘要命令(dgst子命令)
    加密命令(enc子命令)

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

    对称加密:
    工具:openssl enc, gpg
    支持的算法:3des, aes, blowfish, towfish

    enc命令:

    加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
    解密:~]# openssl enc -d -des3 -a -salt -out fstab -in fstab.ciphertext

    单向加密:
    工具:openssl dgst, md5sum, sha1sum, sha224sum, ...

    dgst命令:

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

    生成用户密码:
    工具:passwd, openssl passwd
    openssl passwd -1 -salt SALT

    生成随机数:
    工具:openssl rand
    ~]# openssl rand -hex NUM
    ~]# openssl rand -base NUM


    公钥加密:

    • 加密解密:
      算法:RSA,ELGamal
      工具:openssl rsautl, gpg
    • 数字签名:
      算法:RSA, DSA, ELGamal
      工具:
    • 密钥交换:
      算法:DH

    生成密钥:
    生成私钥: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
    提出公钥: ~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout


    Linux系统上的随机数生成器:
    /dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
    /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
    伪随机数不安全;

    熵池中随机数的来源:
    硬盘IO中断时间间隔;
    键盘IO中断时间间隔;

    CA:

    公共信任的CA,私有CA;

    建立私有CA:

    • openssl
    • OpenCA

    openssl命令:

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

    构建私有CA:

    在确定配置为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;
    3. 为CA提供所需的目录及文件;
      ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
      ~]# touch /etc/pki/CA/{serial,index.txt}
      ~]# echo 01 > /etc/pki/CA/serial

    要用到证书进行安全通信的服务器,需要向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

    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

    吊销证书:

    步骤:

    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

    相关文章

      网友评论

          本文标题:note_18.2_openssl

          本文链接:https://www.haomeiwen.com/subject/swwgvqtx.html