欢迎访问 SJsir 圣杰博客

A Linux operation and maintenance engineer's Blogs

OpenSSL

  OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

  1.基础知识:

    传输层协议:TCP,UDP,SCTP
        port:进程地址,进程向内核注册使用某端口(独占)
    同一主机上的进程间通信:IPC,message queue,shm,semerphor
    不同主机上面的进程间的通信:socket
        (client)ip+port <-- --> server(ip+port)
    监听模式(LISTEN):服务器打开 ip+port,随时等待服务链接进行访问。

  2.SSL(Secure Sockets Layer)

    http--->ssl--->https
    当http协议调用了SSL加密库,则变成了https

  3.安全目标:

    保密性:confidentially
    完整性:integeity
    可用性: availability

  4.网络攻击的类型:

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

  5.解决方案:

    技术:加密和解密
        传统加密方法:替代加密方法、置换加密方法
        现代加密方法:现在块加密方法
    服务(用于抵御攻击的服务,也即是为了上述安全目标而特定设计的安全服务)
        认证机制:
        访问控制机制:

  6.密钥算法和协议:

    (1)对称加密:加密和解密使用同一个密钥;
        加密算法:
            DES:Data Encryption Standard 56bits
            3DES:Triple DES
            AES:Advanced Encryption Standard (128, 192, 256, 384bits)
            Twofish
            Blowfish
            IDEA(商用加密算法)
            RC6
        特性:加密 解密使用同一个密钥
            将原始数据分割成固定大小的块,进行逐个加密
        缺陷:密钥过多,密钥分发困难,无法实现数据来源确认
    (2)公钥加密:密钥成对存在,密钥分为公钥和与之对应的私钥
        公钥:从私钥中提取产生,可公开给所有人,public key
        私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key
        特点:用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
        用途:数字签名:主要让接收方确认发送方的身份;
            密钥交换:发送方用对方公钥加密一个对称密钥,并发给对方;
            数据加密(少用)
        算法:RSA,DSA(DSS数字签名标准),ELGamal
    (2)单向加密:提出数据指纹,只能加密,不能解密;
        特性:定长输出,雪崩效应
        功能:完整性
        算法:md5,sha1,sha224,sha256,sha384,sha512
    (3)密钥交换    
        密钥交换:IKE(Internet Key Exchage)
            公钥加密
        DH算法:
            a.A:p,g 协商生成公开的整数a,  大素数p
               B:p,g
            b.A:生成隐私据 数据 :x (x<g)出 ,计算得出 p^x%g,发送给B
               B:生成隐私据 数据 :y, 计算出 得出 p^y%g,发送给A
            c.A:计算得出(p^y%g)^x = p^xy%g,生成为密钥
               B:计算得出(p^x%g)^y = p^xy%g,生成为密钥
        ECDH(椭圆曲线DH)
        ECDHE(临时椭圆曲线DH)

  7.PKI(Public Key Infrastructure)

    公钥基础设施:
        签证机构:CA
        注册机构:RA
        证书吊销列表:CRL
        证书存取库:CB
    X509v3:定义数字证书结构和认证协议标准
        版本号;
        序列号;
        签名算法ID;
        发行者名称;
        有效期限;
        主体名称;
        主体公钥;
        发行者的唯一标识;
        主体的唯一标识;
        扩展的唯一标识;
        发行者的签名;

  8.SSL(Secure Sockets Layer)

    TLS(Transport Layer Security)
    分层设计:
        最底层:基础算法原理的实现,aes,rsa,md5
        向上一层:各种算法的实现;
        再向上一层:组合算法实现的半成品;
        用各种组件拼装而成的各种成品密码学协议软件;

