zoukankan      html  css  js  c++  java
  • 【Linux】【Service】【OpenSSL】原理及实现

    1. 概念

    1.1. SSL(Secure Sockets Layer安全层套接字)/TLS(Transport Layer Security传输层套接字)。

      最常见的应用是在网站安全方面,用于http数据传输的加密。

    1.2. 安全的目标:保密性(confidentiality),完整性(integrity),可用性(availability)

    1.3. 攻击的类型:

        威胁保密性的攻击:窃听、通信量分析;
        威胁完整性的攻击:更改、伪装、重放、否认
        威胁可用性的攻击:拒绝服务(DoS)

    1.4. 解决方案:技术(加密和解密)、服务(用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务)

      加密和解密:
        传统加密方法:替代加密方法、置换加密方法
        现代加密方法:现代块加密方法

      服务:
        认证机制
        访问控制机制

    1.5. 在linux系统上的实现:OpenSSL(ssl), GPG(pgp)

    1.6. 加密算法和协议:

    1.6.1. 对称加密:加密和解密使用同一个密钥;
          DES:Data Encryption Standard;
          3DES:Triple DES;
          AES:Advanced Encryption Standard; (128bits, 192bits, 256bits, 384bits)
          Blowfish
          Twofish
          IDEA
          RC6
          CAST5

      特性:
        加密、解密使用同一个密钥;
        将原始数据分割成为固定大小的块,逐个进行加密;

      缺陷:
        密钥过多;
        密钥分发困难;

    1.6.2. 公钥加密:密钥分为公钥与私钥
        公钥:从私钥中提取产生;可公开给所有人;pubkey
        私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key;
        特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
        用途:
          数字签名:主要在于让接收方确认发送方的身份;
          密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
          数据加密

        算法:RSA, DSA, ELGamal
          DSS: Digital Signature Standard
          DSA:Digital Signature Algorithm

    1.6.3. 单向加密:即提出数据指纹;只能加密,不能解密;
        特性:定长输出、雪崩效应;
        功能:完整性;
        算法:
          md5:Message Digest 5, 128bits
          sha1:Secure Hash Algorithm 1, 160bits
          sha224, sha256, sha384, sha512

    1.6.4. 密钥交换: IKE(Internet Key Exchange)
        公钥加密算法:RSA

        DH(Deffie-Hellman),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

    1.7. PKI:Public Key Infrastructure

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

      X.509v3:定义了证书的结构以及认证协议标准
        版本号
        序列号
        签名算法ID
        发行者名称
        有效期限
        主体名称
        主体公钥
        发行者的惟一标识
        主体的惟一标识
        扩展
        发行者的签名

    1.8. 设计模式:分层设计

        最底层:基础算法原语的实现,aes, rsa, md5
        向上一层:各种算法的实现;
        再向上一层:组合算法实现的半成品;
        用各种组件拼装而成的各种成品密码学协议软件;

    2. 传输过程:

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

    2.2. SSL Handshake Protocol:

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

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

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

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

    3. OpenSSL

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

    3.2. opensll命令:

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

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

    3.2.1. 对称加密:
        工具: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

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

        dgst命令:
          ~]# openssl dgst -md5 /PATH/TO/SOMEFILE

    3.2.3. 生成用户密码:
        工具:passwd, openssl passwd

          ~]# openssl passwd -1 -salt SALT

    3.2.4. 生成随机数:
        工具:openssl rand

          ~]# openssl rand -hex NUM
          ~]# openssl rand -base NUM

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

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

    4. CA:公共信任的CA,私有CA;

    4.1. 公共CA:买买买
    4.2. 建立私有CA工具:openssl/OpenCA

    4.2.1. openssl命令:

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

    4.2.1.1. 构建私有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

    4.2.1.2. 吊销证书:
      步骤:
        (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

  • 相关阅读:
    Ubuntu无法初始化软件包信息
    数组名做函数的参数
    Printf函数中%p代表什么数据类型
    assert()函数用法总结
    C语言printf 格式 zz
    零值指针指向何处? zz~
    命名空间“System.Net”中不存在类型或命名空间名称“Sockets”。是否缺少程序集引用?
    AD20配置为中文显示
    sharepoint:实现搜索功能
    sharepoint:爬网完成后上传新文档搜索不到(设定爬网Schedule)
  • 原文地址:https://www.cnblogs.com/demonzk/p/6485326.html
Copyright © 2011-2022 走看看