文章目录
一、加密和算法
常见的安全攻击
- Spoofing 假冒
- Tampering 篡改
- Repudiation 否认
- Information Disclosure 信息泄漏
- Denial of Service 拒绝服务
- Elevation of Privilege 提升权限
加密算法和协议
- 对称加密
- 非对称(公钥)加密
- 单向加密
- 认证协议
对称加密
对称加密:加密和解密使用同一个密钥。
特性:
- 加密、解密使用同一个密钥,效率高
- 将原始数据分割成固定大小的块,逐个进行加密
缺陷:
- 密钥过多
- 密钥分发
- 数据来源无法确认
常见对称加密算法:
- DES:Data Encryption Standard,56bits
- 3DES:
- AES:Advanced (128, 192, 256bits)
- Blowfish,Twofish
- IDEA,RC6,CAST5
非对称加密算法
非对称加密:密钥是成对出现。
-
公钥:public key,公开给所有人,主要给别人加密使用。
-
私钥:secret key,private key 自己留存,必须保证其私密性,用于自已加密签名。
-
特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然。
功能:
- 数据加密:适合加密较小数据,比如: 加密对称密钥。
- 数字签名:主要在于让接收方确认发送方身份。
缺点:
- 密钥长,算法复杂。
- 加密解密效率低下。
常见算法:
- RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,可实现加密和数字签名。
- DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)。
- ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学,比RSA加密算法使用更小的密钥,提供相当的或更高等级的安全。
二、CA和证书
中间人攻击
Man-in-the-middle,简称为 MITM,中间人。
一般使用对称加密算法需要接收对方的公钥,然后用对方提供的公钥加密。但如果被中间人利用技术手段冒充截取了请求,那么自己的信息就会被泄露。如果有公钥验证是否可以避免?
简单来说,中间人在客户端和服务端之间,来回扮演,窃取信息。
CA和证书
PKI:Public Key Infrastructure 公共密钥加密体系
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书协议:
X.509:定义了证书的结构以及认证协议标准
- 版本号
- 序列号
- 签名算法
- 颁发者
- 有效期限
- 主体名称
获取证书两种方法:
- 自签名的证书: 自已签发自己的公钥。
- 使用证书授权机构:
- 生成证书请求(csr)。
- 将证书请求csr发送给CA。
- CA签名颁发证书。
CA认证机构列表
安全协议SSL/TLS
协议介绍
SSL (Secure Sockets Layer) 和 TLS (Transport Layer Security) 是两种用于在网络通信中提供安全性和隐私的加密协议。它们的主要目的是确保数据在互联网上传输时的保密性、完整性和身份验证。让我们详细了解这两种协议:
SSL (Secure Sockets Layer):
历史:SSL 由 Netscape 在 1990 年代初期开发。
版本:SSL 有 1.0、2.0 和 3.0 三个版本。
现状:所有 SSL 版本现在都被认为是不安全的,已被废弃。
TLS (Transport Layer Security):
历史:TLS 是 SSL 的继任者,由 IETF (Internet Engineering Task Force) 开发。
版本:TLS 1.0、1.1、1.2 和 1.3(最新版本)。
现状:TLS 1.2 和 1.3 是当前推荐使用的版本。
SSL/TLS 的工作原理:
握手:客户端和服务器通过一系列消息交换来建立安全连接。
密钥交换:双方协商用于加密通信的对称密钥。
身份验证:服务器(有时也包括客户端)通过数字证书证明其身份。
加密通信:建立安全连接后,所有数据都使用协商的密钥进行加密。
主要特点:
加密:保护数据免受窃听。
完整性:确保数据在传输过程中未被篡改。
身份验证:验证通信双方的身份。
向前保密:即使长期密钥泄露,过去的会话也不会被破解。
应用:
HTTPS:网页安全浏览。
安全电子邮件。
虚拟专用网络(VPN)。
文件传输协议(FTPS)。
即时通讯。
优势:
广泛支持:几乎所有现代web浏览器和服务器都支持SSL/TLS。
强大的安全性:使用最新的加密算法。
灵活性:可以用于各种网络协议。
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换。
- ChangeCipherSpec 协议:一条消息表明握手协议已经完成。
- Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告。
- Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。
HTTPS
HTTPS 协议:就是"HTTP 协议"和"SSL/TLS 协议"的组合。HTTP over SSL 或 HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输。
Https工作的简化过程
- 客户端发起HTTPS请求。用户在浏览器里输入一个https网址,然后连接到服务器的443端口。
- 服务端的配置。采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。
- 传送服务器的证书给客户端。证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等。
- 客户端解析验证服务器证书 。这部分工作是由客户端的TLS(Transport Layer Security)来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值(对称加密的密钥)。然后用证书中公钥对该随机值进行非对称加密。
- 客户端将加密信息传送服务器。这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
- 服务端解密信息。服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值。
- 服务器加密信息并发送信息。服务器将数据利用随机值进行对称加密,再发送给客户端。
- 客户端接收并解密信息。客户端用之前生成的随机值解密服务端传过来的数据,于是获取了解密后的内容。
三、openssl
openssl介绍
OpenSSL 是一个功能丰富的加密工具包,提供开源的 SSL 和 TLS 协议实现。
它包含一个通用的加密库和一个命令行工具。
主要功能
- SSL/TLS 协议实现
- 对称加密和解密
- 公钥加密和解密
- 数字签名和验证
- 哈希函数
- 随机数生成
- 证书管理
组件
- libssl:实现 SSL 和 TLS 协议
- libcrypto:实现各种加密算法和函数
- openssl:命令行工具
使用openssl实现对称加密
基本加密命令格式:
bash
openssl enc -[加密算法] -e -in [输入文件] -out [输出文件]
常用对称加密算法选项
- -aes-256-cbc: AES 256位 CBC 模式
- -aes-128-cbc: AES 128位 CBC 模式
- -des3: Triple DES
- -camellia-256-cbc: Camellia 256位 CBC 模式
常见附加选项
- -a: 使用 base64 编码输出
- -salt: 添加随机盐值(增强安全性)
- -pbkdf2: 使用 PBKDF2 密钥生成函数(推荐)
- -iter 10000: 指定迭代次数(与 -pbkdf2 一起使用,增加破解难度)
注意:
- 执行这些命令时,系统会提示输入密码。请记住这个密码,因为解密时需要相同的密码。
- 对于解密,必须使用与加密相同的算法和选项。
- -salt 选项在加密时会自动生成随机盐值,解密时会自动读取。
- 使用 -a 选项时,加密文件会是base64编码的文本格式。
实际例子
bash
openssl enc -e -des3 -a -salt -in a.txt -out a.txt.enc
对a.txt加密,并输出为
openssl enc -e -des3 -a -salt -in a.txt -out a.txt.enc
使用openssl命令生成加密密码
选项 | 含义 |
---|---|
-crypt (default) | 使用标准 Unix 密码算法(默认选项)。这是一种较旧的加密方法。 |
-1 | 使用基于 MD5 的密码算法。比 crypt 更安全,但现在也被认为不够安全。 |
-apr1 | 使用 Apache 变体的 MD5 基于密码算法。主要用于 Apache 服务器配置。 |
-salt string | 使用提供的字符串作为盐值。盐值增加了密码哈希的安全性。 |
-in file | 从指定文件中读取密码,而不是从命令行输入。 |
-stdin | 从标准输入读取密码。适用于脚本化处理。 |
-noverify | 从终端读取密码时不进行验证(不要求输入两次)。 |
-quiet | 不显示警告信息。 |
-table | 以表格格式输出结果。 |
-reverse | 切换表格列的顺序(与 -table 一起使用)。 |
bash
基本用法
openssl passwd -选项 密码
生成随机密码
选项 | 含义 |
---|---|
-out file | 指定输出文件 |
-engine e | 使用指定的加密引擎 |
-rand file:file:... | 为伪随机数生成器(PRNG)提供种子,使用指定文件的内容来初始化随机数生成器,提高随机性。示例:openssl rand -rand /dev/urandom:/proc/meminfo -base64 12 |
-base64 | 将二进制输出转换为可打印的 ASCII 字符 |
-hex | 使用十六进制编码输出 |
bash
openssl rand -base64 32 -out random.txt
32 字节的随机数,用 base64 编码,并保存到 random.txt 文件中
openssl rand -hex 16
在屏幕上输出 16 字节的随机数,以十六进制格式显示
建立私有CA证书申请颁发
建立私有CA:
- OpenCA:OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件。
- openssl:相关包 openssl和openssl-libs 。
证书申请及签署步骤:
- 生成证书申请请求
- RA核验
- CA签署
- 获取证书
配置文件:/etc/pki/tls/openssl.cnf
bash
[ ca ]
37 default_ca = CA_default
默认ca
42 dir = /etc/pki/CA
ca机构的总目录
43 certs = $dir/certs
存放证书
44 crl_dir = $dir/crl
证书吊销列表
45 database = $dir/index.txt
所有用户的证书的数据库索引,存放用户证书的相关信息。默认文件不存在,需要手动新建,但内容不用管。
new_certs_dir = $dir/newcerts
存放新证书的
50 certificate = $dir/cacert.pem
ca的自签名证书
51 serial = $dir/serial
证书编号
52 crlnumber = $dir/crlnumber
吊销证书的编号
54 crl = $dir/crl.pem
当前证书吊销列表
55 private_key = $dir/private/cakey.pem
私钥位置
73 default_days = 365
证书的有效期
74 default_crl_days= 30 # how long before next CRL
75 default_md = sha256 # use SHA-256 by default
76 preserve = no # keep passed DN ordering
证书策略
match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息
建立私有CA实际例子
bash
touch /etc/pki/CA/index.txt
生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial
指定下一个颁发证书的序列号 必须是01必须是两位,有格式要求
若无默认文件夹,需要单独新建文件夹
生成CA私钥
bash
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
小括号的意思是开启一个新的bash
genrsa: 这是 OpenSSL 的子命令,用于生成 RSA 密钥对。
2048: 这个数字指定了要生成的 RSA 密钥的位数(key size)。
生成CA自签名证书
bash
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
选项:
- -new:生成新证书签署请求
- -x509:专用于CA生成自签证书 协议x509
- -key:生成请求时用到的私钥文件
- -days n:证书的有效期限
- -out /PATH/TO/SOMECERTFILE: 证书的保存路径
bash
openssl x509 -in cacert.pem -noout -text
-in cacert.pem: 指定要读取的证书文件。
-noout: 这个选项抑制默认的证书输出。
如果不使用这个选项,命令会输出 PEM 格式的证书。
-text: 以易读的文本格式显示证书的详细信息。
非交互式建立自签名证书
bash
openssl req -utf8 -newkey rsa:1024 -subj "/CN=www.cxk.org" -keyout app.key -nodes -x509 -days 3650 -out app.crt
这个命令用于使用 OpenSSL 创建一个自签名的 SSL 证书。具体来说,它会生成一个 RSA 密钥和对应的 X.509 证书。以下是各个参数的含义:
- req: 生成一个证书签名请求(CSR)或自签名证书。
- -utf8: 使用 UTF-8 编码。
- -newkey rsa:1024: 生成一个新的 RSA 密钥对,密钥长度为 1024 位。
- -subj "/CN=www.kgc.org": 指定证书的主题信息,这里只设置了 CN(Common Name),即证书的通用名称为 www.kgc.org。
- -keyout app.key: 将生成的私钥保存为 app.key 文件。
- -nodes: 不加密生成的私钥文件(即不需要输入密码来保护密钥)。
- -x509: 直接生成一个自签名的 X.509 证书,而不是生成证书请求(CSR)。
- -days 3650: 指定证书的有效期为 3650 天(约 10 年)。
- -out app.crt: 将生成的证书保存为 app.crt 文件。
执行该命令后,会在当前目录下生成两个文件:
app.key: 私钥文件
app.crt: 自签名的 SSL 证书
这些文件可以用于配置 HTTPS 服务器,比如 Nginx 或 Apache。
配置例子
bash
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /path/to/cacert.pem;
ssl_certificate_key /path/to/private/cakey.pem;
# 其他配置...
}
用户申请证书
- 生成私钥 (一般以key结尾) 私钥
- 利用生成的私钥 生成 证书申请文件(一般csr文件) csr
- 生成证书文件(一般以crt结尾) crt
bash
建立私钥
mkdir /data/app1
openssl genrsa -out /data/app1/app1.key 2048
chmod 600 /data/app1/app1.key
生成证书申请文件
openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr
注意需要和CA那个匹配条件相匹配。
颁发证书
bash
openssl ca -in /data/app1/app1.csr -out /etc/pki/CA/certs/app1.crt -days 1000
openssl: 调用 OpenSSL 工具。
ca: 这是 OpenSSL 的子命令,用于执行证书颁发机构(CA)操作。
-in /data/app1/app1.csr:
指定输入文件,这里是一个证书签名请求(CSR)。
CSR 文件路径是 /data/app1/app1.csr。
-out /etc/pki/CA/certs/app1.crt:
指定输出文件,这将是新生成的证书。
新证书将被保存为 /etc/pki/CA/certs/app1.crt。
-days 1000:
设置证书的有效期为 1000 天。