OpenSSL

OpenSSL
一、概念类
传输层协议:TCP,UDP,SCTP
        port:进程地址,进程向内核注册使用某端口(独占)
同一主机上的进程间通信:IPC,message queue,shm,semephor
不同主机上的进程间通信:socket(也可用于同一主机间通信),
        socket=ip:port
        cip:port -- sip:port,已建立连接的套结字都是一对socket
            监听模式:listen(ip:port)
SSL:Secure Sockets Layer
        http -> ssl ->https
安全的通信目标:    
        1.保密性:confidentiallity
        2.完整性:integrity
        3.可用性:availabilty
攻击类型:
        威胁保密性攻击:窃听,通信量分析
        威胁完整性攻击:更改,伪装,重放,否认
        威胁可用性攻击:拒绝服务(DoS)
针对攻击的解决方案
    技术:加密解密
    服务:用于抵御攻击的服务,安全服务

    加密和解密:
        传统加密方法:替代加密方法,置换加密方法
        现代加密方法:现代块加密方法,
    服务:
        认证机制
        访问控制机制

二、密钥算法和协议
密钥算法和协议
    对称加密
    公钥加密
    单向加密
    密钥交换
    对称加密:加密和解密使用同一个密钥,(解决保密性问题)
        DES(data encryption standard)des算法_百度百科 (baidu.com)
        3DES:Triple DES,三轮DES加密
AES:Advanced Encryption Standard(密钥长度128bit,192bit,256bit)

特性:
1.加密解密使用同一个密钥
2.将原始数据分割为固定大小的块,逐个进行加密
缺陷:
1.密钥过多
2.密钥分发困难
    公钥加密(非对称加密),身份认证,密钥交换,数据加密(比对称加密慢3个数量级,10的3次幂)
        密钥成对出现,密钥分为:公钥,私钥
        公钥:可以公开给所有人,pubkey,公钥从私钥中提取产生
        私钥:通过工具创建,使用者自己留存,必须保证其私密性,secret key,skey
        特点:
用公钥加密的数据,只能使用与之配对的私钥解密,反之亦然
用途:
数字签名:主要用于接收方确认发送方身份,使用私钥对需要传输的文本的摘要进行加密,得到的密文即被称为该次传输过程的签名
    密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方
    数据加密:通常不用于数据加密,效率低
        点对点模型示例:client A, sever B
            加密过程:
            1. B将data1通过<单向加密>算法,提取特征码(如MD5),通过自己私钥对特征码进行加密(数字签名,用以完成身份认证),生成数字签名,附加在数据后,称为data2,保证发送方身份和数据完整性
            2.B生成一次性<对称加密>密码,将data2通过对称加密对整段数据进行加密(保密性),称为data3
            3.B将data3通过A的公钥对一次性对称加密密码进行加密(密钥交换),附加在数据后,成为data4(保证其保密性),发送给A 
                 OpenSSL_第1张图片
            解密过程:
1.    A获取data4,先用自己的私钥对对称加密密码进行解密,获得data3+对称密码
2.    A用对称密码对data3解密,获得data2和MD5
3.    A用B公钥对特征码进行解密(身份认证),用MD5验证data1完整性

OpenSSL_第2张图片

 

缺点:容易受到中间人攻击,进而需要CA
CA:保证通信双方能够拿到正确公钥的公信机构

算法:RSA,DSA,ELGamal
    DSA:digital signature algorithm,仅能用于签名,而不能用于加解密
    DSS:digital signature standard
    RSA:即能签名也能用于加解密
        单向加密:只能加密,不能解密,只能提取数据特征码md5等(保证数据完整性)    
            特点:
定长输出
雪崩效应(加密数据的微小改变,导致密码巨大变化)
            功能:用于验证数据完整性
            算法:
                1.MD5:Message-Digest Algorithm 5,128bit信息摘要算法
                2.sha1:Secure Hash Algorithm 1,160bit,安全散列算法
                  sha224,sha256,sha384,,sha512

                centos6,7用户密码加密:sha512
cenots5用户密码加密:md5
        密钥交换:IKE :Internet key exchange互联网密钥交换协议
            RSA(公钥加密)
            DH:deffie-hellman(迪菲-赫尔曼)
                优势在于让双方不用发密码就可以得到密码
                    模型:
                    A:p,g
                    B:p,g
                    
                    A:x    
                        p^x%g==>B
                        A:(p^y%g)^x
                    B:y
                        p^y%g==>A
                        B:(p^x%g)^y
                    (p^y%g)^x = (p^x%g)^y
                    
                    (p^x%g)^y为密码
            ECDH:椭圆曲线DH
            ECDH:临时椭圆曲线DH
        
    三、实现
