安全加密与证书签发工具--openssl
写在前面:
博客书写牢记5W1H法则:What,Why,When,Where,Who,How。
本篇主要内容:
● 安全协议
● 数据安全问题及解决方案
● **算法及通讯过程
● 使用OpenSSL命令行工具创建私有CA、签发证书、维护crl证书吊销列表
回顾:
资源子网:关注数据包组成(应用软件)
通讯子网:关注数据传输过程(linux内核来实现)
TCP/IP:
应用层协议:http/ftp...
传输层协议:tcp/udp/sctp
互联网层协议:ipv4/ipv6
物理层:ppp,以太网
主机通讯:
本机不同进程:IPC,message queue,shm,semerphor
不同主机进程:socket(是由成对的IP:port组成的,client IP:port <--> Server IP:port)
不同主机通讯需要先连接到port,进而找到通讯进程,所以port是被进程独占的。进程使用端口需向内核注册使用。
不同主机通讯,服务端端口必须一直处于监听(listen)状态以供客户端访问。而客户端通过约定俗成来找到常见服务的端口(如http服务的80端口,访问时不必明确指出);通过DNS服务来找到服务端IP地址。
端口分配:
1-1024:系统服务占用(如80、22、21、)
< 4W :半随机,有一些不太常见的服务占用(mysql 3306,oracle 1521)
> 4W :随机
安全协议:
SSL:Secure Sockets Layer(安全套接字层)
版本:V1.0 V2.0 V3.0(现用)
TLS:Transport Layer Security(传输层安全)
IETF:1999年
V1.0 V1.1 V1.2(现用) V1.3
SSL、TLS协议分层设计:
1、最底层:基础算法原语的实现,aes, rsa, md5
2、向上一层:各种算法的实现;
3、再向上一层:组合算法实现的半成品;
4、用各种组件拼装而成的各种成品密码学协议软件;
SSL、TLS协议是一个公共功能库,在传输层与应用层之间的半层。当应用程序调用时使用,不调用则不使用。
如:http服务调用SSL或TLS功能库之后,就转换成了安全的https服务了。
安全的目标:
保密性:confidentiality
完整性:integrity
可用性:availability
***类型;
威胁保密性:窃听、通信量分析
威胁完整性:更改、伪装、重放、否认(通信中的一方)
威胁可用性:拒绝服务(DoS)
解决方案:
(1)技术上:
加密解密:
使用某种算法得到非明文信息,而参与算法的一串字符即为密码。
传统加密方法:
替代加密算法、置换加密算法
现代加密方法:
现代块加密方法:
将整个数据分割成多个块,单独进行加密,进行复杂的运算,使得必须得到全部数据和密码才能够解密。
(2)服务:
使用安全服务,可抵御***的服务。
认证机制
访问控制机制
**算法和协议
**算法和协议
为了解决加密解密传输过程中,密码交换过程的安全的服务。
对称加密:
特点:
(1) 加密解密使用同一个**
(2) 将原始数据分隔成为固定大小的块,逐个进行加密
缺陷:
(1) **过多(对服务器端来说,会产生大量**)
(2) **分发困难
常用算法:
DES:Data Encryption Standard(已不安全)
3DES:Triple DES(64bits)
AES:Advanced Encryption Standard(128bis、192bits、256bits、384bits)
Blowfish
Twofish
IDEA
RC6
CAST5
非对称加密
特点:
成对出现公钥和私钥;
公钥加密,必须用私钥解密;
私钥加密,必须用公钥解密。
公钥:
从私钥中提取产生,可公开给所有人,pubkey。
私钥:
通过工具创建,使用者留存,必须保证私密性,secret key。
用途:
数字签名:
私钥加密,公钥解密。用于使接收方确认发送方身份。
**交换IKE(Internet Key Exchange):
公钥加密,私钥解密。发送方使用对方公钥加密一个对称加***,并发送给对方。
**交换也可以使用DH(Deffie-Hellman)来实现
数据加密:
常用算法:
RSA:可用于签名和加解密
DSA:仅签名
ELGamal
非对称加密方式通讯过程:
单向加密
特征:
提取数据指纹。只能加密,不能解密
定长输出
雪崩效应。初始结果的微小改变导致结果的巨大变化
功能:
完整性验证
常用算法:
md5:Message Digest 5,128bits定长输出
sha1:Secure Hash Algorithm 1,160bits定长输出,即40个字母数字的组合
sha224/sha256/sha384/sha512
认证协议
**交换
常用算法:
RSA
公钥加密
DH
此算法通过随机大质数的数学算法得到,不会将密码在互联网上传送,比公钥加密的方式更具优势。
ECDH(椭圆曲线DH)
ECDHE(临时椭圆曲线DH)
CA:
非对称加密的过程中,由于通讯双方互不认识,为了正确的获得对方的公钥,防止中间人***,我们需要一个双方都认可的第三方来认证,而这个第三方就是CA。
CA为通讯双方签发证书(证书中含有公钥),为双方身份提供担保。
PKI:Public Key Infrastructure
即公钥基础设施
组成部分:
签证机构:CA
***构:RA
证书吊销列表:CRL
证书存取库:
X.509v3:
定义了证书结构及认证协议标准
版本号:X.509目前有3个版本,最多用的是v3版本
***:本章证书是CA签发的第多少张证书
签名算法ID:数字签名中单向加密所使用的算法
发行者名称:CA的名称
有效期限
主体名称
主体公钥
发行者的唯一标识
主体的唯一标识
扩展信息
发行者签名
SSL会话步骤:
(1) 客户端向服务器端索要并验证证书;
(2) 双方协商生成“会话**”;
(3) 双方采用“会话**”进行加密通讯;
其中1、2步骤为握手阶段(Handshake)
SSL Handshake Protocol:
第一阶段:ClientHello:
支持的协议版本,比如tls 1.2;
客户端生成一个随机数,稍后用户生成“会话**”
支持的加密算法,比如AES、3DES、RSA;
支持的压缩算法;
第二阶段:ServerHello
确认使用的加密通信协议版本,比如tls 1.2;
服务器端生成一个随机数,稍后用于生成“会话**”
确认使用的加密方法;
服务器证书;
第三阶段:
验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)
发送以下信息给服务器端:
一个随机数;
编码变更通知,表示随后的信息都将用双方商定的加密方法和**发送;
客户端握手结束通知;
第四阶段:
收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话**”;
向客户端发送如下信息:
编码变更通知,表示随后的信息都将用双方商定的加密方法和**发送;
服务端握手结束通知;
linux系统上**算法和协议的实现工具:
GPG(pgp)
OpenSSL(ssl)
组成:
libencrypto:库,加密解密算法的实现
libssl:库,SSL半层功能库的实现,用于通讯
openssl:命令行工具
openssl命令行工具实现**算法与协议:
openssl
子命令:
标准命令
enc, ca, req, genrsa, ...
消息摘要命令
dgst子命令
加密命令
enc子命令
实现对称加密:
工具:openssl enc
其他工具:gpg
支持的算法:3des, aes, blowfish, towfish
enc命令:
加密:
~]# openssl enc -e -des3 -a -salt -in FILE -out FILE_AFTER_ENC
解密:
~]# openssl enc -d -des3 -a -salt -out FILE -in FILE_AFTER_ENC
实现单向加密:
工具:openssl dgst
其他工具:md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
生成用户密码:
工具:openssl passwd
其他命令:passwd命令
命令:
~]# openssl passwd -1 -salt SALT
生成随机数:
工具:openssl rand
命令:
~]# openssl rand -hex NUM
~]# openssl rand -base NUM
公钥加密:
加密解密:
算法:RSA,ELGamal
工具:openssl rsautl, gpg
数字签名:
算法:RSA, DSA, ELGamal
工具:openssl rsautl, gpg
**交换:
算法:DH
生成**对:
生成私钥:
~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
NUM_BITS为2的n次方
提出公钥:
~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
创建私有CA:
工具:openssl、OpenCA
配置文件:/etc/pki/tls/openssl.cnf
定义了证书目录、***文件、数据库文件等等
目标:
在确定配置为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;
生成过程需要输入一些信息:
国家代码,省、城市、公司名、部门名、主机名、Email
(3) 为CA提供所需的目录及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
serial为***存储文件,“01”将作为第一个CA签发的证书的***,文件为空时不能正确签发证书。
其他需安全通信的服务器向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
注意:这里填写的信息应该与CA证书保持一致,主机名必须与外界访问的域名相同。
(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
(5) 将证书通过可靠方式发回给请求主机
吊销证书:
步骤:
(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
转载于:https://blog.51cto.com/1036416056/1761565