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

公钥加密:密钥是成对儿出现
    公钥:公开给所有人;pubkey
    私钥:自己留存,必须保证其私密性;secret key
    特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
实现:
    数字签名:主要在于让接收方确认发送方身份;用自己的私钥加密;(私钥加密公钥解密)
    密钥交换:发送方用对方的公钥加密一个对称密钥,并发送给对方;

密钥交换(IKE):两种方式

        ①.基于密钥交换:发送方用对方的公钥加密一个对称密钥,并发送给对方;

        ②.基于DH算法:不会在网络上发送秘钥,所以就算破解了也拿不到秘钥;

对称加密:速度快,安全,紧凑但是不支持数字签名,密钥数量大不方便管理

非对称加密:速度相当慢,密文会变长,密钥数目等于参与者数目,不必事先传递密钥给对方(安全)

数据加密:发送方用对方的公钥加密一个对称密钥,并发送给对方;

安全通信过程解析:(假设A和B要安全传输数据,A要发送数据给B)

发送方A:

1.A用单向加密算法对实际数据做hash,并且用自己的私钥加密hash得到的特征码附加在实际数据后面

2..A用随机对称密钥加密实际数据和刚刚hash得到的特征码,用B的公钥加密那个随机的对称密钥

3.将⑴用刚刚对称密钥加密的数据和特征码,⑵用B的公钥加密后的对称密钥发送给B

接收方B:

1.用自己的私钥解密得到发送方的随机对称密钥

2.用对称密钥解密数据得到以A的私钥加密了的特征码和实际数据

3.用A的公钥解密那个加密了的特征码

4.对实际数据做hash比对上面说的特征码实现了完整性校验

上面过程看似很完美,其实有个漏洞:

A如何拿到B的公钥呢?万一C假冒B告知A自己是B呢?同理B如何拿到A的公钥呢?

这时就需要用到CA了,CA是证书颁发机构,B带着自己的公钥找到CA,CA发一个证书给B,证明B就是B(会在发给B的证书(证书里内嵌了B的公钥,具体格式请见下文)上面盖一个章,实现B的身份认证),所以B给A发送的 是数字证书(数字证书里有公钥)


为了保证私钥丢了其他人也不能用,私钥需要加密,但是万一别人解密呢?

所以:CA机构需要有证书吊销列表(证书其实有有效期的),接受方每次都会查看证书是不是可信机构发的,而且会查看CA服务器上的证书吊销列表有没有发送方的这个证书,有的话就不可信

PKI: Public Key Infrastructure
    签证机构:CA
    注册机构:RA
    证书吊销列表:CRL
    证书存取库

证书格式:

X.509:定义了证书的结构以及认证协议标准
    版本号
    序列号
    签名算法ID
    发行者名称
    有效期限
    主体名称:证书拥有者名称,任何时候,主机上的证书中的主机名称必须和用户通过互联网访问的名称一致!
    主体公钥
    发行者惟一标识
    主体的惟一标识
    扩展
    发行者签名

上面流程还是有漏洞,万一有人冒充CA呢?那么收到CA证书的人如何验证CA的可靠性呢?

这时,CA会用自己的私钥加密自己颁发给A或者B的证书的特征码,这时,就需要CA的公钥去解密得到特征码,此时就用到CA的证书了,CA自己给自己发证书,当A或者B收到CA颁发给自己的证书同时要验证CA的签名是否可靠(是不是可信CA),用什么方式验证呢?就是装系统时系统会内嵌所有可信CA公证机构的证书,会用系统内嵌的证书里提取出CA公钥,除非系统盗版

windows上自带的证书:

加密学原理及openssl,私有CA搭建_特征码

验证证书:1.发行者名称 2.发行者签名3.特征码比较

SSL/TLS:在应用层和传输层之间加了半层,需要建立TCP连接和SSL连接(发送证书信息,基于IP地址实现,所以一个ip地址在某个应用上只能建立一个ssl会话)

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

三个组件:
    openssl: 多用途的命令行工具;
    libcrypto: 公共加密解密库;
    libssl: 库,实现了ssl及tls;许许多多服务都会调用这个库实现安全通信,例如apache实现https


linux上openssl命令使用:

1.enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
openssl ?可以获取帮助   man enc可以查看enc子命令详细信息

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

两种方式:

(1).dgst命令:openssl dgst -md5 /PATH/TO/SOMEFILE

(2).md5sum /PATH/TO/SOMEFILE

MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性;
机制:CBC-MAC    HMAC:使用md5或sha1算法


生成用户密码:

openssl passwd -1 -salt test123


3.生成随机数:
openssl rand -base64|-hex NUM
NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2;

