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

      传输层协议:TCP, UDP, SCTP

           port:进程地址,进程向内核注册使用某端口(独占)

      同一主机上的进程间通信:IPC , message queue,shm,semerphor

      不同主机上的进程间通信:socket

           cip:port <-- --> sip:port

                 cip:55673 <-- --> sip:80

                 监听模式:LISTEN(ip:port)

      SSL:Secure Socket Layer

           http --> ssl --> https

      安全的目标:

           保密性:confidentiality

           完整性:integrity

           可用性:availability

      ***类型:

           威胁保密性的***:窃听、通信量分析;

           威胁完整性的***:更改、伪装、重放、否认

           威胁可用性的***:拒绝服务(DoS)

      解决方案:

           技术(加密和解密)、服务(用于抵御***的服务,也即是为了上述安全目标而特地设计的安全服务)

          

           加密和解密:

                 传统加密方法:替代加密方法、置换加密方法

                 现代加密方法:现代块加密方法

           服务:

                 认证机制

                 访问控制机制

           密钥算法和协议

                 对称加密

                 公钥加密

                 单向加密

                 认证协议

Linux系统:OpenSSL(ssl),GPG(pgp)

      OpenSSL由三部分组成:

           libencrypto

           libssl

           openssl多用途命令行工具

      加密算法和协议:

           对称加密:加密和解密使用同一个密钥;

                 DES:Data EncryptionStandard;

                 3DES:triple DES

                 AES:Advanced EncryptionStandard;(128bits,192bits,256bits,384bits)

                 Blowfish

                 Twofish

                 IDEA

                 RC6

                 CAST5

                

                 特性:

1.     加密、解密使用同一个密钥

2.     将原始数据分割称为固定大小的块,组个进行加密;

 

缺陷:

1.     密钥过多;

2.     密钥分发困难;

公钥加密:密钥分为公钥与私钥

         公钥:从私钥中提取产生;可公开给所有人;pubkey

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

                 特点:用公钥加密的数据,只能使用与之配对的私钥解密;反之亦然;

                

                 用途:

                      数字签名:主要在于让接收方确认发送方的身份;

                      密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;

                      数据加密

                 算法:RSA,DSA,ELGamal

                      DSS:Digital SignatureStandard

                      DSA:Digital SignatureAlgorithm

           单向加密:即提出数据指纹;只能加密不能解密;

                 特性:定长输出、雪崩效应;

                 功能:保证数据完整性;

                 算法:

                      md5:message digest 5,  128bits

                      sha1:secure hashalgorithm 1, 160bits

                            sha224,sha256,sha384,sha512

           密钥交换:IKE(InternetKey Exchange)

                 公钥加密

                 DH(deffie-Hellman)

                      A: p,g

                      B: p,g

                     

                      A:x --> p^x%g==>B

                            A:(p^y%g)^x=p^yx%g

                      B: y

                            --> p^y%g ==>A

                            B: (p^x%g)^y=p^xy%g

      PKI:Public Key Infrastructure

           公钥基础设施:

                 签证机构:CA

                 注册机构:RA

                 证书吊销列表:CRL

                 证书存取库:

           x.509v3:定义了证书的结构以及认证协议标准

                 版本号

                 序列号

                 签名算法ID

                 发行者名称

                 有效期限

                 主体公钥

                 发行者的唯一标识

                 扩展

                 发行者的签名

      SSL:Secure sockets Layer

           Netscape: 1994

           V1.0, V2.0, V3.0

      TLS:Transport Layer security

           IETF:1999

           V1.0, V1.1, V1.2, V1.3

          

           分层设计:

1.     最底层:基础算法原语的实现,aes,rsa,md5

2.     向上一层:各种算法的实现;

3.     再向上一层;组合算法实现的半成品;

4.     用各种组件拼装而成的各种成品密码学协议软件;

SSL/TLS

      SSL:安全套接字层(ssl 1.0,ssl2.0,ssl3.0)

      TLS:传输层安全(tls 1.0,tls1.1,tls 1.2,tls 1.3)

 

SSL会话的主要三步:

      客户端向服务器端索要并验证证书;

      双方协商生成“会话密钥”;

      双方采用“会话密钥”进行加密通信;

 

      SSL Handshake Protocol:ssl握手协议

           第一阶段:ClientHello

                 支持协议的版本,比如tls 1.2;

                 客户端生成一个随机数,稍后用户生成“会话密钥”

                 支持的加密算法,比如AES、3DES、RSA;

                 支持的压缩算法;

           第二阶段:serverhello

                 确认使用的加密通信协议版本,比如tls 1.2;

                 服务器端生成一个随机数,稍后用于生成“会话密钥”

                 确认使用的加密方法;

                 服务器证书;

           第三阶段:

验证服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)

