HTTPS证书¶
一. HTTPS证书生成流程¶
1. 对称加密¶
Ⅰ. 特点
- 加密和解密的密钥相同。
- 执行效率快,安全性差。
Ⅱ. 案例
| 发送方 | 发送方值 | 接收方值 | 接收方 | |
|---|---|---|---|---|
| 原文 | abcd1234 | defg4567 | 收到密文 | |
| 加密算法 | + | 解密算法 | - | |
| 密钥 | 3 | 密钥 | 3 | |
| 加密密文 | defg4567 | 解密后原文 | abcd1234 |
常用的对称加密算法有:DES、3DES等。
2. 非对称加密¶
Ⅰ. 特点
- 加密和解密的密钥不同。
- 产生密钥:公钥和私钥。其中公钥公开,自己保管。
- 知道其中一方,永远无法推算出另一方的值。
Ⅱ. 案例
| 发送方甲 | 发送方值 | 接收方值 | 接收方乙 | |
|---|---|---|---|---|
| 原文 | abcd1234 | A#!#%$2 | 收到密文 | |
| 手中密钥 | 甲的私钥乙的公钥 | 乙的私钥甲的公钥 | 手中密钥 | |
| 加密 | 利用乙的公钥对原文加密 | |||
| 解密 | 利用乙的私钥对原文解密 | 解密 | ||
| 加密密文 | A#!#%$2 | abcd1234 | 解密后原文 |
3. 数据加密¶
Ⅰ. 动作
- 发送方使用接收方公钥加密,接收方使用自己的私钥解密。
- 数据加密可以保证数据的机密性。
Ⅲ. 流程图
flowchart LR
A[发送方甲] -->|使用乙的公钥加密| B[加密密文]
B -->|网络传输| C[接收方乙]
C -->|乙的私钥解密| D[原文 ✅]
4. 数字签名¶
Ⅰ. 动作
- 发送方使用自己的私钥进行加密,接收方使用发送方的公钥进行解密。
- 数据签名是为了保证身份验证、操作的不可否认性、数据的一致性。
Ⅱ.流程图
flowchart TB
subgraph 发送方甲
A1[原文 abcd1234] --> A2[哈希计算]
A2 --> A3[散列值 hash]
A3 --> A4[甲的私钥加密]
A4 --> A5[签名值]
end
subgraph 网络传输
A1 -.-> B1
A5 -.-> B1
B1[原文 + 签名值] --> B2[接收方乙]
end
subgraph 接收方乙
B2 --> C1[拆包]
C1 --> C2_1[原文] & C2_2[签名值]
C2_1 --> C3[哈希计算]
C3 --> C4[散列值 hash1]
C2_2 --> C5[甲的公钥解密]
C5 --> C6[散列值 hash2]
C4 & C6 --> D{hash1 == hash2?}
D -->|一致 ✅| E[身份确认
确实是甲发送的]
D -->|不一致 ❌| F[身份伪造或数据被篡改]
end
- 常用的hash算法有:SHA-128、SHA-256、SHA-384、SHA-512等。
- 常用的对称加密算法有:DSA、RSA等。
二. HTTP加密、解密、验证及传输过程¶
1. 一些定义¶
- 证书:服务器公钥+身份信息+CA签名
- 签名:CA的私钥加密后的Hash ---- 浏览器用CA的公钥进行验证
- 握手:交换随机数 ---- 协商对称密钥
- 对称加密:对话密钥加密http数据,速度快
2. 几个问题¶
- 证书的作用:把服务器的公钥和域名绑定在一起并由可靠的CA(证书认证机构)背书。
- 签名是谁生成的?CA用私钥加密生成。
- 浏览器怎么验证?用内置CA公钥进行解密,在和证书加密后的hash数值验证。
- 为什么有了证书还需要密钥协商?证书的公钥制作安全交换的密钥对,后续http传输需要对称加密。
- 自签名证书为什么会被浏览器警报?浏览器系统不承认你的CA机构。
3. 生成自签名证书¶
a. 创建专门存放证书的的目录
[root@3 docs]# cd /etc/ssl
[root@3 ssl]# mkdir self-signed
[root@3 ssl]# cd self-signed
[root@3 self-signed]#
b. 生成私钥
Ⅰ. 安装所需的RPM包
[root@3 self-signed]# mount /dev/sr0 /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.
[root@3 self-signed]# dnf -y install openssl openssl-devel
上次元数据过期检查:0:09:39 前,执行于 2026年06月13日 星期六 15时44分27秒。
软件包 openssl-1:3.2.2-6.el9_5.1.x86_64 已安装。
软件包 openssl-devel-1:3.2.2-6.el9_5.1.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
Ⅱ. 生成私钥genrsa
[root@3 self-signed]# openssl genrsa -out server.key 4096
[root@3 self-signed]# ls
server.key
Ⅱ. 生成证书请求
| 字段 | 含义 | 示例值 |
|---|---|---|
| /C | Country(国家) | CN |
| /ST | State(省份) | BK |
| /L | Locality(城市) | BJ |
| /O | Organization(组织) | 具体公司名称 |
| /CN | Common Name(域名) | 签发组织(同访问地址) |
[root@3 self-signed]# openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=TJ/L=TJ/O=wen/CN=www.wensir.com"
[root@3 self-signed]# ls
server.csr server.key
Ⅲ. 生成自签证书
[root@3 self-signed]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Certificate request self-signature ok
subject=C=CN, ST=TJ, L=TJ, O=wen, CN=www.wensir.com
[root@3 self-signed]# openssl x509 -in server.crt -noout -dates #查看证书有效期
notBefore=Jun 13 08:17:29 2026 GMT #证书申请日期
notAfter=Jun 13 08:17:29 2027 GMT #证书有效期至
- genrsa:私钥
- req-new:申请证书(CSR)
- X509 -req -signkey:自己签发的证书。
- 证书=服务器的公钥+服务器信息+CA的数字签名(防篡改)。
- 签名=CA用自己的“私钥”对“证书内容”做哈希计算。
4. 查看申请证书的内容¶
[root@3 self-signed]# openssl x509 -in server.crt -text --nocert
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
27:e8:e6:2d:47:08:bc:67:d9:76:3b:79:c8:98:e7:4d:13:de:41:08
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=CN, ST=TJ, L=TJ, O=wen, CN=www.wensir.com
Validity
Not Before: Jun 13 08:17:29 2026 GMT
Not After : Jun 13 08:17:29 2027 GMT
Subject: C=CN, ST=TJ, L=TJ, O=wen, CN=www.wensir.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
1D:67:EE:BC:98:94:79:2C:01:F7:A6:EF:48:9C:37:13:27:6F:A3:F7
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
...
- Subject:域名公司国家身份信息
- Public key:服务器的非对称密钥(RSA/ECC)
- Issuer:签发者(CA的名字)
- Signature Algorithm:签名算法(SHA256+RSA等)
- Signature value:CA的数字签名(对上面的所有字段的哈希之后的私钥加密)
- Validity:有效期
- Serial Number:序列号 密钥用途 多域名 SAN等
5. 一些概念¶
- 对称加密:AES/ChaCha20 --用于实际数据
- 非对称加密:RSA/ECDHE -- 用于密钥交换
- 密钥交换算法:椭圆曲线算法ssl_ecdh_ X25519
- 换对称算法:ssl_ciphers CHACHA20
- Single-Domain:只保护一个具体域名(www.wensir.com)
- wildcard:通配符。一张证书保护一个域名和所有子域名(*.wensir.com)
- Multi-Domain /SAN/UCC:一张证书填写多个域名(最多可填写100个).wensir.com .liusir.com *.nisir.com
- 个人/测试:DV
- 企业官网:OV
- 银行/支付/电商:EV
- 子域名多:DV+wildcard
- 多域名同台:DV+Multi-Domain
三. 配置证书¶
1. 编写网站的配置文件¶
[root@3 self-signed]# vim /etc/nginx/conf.d/wensir.conf
server {
listen 443 ssl http2;
#启用ssl并监听443端口,启用http2协议
server_name www.wensir.com;
ssl_certificate /etc/ssl/self-signed/server.crt; #ssl证书路径
ssl_certificate_key /etc/ssl/self-signed/server.key; #ssl私钥路径
ssl_protocols TLSv1.2 TLSv1.3;
#只允许tls版本1.2和1.3,其他版本有漏洞
#老浏览器( IE < 11 )会无法访问,换来的是安全
ssl_ciphers HIGH:!aNULL:!MD5;
#HIGH:高强度,也就是不得低于AES-128/256 chacha20等)
#!aNULL:禁用“匿名密钥交换”(无身份验证无法访问)
#!MD5:禁用已碰撞成功的MD5摘要(签名,密钥都不在使用MD5)
#隐含:禁止3DES RC4 EXPORT 等
ssl_prefer_server_ciphers on;
root /var/www/test; #页面文档的根目录
index index.html; #默认首页
access_log /var/log/nginx/test-ssl.access.log; #成功访问日志的位置
error_log /var/log/nginx/test-ssl.error.log warn; #错误日志的存放位置
}
TLS漏洞版本:v1.0 v.1.1 v1.3全部拒之门外 老浏览器(IE<11)会无法访问,换来的是安全
2. 检查nginx配置文件语法问题,无误后启动服务¶
[root@3 self-signed]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
3. 切换到真机修改hosts¶
C:\Windows\System32\drivers\etc\hosts
...
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
192.168.100.101 www.wensir.com
4.写入测试文件¶
[root@3 self-signed]# echo '<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<h1>恭喜你,访问成功!</h1>
</body>
</html>' > /var/www/test/index.html
5. 访问验证¶


