目录
一.中间人攻击
Man-in-the-middle,简称为MITM,中间人
一般使用对称加密算法需要 接收对方的公钥,然后用对方提供的公钥加密。
但如果被中间人利用技术手段冒充截取了请求,那么自己的信息就会被泄露
如果有公钥验证是否可以避免?
二.CA和证书
PKI:Public Key Infrastructure 公共密钥加密体系
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书协议:
X.509:定义了证书的结构以及认证协议标准
-
版本号
-
序列号
-
签名算法
-
颁发者
-
有效期限
-
主体名称
获取证书两种方法:
-
自签名的证书: 自已签发自己的公钥
-
使用证书授权机构:
-
生成证书请求(csr)
-
将证书请求csr发送给CA
-
CA签名颁发证书
-
设置-internet选项
三.安全协议SSL/TLS
1.TLS介绍
SSL:Secure Socket Layer,TLS: Transport Layer Security
1994年,NetScape(网景)公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布
1995:SSL 2.0 Netscape 开发
1996:SSL 3.0
1999:TLS 1.0
2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346,从2020年3月起,停止支持TLS 1.1及TLS 1.0版本安全协议,谷歌(Chrome)、Mozilla(Firefox)、微软(IE和Edge) 、苹果(Safari) 都会发布新版浏览器执行这个策略
2008:TLS 1.2 当前主要使用
2018:TLS 1.3
功能:
-
机密性
-
认证
-
完整性
-
重放保护
2.SSL/TLS组成
-
Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
-
ChangeCipherSpec 协议:一条消息表明握手协议已经完成
-
Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
-
Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
3.HTTPS
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL 或 HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输
HTTPS工作的简化过程
-
客户端发起HTTPS请求 用户在浏览器里输入一个https网址,然后连接到服务器的443端口
-
服务端的配置 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥
-
传送服务器的证书给客户端 证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等
-
客户端解析验证服务器证书 这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书中公钥对该随机值进行非对称加密
-
客户端将加密信息传送服务器 这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了
-
服务端解密信息 服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值
-
服务器加密信息并发送信息 服务器将数据利用随机值进行对称加密,再发送给客户端
-
客户端接收并解密信息 客户端用之前生成的随机值解密服务端传过来的数据,于是获取了解密后的内容
四.openssl
1.openssl介绍
OpenSSL计划在1998年开始,其目标是发明一套自由的加密工具,在互联网上使用。OpenSSL以Eric Young以及Tim Hudson两人开发的SSLeay为基础,随着两人前往RSA公司任职,SSLeay在1998年12月停止开发。因此在1998年12月,社群另外分支出OpenSSL,继续开发下去
OpenSSL管理委员会当前由7人组成,有13个开发人员具有提交权限(其中许多人也是OpenSSL管理委员会的一部分)。只有两名全职员工(研究员),其余的是志愿者
该项目每年的预算不到100万美元,主要依靠捐款。 TLS 1.3 的开发由 Akamai 赞助OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上
其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。OpenSSL可以运行在OpenVMS、 Microsoft Windows以及绝大多数类Unix操作系统上(包括Solaris,Linux,Mac OS X与各种版本的开放源代码BSD操作系统)
心脏出血漏洞:OpenSSL 1.0.1版本(不含1.0.1g)含有一个严重漏洞,可允许攻击者读取服务器的内存信息。该漏洞于2014年4月被公诸于世,影响三分之二的活跃网站
包括三个组件:
-
libcrypto:用于实现加密和解密的库
-
libssl:用于实现ssl通信协议的安全库
-
openssl:多用途命令行工具
2.openssl命令
两种运行模式:
-
交互模式
-
批处理模式 命令+选项
三种子命令:
-
标准命令
-
消息摘要命令
-
加密命令
范例: openssl的交互和非交互式查看版本
[root@localhost ~]#openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
2.1 使用openssl 实现对称加密
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
enc命令:帮助:man enc
加密:
cat a.txt
openssl enc -e -des3 -a -salt -in a.txt -out a.txt.enc
#使用 OpenSSL 对 a.txt 文件进行加密
openssl enc -e:表示开始加密操作。
-des3:指定使用 Triple DES(3DES)加密算法。
-a:将输出编码为 Base64 格式。
-salt:使用随机盐值以增强安全性。
-in a.txt:指定要加密的输入文件。
-out a.txt.enc:指定加密后的输出文件
解密
openssl enc -d -des3 -a -salt -in a.txt.enc -out b.txt
#使用 OpenSSL 工具解密一个使用 DES3 算法加密的文件
openssl enc -d:调用 OpenSSL 的加密/解密功能,-d 表示解密操作。
-des3:指定使用 DES3(Triple DES)算法进行解密。
-a:表示使用 Base64 编码/解码,通常用于处理文本格式的加密数据。
-salt:使用加密时添加的盐值(salt),增加破解难度。
-in a.txt.enc:指定输入文件 a.txt.enc,这是已加密的文件。
-out b.txt:指定输出文件 b.txt,解密后的结果将保存到这个文件中
cat b.txt
2.2 使用openssl 命令生成加密密码
用法
openssl passwd --help
#centos8
-help:显示帮助信息。
-in infile:从文件中读取密码。
-noverify:在从终端读取密码时不进行验证。
-quiet:不显示警告。
-table:将输出格式化为表格。
-reverse:反转表格的列。
-salt val:使用指定的盐值进行加密。
-stdin:从标准输入读取密码。
-6:使用基于 SHA512 的密码算法。
-5:使用基于 SHA256 的密码算法。
-apr1:使用 MD5 的 Apache 变种密码算法。
-1:使用基于 MD5 的密码算法。
-aixmd5:使用 AIX 系统的 MD5 密码算法。
-crypt:使用标准 Unix 密码算法(默认)。
-rand val:将文件加载到随机数生成器中。
-writerand outfile:将随机数据写入指定的文件中。
#centos7
-crypt:使用标准的 Unix 密码加密算法(默认)。
-1:使用基于 MD5 的加密算法。
-apr1:使用 Apache 特定的 MD5 变体加密算法。
-salt string:使用指定的盐值进行加密。
-in file:从指定的文件中读取密码。
-stdin:从标准输入读取密码。
-noverify:在输入密码时跳过验证。
-quiet:不显示警告信息。
-table:将输出格式化为表格。
-reverse:在表格格式中交换列。
加密密码
openssl passwd -apr1 123123
#使用 Apache 特定的 MD5 变体加密算法。
openssl passwd -1 123123
#使用基于 MD5 的加密算法。
2.3 生成随机密码
帮助:man sslrand
openssl rand --help
-out filename:指定输出文件,将生成的随机字节写入该文件。
-base64:以 Base64 编码格式输出随机字节,通常用于生成随机密钥或令牌。
-hex:以十六进制格式输出随机字节。
-engine id:指定使用的加密引擎。
-rand file(s):指定一个或多个文件,作为生成随机字节的种子。
示例:
生成随机10位长度密码
openssl rand -base64 9
生成10位数随机密码
openssl rand -base64 6
生成7位数随机密码
openssl rand -base64 10
#生成随机密码-base64后面通常跟3的倍数,否则会含有‘=’
openssl rand -base64 15|head -c 12
生成一个随机的 Base64 编码15个字符的字符串,然后只输出这个字符串的前 12 个字符。
3.建立私有CA实现证书申请颁发
建立私有CA:
-
OpenCA:OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件
-
openssl:相关包 openssl和openssl-libs
证书申请及签署步骤:
1、生成证书申请请求
2、RA核验
3、CA签署
4、获取证书
范例:openssl-libs包
rpm -ql openssl-libs
openssl的配置文件
/etc/pki/tls/openssl.cnf
格式说明
35 ####################################################################
36 [ ca ]
37 default_ca = CA_default # 默认ca
38
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 # The CA certificate ca的自签名证书
51 serial = $dir/serial # The current serial number 证书编号
52 crlnumber = $dir/crlnumber # the current crl number 吊销证书的编号
54 crl = $dir/crl.pem # The current CRL
55 private_key = $dir/private/cakey.pem # The private key 私钥位置
73 default_days = 365 # how long to certify for 证书的有效期
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匹配、optional可选、supplied提供
match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息
[ policy_match ]
85 countryName = match
86 stateOrProvinceName = match
87 organizationName = match
88 organizationalUnitName = optional
89 commonName = supplied
90 emailAddress = optional
95 [ policy_anything ]
96 countryName = optional
97 stateOrProvinceName = optional
98 localityName = optional
99 organizationName = optional
100 organizationalUnitName = optional
101 commonName = supplied
102 emailAddress = optional
4.实际例子 建立私有CA
cat /etc/pki/tls/openssl.cnf
dir = /etc/pki/CA # ca机构的总目录
certs = $dir/certs # 存放用户证书
crl_dir = $dir/crl # 证书吊销列表
database = $dir/index.txt # 所有用户的证书的数据库索引, 存放用户证书的 相关信息 默认文件不存在,需要手动新建,单内容不用管new_certs_dir = $dir/newcerts # 存放新证书的
certificate = $dir/cacert.pem # The CA certificate ca的自签名证书
serial = $dir/serial # The current serial number 证书编号
crlnumber = $dir/crlnumber # the current crl number 吊销证书的编号
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem # The private key 私钥位置
4.1 创建CA所需要的文件及文件夹
touch /etc/pki/CA/index.txt
#生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial
#指定下一个颁发证书的序列号 必须是01 有格式要求
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
[root@localhost ~]#ls /etc/pki/CA/
#若无 默认文件夹需要单独新建
certs crl index.txt newcerts private serial
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
openssl genrsa -out private/cakey.pem 2048
ll private/
chmod 600 private/cakey.pem
ll private/
生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
#使用指定的私钥生成一个有效期为 10 年的自签名 X.509 证书,并将生成的证书保存到指定的路径。
openssl req:调用 OpenSSL 工具来生成证书请求或处理证书相关的操作。
-new:生成一个新的证书请求。
-x509:指定生成的是一个自签名 X.509 证书,而不是证书请求。
-key /etc/pki/CA/private/cakey.pem:指定用于签署证书的私钥文件的路径。这个私钥文件存储在 /etc/pki/CA/private/cakey.pem 位置。
-days 3650:指定证书的有效期为 3650 天(即 10 年)。
-out /etc/pki/CA/cacert.pem:指定生成的自签名证书的输出路径,证书将被保存到 /etc/pki/CA/cacert.pem 文件中。
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
cat private/cakey.pem
openssl x509 -in cacert.pem -noout -text
#解码
非交互式建立 自签名证书
openssl req -utf8 -newkey rsa:1024 -subj "/CN=www.kgc.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。
openssl x509 -in app.crt -noout -text
#查看X.509证书的详细信息
4.2 用户申请证书
-
生成私钥 (一般以key结尾) 私钥
-
利用生成的私钥 生成 证书申请文件(一般csr文件) csr
-
生成证书文件(一般以crt结尾) crt
建立私钥
mkdir /data/app1
openssl genrsa -out /data/app1/app1.key 2048
chmod 600 /data/app1/app1.key
(umask 066;openssl genrsa -out /data/app1/app1.key 2048)
生成证书申请文件
openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr
Country Name (2 letter code) [XX]: CN
国家名称(2位字母代码):输入国家的两字母代码。CN,表示中国。
State or Province Name (full name) []: jiangsu
省或州名称(全名):输入所在的省份或州的全名。jiangsu,表示江苏省。
Locality Name (eg, city) [Default City]: suzhou
城市名称(例如,城市):输入所在城市的名称。suzhou,表示苏州市。
Organization Name (eg, company) [Default Company Ltd]: zxy
组织名称(例如,公司):输入公司的名称。kgc,这是公司名称。
Organizational Unit Name (eg, section) []: it
组织单位名称(例如,部门):输入组织中的部门或单位名称。it,表示IT部门。
Common Name (eg, your name or your server's hostname) []: www.zxy.com
常用名称(例如,你的名字或服务器的主机名):输入证书将用于的主机名或域名。www.zxy.com,这是网站的域名。
Email Address []:
电子邮件地址:你可以选择性地输入一个电子邮件地址,这通常是用于联系的。
A challenge password []:
挑战密码:这是一个可选的密码,用于额外的身份验证。如果不需要,可以留空。
An optional company name []:
可选的公司名称:这是一个额外的字段,用于输入公司名称。如果没有需要,可以留空。
颁发证书
openssl ca -in /data/app1/app1.csr -out /etc/pki/CA/certs/app1.crt -days 1000
cat /etc/pki/CA/index.txt
cat /etc/pki/CA/serial
验证证书是否有效
openssl ca -status 01
V 有效
01 证书编号
openssl ca -status 2
sz /etc/pki/CA/certs/app1.crt
五.一键脚本
CA_SUBJECT="/O=kgc/CN=ca.kgc.com"
SUBJECT="/C=CN/ST=js/L=nj/O=kgc/CN=www.kgc.com"
SERIAL=34
EXPIRE=202002
FILE=kgc.com
openssl req -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt
openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key -subj $SUBJECT -out ${FILE}.csr
openssl x509 -req -in ${FILE}.csr -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out ${FILE}.crt
chmod 600 ${FILE}.key ca.key