跳转至

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. 访问验证

不被认可的自签名警告

坚持访问后的访问成功界面

自签名证书详情