加密解密技术基础
在看这篇文章之前,首先需要有加密解密的技术基础:
安全目标:
- 保密性:确保通信信息不被任何无关的人看到
- 完整性:实现通信双方的报文不丢失、数据完整性、系统完整性
- 可用性:通信任何一方产生的信息应当对授权实体可用
攻击类型:
威胁保密性的攻击:窃听、通信量分析 威胁完整性的攻击:更改、伪装、重放、否认 重放:攻击者能解惑双方通信的报文、并开始一遍遍发送 否认:通信双方的某一方发送的,下了订单却说没下 威胁可用性的攻击:拒绝服务(Dos)
解决方案
技术:加密解密
- 传统加密方法:替代加密方法、置换加密方法
- 现代加密方法:现代块加密方法
- 现代块加密:把发送的整个数据切割固定成块,每块单独加密,前后两个块建立关联关系
服务
目的: 用于抵御攻击的服务,也即是为了上述安全目标而特地设计的安全服务
服务内容: 认证机制 访问控制机制
密钥算法和协议
-
对称加密 -
公钥加密 -
单向加密 -
认证协议 加密数据依赖与算法和密钥,安全性依赖于密钥。因为算法是公开的人人都可以得到,但是密钥只有通信的主机才有 Linux系统上述功能解决方案: OpenSSL(ssl):OpenSSL是ssl协议和加密库的实现
加密算法:
对称加密:
加密和解密使用同一个密钥(DES、3DES、AES)
非对称加密:
密钥是成对出现(RSA、DSA、ELGamal),一个用于加密,另一个解密。 公钥(public key):从私钥中提取产生,公开给所有人 私钥(secret key):通过工具创建,自己留存,必须保证其私密性
实现加密: 接收者:生成公钥/密钥对:P和S;公开公钥P,保密密钥S 发送者: 使用接收者的公钥来加密消息M;将P(M)发送给接收者
算法 | 对称加密 | 非对称加密 |
---|
特性 | 1.加密、解密使用同一个密钥,效率高 ;2.将原始数据分割成固定大小的块,逐个进行加密 | 用公钥加密的数据,只有私钥能解密,其保密性能到了保障;性能较差,用私钥加密的数据,只能用公钥解密,任何人都何以获得公钥,可以确认发送方身份(身份认证) | 功能 | 数据加密:适合大量的数据 | 1. 数字签名:主要在于让接收方确认发送方身份,完成身份验证;2. 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方;3. 数据加密:适合加密较小数据 | 缺陷 | 1.密钥过多;2.密钥分发困难;3.数据来源无法确认 | 密钥长,加密解密效率低下 |
openssl简介
简介
OpenSSL由三部分组成:libencrypto库,libssl库,openssl多用途命令行工具。
OpenSSL是网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,它还是一个多用途的、跨平台的密码工具。
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已成为Internet上保密通讯的工业标准。安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。
SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。
SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
基本功能:
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分。如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的。
OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。
辅助功能
BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。
OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。
OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。
openssl实现加密通信过程
- 在通信之前,服务器通过加密算法生成一对密钥,把公钥发给CA,申请数字证书。
- CA审核之后,结合服务器发来的相关信息生成数字证书,并把该数字证书发回给服务端。
- 客户端和服务端经TCP三次握手,建立初步连接。
- 客户端发送http报文请求并协商使用哪种算法。
- 服务端相应报文并把自身的数字签名发送给客户端。
- 客户端下载CA的公钥,验证数字证书拥有者是否是服务端(这个过程可以得到服务端的公钥)。(一般是客户端验证服务端身份,服务端不用验证客户端身份)
- 如果验证通过,客户端生成一个随机对称密钥,用该密钥加密要发送的URL链接申请,再用服务端的公钥加密该密钥。(密钥交换)
- 把加密的密钥和加密的URL链接一起发送到服务端。
- 服务端使用自身的私钥解密,获得一个对称密钥,再用对称密钥解密经加密的URL链接,获得URL链接申请,
- 服务端根据获得的URL链接取得该链接的网页,并用客户端发来的对称密钥把该网页加密后发给客户端。
- 客户端收到加密的网页,用对称加密的密钥解密,就能获得网页的内容。
- TCP四次握手,通信结束。
PKI公钥基础设施
是一种遵循既定标准的秘钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必须的密钥和证书管理体系,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI技术是信息安全技术的核心,也是电子商务的关键和基础技术。
PKI的组成:
完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。
PKI的基础技术包括加密,数字签名,数据完整机制,数字信封,双重数字签名等。
签证机构:CA 用户再注册机构注册证书,CA就会签发用户的公钥认证,并且和申请者的信息绑定再一起并且签名(是一种用CA的公钥的签名)后,以证书形式发给申请者,然后再本地的证书库存取库备份。
注册机构:RA 用户再这里注册证书
证书吊销列表:CRL 如果用户私钥丢失,必须要申请吊销证书,否则会被别人冒名顶替。
证书存取库: 所有发出的证书都会在这里存一份,如果丢失证书可以在这里得到,如果丢失私钥,那么只能申请证书撤销。
X509证书结构以及协议标准
X.509 :定义了证书的结构以及认证协议标准
版本号:标识证书的版本
序列号:标识证书的唯一证书,类似于身份证
签名算法ID:证书的算法标识
发行者名称:证书颁发这的可识别名
有效期限:证书有效的时间段
主体名称:证书拥有着的可识别名
主体公钥:关键部分
发行者的唯一标识:证书颁发者的唯一标识符
主体的唯一标识:证书拥有者的唯一标识符
扩展信息
发行者的签名:证书颁发者对证书的签名,上述整个内容做单向加密,得到的特征码用自己私钥加密,并附加到后面,用来生产发行者的签名
获取证书的步骤
要理解创建证书的每一步操作必须要先理解创建证书的流程和每一步的含义(生成证书又有标准CA签发、自签名CA和私有CA签发,我们这边主要讨论私有CA)。
为什么使用私有CA签发证书呢? 如果你的规划需要创建多个证书,那么使用私有CA的方法比较合适,因为只要给所有的客户端都安装了CA的证书,那么以该证书签名过的证书,客户端都是信任的,也就是安装一次就够了
如果你直接用自签名证书,你需要给所有的客户端安装该证书才会被信任,如果你需要第二个证书,则还的挨个给所有的客户端安装证书2才会被信任。
生成证书的标准流程:
- 创建私有CA:
- 客户端:
生成私钥文件(client.key) 基于私钥生成证书请求文件(.csr) 将证书请求文件(.csr)提交给证书颁发机构CA,CA对其进行“签名”(对提交的证书生成摘要,使用CA根证书对应的私钥进行加密),得到真正的签发证书(.cer或者.crt) - CA签署该请求,生成证书,再传给客户端
- 客户端拿到签发后的证书,根据需要再进行各种格式转换(.pem .p12 .jks等等)
openssl实现私有CA签发证书
生成私有CA证书的场景涉及两个角色:
签发证书的CA
们可以利用自己建立的测试CA来为服务器端颁发服务器数字证书,为客户端(浏览器)生成文件形式的数字证书(可以同时利用openssl生成客户端私钥)。
创建CA需要用到的目录和文件
#!/bin/bash
ls
mkdir testca
cd testca
mkdir newcerts private conf
chmod g-rwx,o-rwx private
echo "01" > serial
touch index.txt
mkdir newcerts private conf
chmod g-rwx,o-rwx private
echo "01" > serial
touch index.txt
testca为待建CA的主目录。其中newcerts子目录将存放CA签署(颁发)过的数字证书(证书备份目录)。而private目录用于存放CA的私钥。目录conf只是用于存放一些简化参数用的配置文件。 ??文件serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库。当然,偷懒起见,可以只用按照本文操作即可,不一定需要关心各个目录和文件的作用。
生成CA的私钥和自签名证书
创建文件:(在\testca\conf文件夹下)
####################################
[ req ]
default_keyfile = /home/testca/private/cakey.pem #需要修改为自己的实际路径
default_md = md5
prompt = no
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
[ ca_distinguished_name ]
organizationName = TestOrg #可以自定义CA的信息
organizationalUnitName = TestDepartment #可以自定义CA的信息
commonName = TestCA #可以自定义CA的信息
emailAddress = ca_admin@testorg.com #可以自定义CA的信息
[ ca_extensions ]
basicConstraints = CA:true
########################################
进入testca目录下,然后执行命令(生成X509CA证书)
openssl req -x509 -newkey rsa:2048 -keyout myCA.key -out myCA.crt -days 3650 -config "/home/fmq/QTproject/test/build-testcmd-Desktop_Qt_5_9_0_GCC_64bit-Debug/testca/conf/gentestca.conf"
执行过程中,需要输入CA私钥的保护密码,假设我们输入密码:123456。 注释:CA使用自己的私钥myCA.key,按照gentestca.conf文件中的规则自签名生成证书。
CA为server签发证书
前面申请证书的流程已经说明过了如何生成证书,在openssl上面如何实现呢?
mkdir server
cd server
openssl req -newkey rsa:2048 -nodes -keyout server.key -out serverreq.csr -subj "/O=ServerCom/OU=ServerOU/CN=server"
openssl x509 -req -in serverreq.csr -CA ../testca/myCA.crt -CAkey ../testca/myCA.key -CAcreateserial -out server.crt -days 3650
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name "server"
为什么进行格式转换呢? 搞懂 PEM、ANS、PFX、P12、p8、CER、X509 等证书相关文件格式 后缀
CA为client签发证书
和为server签发证书同理,可以获得以下文件
我们通过上面的代码建立了私有CA,并为server以及client颁发了证书,因此,可以基于证书验证实现通信的测试。
参考文献: openssl库的使用和用法详解 PKI/CA技术 加密解密:PKI详解 使用OpenSSL生成/签发证书的原理、流程与示例 基于openssl工具完成自建CA以及为server,client颁发证书
|