发送以下信息给服务器端:

          一个随机数;

          编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

          客户端握手结束通知;

           第四阶段:

                 收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有用到的“会话密钥”;

                 向客户端发送如下信息;

                      编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

                      服务端握手结束通知;

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

                 Linux自学笔记——OpenSSL命令行工具_第1张图片

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

                 Linux自学笔记——OpenSSL命令行工具_第2张图片

      单向加密:

           工具:openssl dgst,md5sum,sha1sum,sha224sum,…

           dgst命令:~]#openssl dgst –md5/path/to/somefile

           Linux自学笔记——OpenSSL命令行工具_第3张图片

           一般可以验证文件的完整性。

      生成用户密码:

           工具:passwd,openssl  passwd

                 openssl passwd -1 –salt  SALT

                 Linux自学笔记——OpenSSL命令行工具_第4张图片

           Note:salt不同,相同的密码,输出也不同。

      生成随机数:

           工具:openssl rand

           ~]# openssl  rand -hex  NUM

           ~]# openssl  rand -base  NUM

          

      公钥加密:

           加密解密:

                 算法:RSA,ELGamal

                 工具:openssl rsautl,gpg

           数字签名:

                 算法:RSA,DSA,ELGamal

           密钥交换:

                 算法:DH

           生成密钥:

                 生成私钥:#(umask077 ;openssl genrsa –out /path/to/private_key_fileNUM_BITS)

                 Linux自学笔记——OpenSSL命令行工具_第5张图片

                 提出公钥:#openssl rsa –in /path/from/private_key_file  -pubout

                 Linux自学笔记——OpenSSL命令行工具_第6张图片

Linux系统上的随机数生成器:

      /dev/random:仅从熵池返回随机数;随机数用尽,阻塞;

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

           熵池中随机数的来源;

                 磁盘IO中断时间间隔

                 键盘IO中断时间间隔

CA

      公共信任的CA,私有CA;

      建立私有CA:

           openssl

           OpenCA

      openssl命令:

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

           Linux自学笔记——OpenSSL命令行工具_第7张图片

构建私有CA示例:准备两台主机,一台作CA主机192.168.19.128,一台作用户主机192.168.19.134(证书请求主机)

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

步骤:

1)    生成私钥:

~]# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

Linux自学笔记——OpenSSL命令行工具_第8张图片

2)    生成自签证书;

~]# opensslreq -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem-days 3655

    -new:生成新证书签署请求;

    -x509:生成自签格式证书,专用于创建私有CA;

    -key:生成请求时用到的私钥文件路径;

    -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书

    -days:证书的有效时长,单位为day;

Linux自学笔记——OpenSSL命令行工具_第9张图片

3)    为CA提供所需的目录及文件;

~]# mkdir  -pv /etc/pki/CA/{certs,crl,newcerts}

~]# touch  /etc/pki/CA/{serial,index.txt}

~]# echo  01 > /etc/pki/CA/serial

wKioL1nduc6Q28Q9AAAhE2Qs3kA768.png-wh_50

      要用到证书进行安全通信的服务器,需要向CA请求签署证书;

      步骤:(以httpd为例)

1)    用到证书的主机生成私钥:

~]# mkdir  /etc/httpd/ssl

~]# cd  /etc/httpd/ssl

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

Linux自学笔记——OpenSSL命令行工具_第10张图片

2)    生成证书签署请求

Linux自学笔记——OpenSSL命令行工具_第11张图片

3)    将请求通过可靠方式发给CA主机;

~]#scp /etc/httpd/ssl/httpd.csr  [email protected]:/tmp/

可在CA主机上查看请求主机发送的证书请求;

Linux自学笔记——OpenSSL命令行工具_第12张图片

4)    在CA主机上签署证书;

~]# opensslca  -in /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days 365

Linux自学笔记——OpenSSL命令行工具_第13张图片

查看 证书信息:

    ~]# openssl x509  -in/etc/pki/CA/certs/httpd.crt  -noout  -serial -subject

    wKiom1neKRaShbBOAAAeZHqiPGY085.png-wh_50

5)    CA所在的主机将签署完的证书,发送回请求主机;

~]#scp  /etc/pki/CA/certs/httpd.crt  [email protected]:/etc/httpd/ssl/

wKioL1nduhPx6mxAAAAgzAG2VWI980.png-wh_50

      吊销证书:

      步骤:

1)    客户端获取要吊销证书的serial(在使用证书的主机执行):

~]#openssl  x509 –in /etc/pki/CA/certs/httpd.crt  -noout -serial  -subject

2)    CA主机吊销证书

先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;

吊销:

    wKiom1neKTXSljPeAAAa6Sjncv0185.png-wh_50

    #openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.PEM

    wKiom1neKUDCVeDLAAAaLiAHN0E824.png-wh_50

          其中的 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

    Linux自学笔记——OpenSSL命令行工具_第14张图片