4.生成密钥对儿:
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
# (umask 077; openssl genrsa -out key.pri 2048)
提取出公钥:
# openssl rsa -in /PATH/FROM/PRIVATEKEY.FILE -pubout(公钥可以从私钥中提取出来)

两个随机数生成器:

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

SSL协议通信过程

(1) 浏览器发送一个连接请求给服务器;服务器将自己的证书(包含服务器公钥S_PuKey)、对称加密算法种类及其他相关信息返回客户端;

(2) 客户端浏览器检查服务器传送到CA证书是否由自己信赖的CA中心签发。若是,执行4步;否则,给客户一个警告信息:询问是否继续访问。

(3) 客户端浏览器比较证书里的信息,如证书有效期、服务器域名和公钥S_PK,与服务器传回的信息是否一致,如果一致,则浏览器完成对服务器的身份认证。(1.检查证书发行者名称,找到对应的发行者的证书,提取出公钥检查是否能解密收到的证书的签名,2.检查主体名称是否和我请求的名称是否相同,3.检查证书中信息完整性,4.检查吊销列表)

(4) 服务器要求客户端发送客户端证书(包含客户端公钥C_PuKey)、支持的对称加密方案及其他相关信息。收到后,服务器进行相同的身份认证,若没有通过验证,则拒绝连接;

(5) 服务器根据客户端浏览器发送到密码种类,选择一种加密程度最高的方案,用客户端公钥C_PuKey加密后通知到浏览器;

(6) 客户端通过私钥C_PrKey解密后,得知服务器选择的加密方案,并选择一个对称通话密钥key,接着用服务器公钥S_PuKey加密后发送给服务器;

(7) 服务器接收到的浏览器传送到消息,用私钥S_PrKey解密,获得通话密钥key。

(8) 接下来的数据传输都使用该对称密钥key进行加密。

上面所述的是双向认证 SSL 协议的具体通讯过程,服务器和用户双方必须都有证书。由此可见,SSL协议是通过非对称密钥机制保证双方身份认证,并完成建立连接,在实际数据通信时通过对称密钥机制保障数据安全性

加密学原理及openssl,私有CA搭建_特征码_02

加密学原理及openssl,私有CA搭建_加密_03

私有CA搭建:

PKI:Public Key Infrastructure    保障数据安全性的一套框架
    RA:注册机构,收取客户端提交得证书请求

    CA:证书颁发机构,RA将请求提交到CA,CA签署请求

    CRL:证书吊销机制
    证书存取库
    建立私有CA的工具:
        OpenCA:专业工具,很强大
        openssl:用于简要测试
    证书申请及签署步骤:
        1、生成申请请求;
        2、RA核验;
        3、CA签署;
        4、获取证书;

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

加密学原理及openssl,私有CA搭建_加密_04

        (1) 在/etc/pki/CA下创建所需要的文件
            # touch index.txt
            # echo 01 > serial
        (2) CA自签证书
           # (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)---生成私钥

加密学原理及openssl,私有CA搭建_PKI_05

    # openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem

               -new: 生成新证书签署请求;
               -x509: 专用于CA生成自签证书;不做自签时不要此选项
               -key: 生成请求时用到的私钥文件;
               -days n:证书的有效期限;
               -out /PATH/TO/SOMECERTFILE: 证书的保存路径;

加密学原理及openssl,私有CA搭建_secret_06

这步完成,CA自己的证书就完成了,可以发证给信任我们的客户端了

注意:上面的Common Name很重要(这里的值必须和DNS解析出来的服务器名称)保持一致

        (3) 发证
            (a) 用到证书的主机生成证书请求;
                # (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)

加密学原理及openssl,私有CA搭建_PKI_07

                # openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out                                                 /etc/httpd/ssl/httpd.csr

与上面的保持一致

加密学原理及openssl,私有CA搭建_特征码_08

            (b) 把请求文件传输给CA;

加密学原理及openssl,私有CA搭建_PKI_09

            (c) CA签署证书,并将证书发还给请求者;
                # openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

加密学原理及openssl,私有CA搭建_secret_10

        将签署好的证书发还客户端:

加密学原理及openssl,私有CA搭建_secret_11

                查看证书中的信息:
                openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|-subject|-serial

加密学原理及openssl,私有CA搭建_加密_12

查看:

加密学原理及openssl,私有CA搭建_secret_13

        (4) 吊销证书
            (a) 客户端获取要吊销的证书的serial
                # openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
            (b) CA
                先根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致;
                吊销证书:
                # openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
            (c) 生成吊销证书的编号(第一次吊销一个证书)
                # echo 01 > /etc/pki/CA/crlnumber
            (d) 更新证书吊销列表
                # openssl ca -gencrl -out thisca.crl
                查看crl文件:
              # openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text