PKI: public key infrastructure,公钥基础设施
    签证机构:CA(市公安机关)
    注册机构:RA(派出所)
    证书吊销列表:CRL
    证书存取库:
            互联网通信强依赖PKI

        X.509v3:定义了证书的结构以及认证协议标准
            版本号:用来区分X.509的不同版本号
            序列号:由CA给予每一个证书的分配唯一的数字型编号,当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中;这也是序列号唯一的原因。
            签名算法ID:用来指定用CA签发证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法,须向国际指明标准组织(如ISO)注册。
            发行者名称(认证机构):即发出该证书的机构唯一的CA的x.500名字;
            有效期限:证书有效的时间包括两个日期:证书开始生效期和证书失效的日期和时间。在所指定的这两个时间之间有效;
            主体名称:证书持有人的姓名、服务处所等信息;
            主体公钥:包括被证明有效的公钥值和加上使用这个公钥的方法名称; 
            发行者唯一标示
            主体的唯一标识
            扩展
            发行者签名:以确保这个证书在发放之后没有被撰改过;
    
        CA使用模型:
            Clinet C,Server S
                C获取S证书,验证证书:
                用CA的公钥去解密CA签名,能解密说明证书来源可靠
                用同样的加密算法去加密证书取得特征码,和解密证书特征码比较,说明完整性可靠
                检查证书有效期限
                验证主体名称和通信人是否一致
                检查证书是否被吊销

        SSL:secure socket layer
            安全套接层是Netscape公司率先采用的网络安全协议
            v1.0(1994),v2.0,v3.0
        TLS:transport layer security
            安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性
            IETF研发:1999
            v1.0,v1.1,v1.2,v1.3
            我们统称的SSL,实际是指SSL或TLS

        TLS分层设计:
            1.最底层:基础算法原语实现aes,rsa,md5
            2.向上一层:各种算法实现
            3.向上一层:组合算法实现的半成品
            4.用各种组件拼装而成的各种成品密码密码学协议软件

        协议开源实现:openssl

四、SSL handshake
    OpenSSL由三部分组成:
1.    libencrpt库:加密解密库
2.    libssl库,实现SSL功能,用于通信加密的库
3.    openssl:多用途命令行工具

SSL主要简化有3步:
1.    客户端向服务器端索要并验证对方证书
2.    双方协商生成会话密钥
前两部合成握手阶段,handshake
3.    双方采用会话密钥进行加密通信
4.    断开
 OpenSSL_第3张图片
    --------ssl handshake 流程------------
    第一阶段:客户端通过浏览器向服务器发出加密通信请求:
        clinethello:
1.    向服务器发送自己支持的协议版本,比如TLS1.2
2.    客户端生成的随机数,稍后用于生成会话密钥
3.    支持的加密算法,比如AES,3DES,RSA
4.    支持的压缩算法
第二阶段:服务器端回应客户端
    Serverhello:
1.    确认使用的通信加密协议版本,比如TLS1.2
2.    服务器端生成一个随即数,稍后用于生成会要密钥
3.    确认使用的加密算法
4.    发送服务器证书;
5.    索要客户端证书(如果需要)
第三阶段:客户端收到服务器端的回应
1.    验证服务器证书(发证机构,证书签名,证书完整性,证书持有者,证书有效期,吊销列表等等),确认无误后,取出服务器公钥
2.    发送以下信息给服务器端:
a)    一个随机数(第三个随即数),用服务器公钥对这个随机数加密
b)    编码变更通知(随后信息,用双方商定的加密算法进行发送)
c)    客户端握手结束通知
第四阶段:服务器回应
1.    收到客户端发来的第三个随机数pre-master-key,计算生成本次会话所用的“会话密钥”
2.    向客户端发送如下信息:
a)    编码变更通知,表示随后的信息都将用双方商定的加密算法和密钥发送
b)    服务器握手结束通知
---------ssl handshake-----------------
 OpenSSL_第4张图片
五、OpenSSL
    组件:
        Libcrypto,libssl主要由开发者使用
        openssl:多用途命令行工具

    openssl命令分类:
        standard commands:标准命令
        message digest:消息摘要命令
        cipher commands:加密命令
     OpenSSL_第5张图片

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

    对称加密,使用openssl完成对称加密:
        工具:openssl enc
        算法:3des,aes,blowfish

        enc命令:
            enc - symmetric cipher routines
            openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P][-bufsize number] [-nopad] [-debug] [-none] [-engine id]
            
            -e加密,-d解密,-a(-base64)文本加密
            
            实例:
                加密:
            openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
                解密:
            openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab

    单向加密:
        工具:openssl dgst,md5sum,sha1sum,sha224sum
        dgst:
            提取摘要
            openssl dgst -md5 fstab
            openssl dgst -md5 -out fstab.md5 fstab
            验证摘要:
            
生成用户密码的命令:
        工具:passwd, openssl passwd
        openssl passwd:
            openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
            
            openssl passwd -1 -salt 123456
            -1(一)标示MD5加密,-salt不变,密文不变
    生成随即数,salt
            工具:openssl rand
            openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
            
            openssl rand -base64 10
                        L4JQf3hy3RdPtQ==
                        使用时需要删除==
            openssl rand -hex 10
                        f858abb49c1b72e5188d
            
            openssl passwd -1 -salt $(openssl rand -hex 4)
            $1$7d20e521$fp7jFdPa8IRTqjx1FbKHL/

    公钥加密:
        三种功能:
            加密解密:
                    算法:rsa,elgamal
                    工具:openssl rsautl,gpg
            数字签名
                    算法:rsa, dsa, elgamal
                    工具:openssl rsautl,gpg
            密钥交换
                    算法:dh
        生成密钥对