《OpenSSL》

  9.Linux系统上协议的开源加密解密实现:OpenSSL

    OpenSSL由三部分组成:                
        libencrypto
        libssl
        openssl命令行工具
    SSL会话主要三步:
        客户端向服务器端索要并验证证书;
        双方协商生成"会话密钥";
        双方采用"会话 密钥"进行加密通信;
    SSL会话的逐步实现:
        Client端和Server端协议的类型和具体的版本号必须相同,例如全为tls1.2版本
        第一阶段:Client_Hello
            支持的协议版本;比如使用tls1.2
            客户端生成一个随机数,稍后用户生成"会话密钥"
            支持的加密算法,比如AES,3DES,RSA      
            支持的压缩算法:
        第二阶段:Server_Hello
            确定使用的加密通信协议版本,比如 tls1.2
            服务器端生成一个随机数,稍后用于生成"会话密钥"
            确认使用的加密方法;
            发送服务器端的服务器证书;
        第三阶段:
            验证服务器证书,在确定无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
            发送以下信息给服务器端;
                一个随机数;
                编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
                客户端握手结束通知;
        第四阶段:
            收到客户端发来的第三个随机数per-master-key后,计算生成本次会话所有到的"会话密钥";
            向客户端发送如下信息;
                编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
                服务端握手结束通知;

  10.OpenSSL的命令行工具:

    openssl命令:
        配置文件:/etc/pki/tls/openssl.cnf
    组件:
        libencrypto,libssl:主要由开发者使用;
        openssl:多用途命令行工具;
    openssl命令:有众多子命令,分为三类:
        标准命令:enc,ca,reg,genrsa;
        消息摘要命令(dgst子命令):
        加密命令(enc子命令):

  11.加密算法的具体实现:

    (1)对称加密:
        工具:opensslenc,gpg
        支持的算法:3des,aes,blowfish,towfish
        openssl enc命令:
            加密:openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
                加密时应该输入密码,查看加密后的文件为加密的格式;
            解密:openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
                解密时应该输入密码,然后解压之后的文件为明文格式;
    (2)单向加密:
        工具:openssl dgst,md5sum,sha1sum,sha224sum,sha256sum,....
        openssl dgst命令:
            openssl dgst -md5 /PATH/TO/SOMEFILE
            md5sum /PATH/TO/SOMEFILE
    (3)生成用户密码:
        工具:passwd,openssl passwd
            openssl passwd -1 -salt 12345678  (-1 为MD5加密算法)
            生成用户的加密密码 -salt 为密码的盐,加密算法相同,盐相同,密码相同,加密之后生成的密文密码一定相同。
            openssl passwd -1 -salt $(openssl rand -hex 4)
                利用openssl rand生成盐,对于passwd进程随机的生成,加密
    (4)生成随机数:
        工具:openssl rand
            openssl rand -hex/base64 NUM
            openssl rand -hex 10(生成10个字节的hex16进制编码的字符串)
            openssl rand -base64 10(生成10字节的随机数编码的字符串,==为特定的格式)
    (5)公钥加密:
        加密解密:算法:RSA,ELGamal
        数字签名:算法:RSA,DSA,ELGamal
        密钥交换:算法:DH
            工具:openssl rsautl,gpg
                  openssl rsautl
    (6)生成密钥(生成私钥和提出公钥):
        生成私钥:
        工具:openssl genrsa
            ( umask 077 ; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
        示例:
            openssl genrsa 1024
                直接生成1024长度的私钥
            openssl genrsa 1024 > /testdir/mykey1.p
                生成1024长度的私钥,使用输出重定向,保存到/testdir/mykey1.p
            openssl genrsa -out /testdir/mykey2.p 1024x
                生成1024长度的私钥,使用openssl自带的输出,保存到/testdir/mykey2.p
                ( umask 077 ; openssl genrsa -out /testdir/mykey3.p 1024 )
            在子shell中进行,生成1024长度的私钥,使用openssl自带的输出,保存到/testdir/mykey3.p中,并将该文件的权限更改为600
        提出公钥:
        工具:openssl rsa
            openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
            示例:
                openssl rsa -in /testdir/mykey3.p -pubout
                提取/testdir/mykey3.p私钥中的公钥,显示到屏幕上来
点赞