加密解密技术基础、PKI及创建私有私有CA_ssl


Linux基础中的加密、解密及openssl
 数据为什么要加密?
      由于互联网刚开始时使用的人非常少,在互联网中交流信息的人都比较“单纯”几乎没有安全问题;但随着互联网的快速发展,整个互联网中涌入了大量的用户,正所谓林子大了什么鸟都有,随之而来的就是数据的安全性得不到保障;因此就有了对数据的加密及解密。
 
安全的目标
       信息加密的目的是为了确保所传输的信息具有保密性,不被其他人所劫持后篡改信息;如果被篡改后接收方也应该能知道,而且也应该确保没被劫持的信息接收方可以读取。
 
加密算法
       加密在很早之前就已经存在。远在计算机还没问世之前世界上就已经出现了,例如中国古代的虎符和信牌,或者矾书等。到现在为止密码或加密技术已经广泛应用在生活中的各种场景中,尤其是在这个互联网时代中加密技术更是发展到了极致

对称加密
       通信双方使用同一个密钥对明文进行加密和解密。这样就确保了就算是通信的信息被第三方知道,由于没有密钥也不能解密被加密的信息;这种加密方法确保了数据的安全性,但使用的密钥必须由安全的方式在两方之间传输。        
 
公钥加密
       公钥加密也称非对称加密,密钥分为私钥和公钥。其中公钥是从私钥中提取的。而且加密解密的方式是:公钥加密必须用与之对应的私钥来解密,反之亦然;
  一般私钥只有加密者本身具有,对应的公钥所有人都可以得到。公钥加密主要可以实现对身份的验证。例如,A用私钥加密一个文件要送给B,B接受到后只有用与A的私钥相对于的公钥解密,如果能解密则说明这个文件是A发送的。
 
单向加密
      单向加密的特点是只能加密不能解密。而且这种加密算术也称为hash散列函数,这种算法会把不同长度的数据压缩成固定长度的一段字符。
  这种加密方法一般用来验证数据的完整性。发送方用单向加密加密数据后会得到一个特征码,接收方收到数据后也用同样的算法加密数据也得到一个特征码。把这两个特征码作比较如果相同则说明数据没有被改动过。
转自【IT精英团】:http://www.itnpc.com/news/web/145238462635582.html



    加密算法和协议:

    对称加密:数据加密(保密性),(3DES,AES)

    公钥加密:身份认证、密钥交换、数据加密(不常用,比对称加密要慢3个数量级),(RSA,DSA)

    单向加密:数据完整性,(MD5, SHA1, ...)

    密钥交换: RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

    

    

    SSL/TLS

    SSL: 安全套接字层(ssl 1.0, ssl 2.0, ssl 3.0)

    TLS:传输层安全 (tls 1.0, tls 1.1, tls 1.2, tls 1.3)

加密解密技术基础、PKI及创建私有私有CA_CA_02

一、SSL协议的握手过程

开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)。

假定客户端叫做爱丽丝,服务器叫做鲍勃,整个握手过程可以用下图说明(点击看大图)。

加密解密技术基础、PKI及创建私有私有CA_ssl_03

握手阶段分成五步。

第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。

第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。

第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。

第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。

第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"(session key),用来加密接下来的整个对话过程。

SSL Handshake Protocol:

第一阶段:ClientHello:

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

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

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

支持的压缩算法;

第二阶段:ServerHello

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

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

确认使用的加密方法;

服务器证书;

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

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

一个随机数;

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

客户端握手结束通知;

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

向客户端发送如下信息:

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

服务端握手结束通知;


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

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

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

伪随机数不安全;

熵池中随机数的来源:

硬盘IO中断时间间隔;

键盘IO中断时间间隔;

    PKI是Public KeyInfrastructure的首字母缩写,翻译过来就是公钥基础设施;PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。

    PKI:公钥基础设施

签证机构:CA

注册机构:RA

证书吊销列表:CRL

证书存取库


           CA是PKI的核心,负责管理PKI结构下的所有用户的证书。通信双方认证对方身份必须要通过CA。
    常用的证书格式是 x509 格式,它包含有下面的信息:
    版本号(version)
    序列号(serial number),CA 用于唯一标志此证书
    签名算法标志(signatur algotithm ientifier)
    发行者的名称,即 CA 自己的名称
    有效期,起始日期和终止日期
    主体自己的公钥
    发行商的唯一标识
    整数主题的唯一标志
    扩展信息
    签名:CA 对此证书的数字签名


加密解密技术基础、PKI及创建私有私有CA_CA_04


ssl组件:

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

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


单向加密:

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


dgst命令:

~]# openssl  dgst  -md5  /PATH/TO/SOMEFILE


生成用户密码:

工具:passwd, openssl  passwd


openssl  passwd  -1  -salt  SALT


生成随机数:

工具:openssl  rand


~]# openssl  rand  -hex  NUM

~]# openssl  rand  -base  NUM


公钥加密:

加密解密:

算法:RSA,ELGamal

工具:openssl  rsautl, gpg

数字签名:

算法:RSA, DSA, ELGamal

工具:

密钥交换:

算法:DH



生成私钥:

 ~]# (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)

提出公钥:

 ~]#  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout


建立私有CA:


openssl命令:

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


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


吊销证书:

步骤:

(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