1.    生成私钥
openssl genrsa [-out filename] [-passout arg] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

openssl genrsa  -out ./mykey3.private 1024
openssl genrsa 1024 > mykey.private
openssl genrsa 1024

修改为仅自己能读能写
(umask 077; openssl genrsa -out mykey4.private 1024)
使用()表示启用子shell启动进程,主进程不受影响

2.    提取公钥
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]

openssl rsa -in mykey.private -pubout -out mykey.pub
        
3.    linux系统上的随机数生成器:
a)    /dev/random:仅从熵池中返回随机数,随机数用尽,阻塞
b)    /dev/urandom:从熵池中返回随机数,随即数用尽,会利用软件生成伪随即数,非阻塞
伪随即数不安全,熵池:内核在内存中维护的一个空间,空间内存储大量随机数,
    熵池中的随机数来源:
        硬盘IO中断时间间隔
        键盘IO中断时间间隔
如果随机数用尽,可以拷贝大数据到硬盘,产生大量IO

CA:
        分为两类:
            公共信任的CA,
            私有CA

        建立私有CA:
        openssl
        OpenCA(图形界面工具)

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

    构建私有CA:在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需的目录及文件即可
    步骤:
1.    生成私钥,默认要求生成在/etc/pki/CA/private/
 (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
2.    生成自签证书,要配置在/etc/pki/CA/cacert.pem
req - PKCS#10 certificate request and certificate generating utility.
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365 
    -new 生成新证书签署请求
    -x509 生成自签格式证书,专用于创建私有CA时
    -key 生成请求时用到的私有文件路径
    -days 证书有效时长
        -out 输出路径
        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
(umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
cd /etc/httpd/ssl
2.    生成证书签署请求
openssl req -new -key httpd.key -out httpd.csr -days 365

3.    将请求通过可靠方式发送给CA
a)    把httpd.csr拷贝给CA
cp httpd.csr /tmp/
            ------------以上在请求主机作,以下在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
                
serial=01
subject= /C=CN/ST=Liaoning/O=tianlang/OU=Ops/CN=k8s-node-02
5.    CA给客户提供认证
                    cp certs/httpd.crt /etc/httpd/ssl/

    吊销证书:
        步骤:
1.    客户端获取要证书吊销的serial
                        openssl x509 -in certs/httpd.crt -noout -serial -subject        
2.    CA主机吊销证书
                        先根据客户提交的serial和subject信息,对比其与本机index.txt中信息是否一致
                        吊销:
                        openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
                        其中serial.pem要换成证书真正的序列号
                    3.生成吊销证书的吊销编号(第一次吊销证书执行)
                        echo 01>/etc/pki/CA/crlnumber
                    4.更新证书吊销列表
                        openssl ca -gencrl -out thisca.crl
                        查看crl文件
                            openssl crl -in /path -noout -text    

OpenSSH 和 OpenSSL 并不是直系亲属,顶多算有共同志向的兄弟!
它们是由不同的团队开发,有不同的目的,但是都开放源码,为安全通信提供支持。
一、OpenSSH
OpenSSH 是使用 SSH 协议进行远程登录的连接工具。 它加密所有通信讯息以消除窃听、连接劫持和其他攻击。 此外,OpenSSH 提供了大量的安全隧道功能、多种身份验证方法和复杂的配置选项。
OpenSSH 包含的组件如下:

(1)ssh

OpenSSH 远程登录客户端,作为 rlogin 和 Telnet 的替代方案。

(2)scp

OpenSSH 安全文件复制,作为 rcp 的替代方案,将文件复制到其他电脑上。

(3)sftp

OpenSSH 安全文件传输,类似于 scp。

(4)sshd

OpenSSH 守护进程。

(5)ssh-keygen

OpenSSH 身份验证密钥实用程序,产生RSA或ECDSA密钥,用来认证用。

(6)ssh-agent

OpenSSH 身份验证代理,用于帮助用户不需要每次都要输入密钥密码的工具。

(7)ssh-add

向 OpenSSH 身份验证代理添加私钥身份,用于帮助用户不需要每次都要输入密钥密码的工具。

(8)ssh-keyscan

从服务器收集 SSH 公钥,并记录公钥。

在类 Unix 系统中的远程登录就采用了 SSH 协议,只有安装了相应软件包才能实现远程登录。
二、OpenSSL
OpenSSL 是一个开源的软件库,使用包含了众多加解密算法,用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的强大、商业级和功能齐全的工具包。
主要库是以 C 语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。


 

你可能感兴趣的:(linux系统,网络,安全,ssl)