Ezekielx
Ezekielx
发布于 2026-06-01 / 4 阅读
0
0

SEED 实验 密码学实验-公钥基础设施(PKI)实验

1 概述

实验任务:https://seedsecuritylabs.org/chinese/labs/Crypto/Crypto_PKI/

2 实验环境

2.1 容器安装及其命令

[05/22/26]seed@VM:~$ mkdir ~/Experiment03
[05/22/26]seed@VM:~$ cd Experiment03
[05/22/26]seed@VM:~/Experiment03$

解压镜像文件:

[05/22/26]seed@VM:~/Experiment03$ unzip Labsetup.zip
Archive:  Labsetup.zip
   creating: Labsetup/
   creating: Labsetup/image_www/
  inflating: Labsetup/image_www/index_red.html
  inflating: Labsetup/image_www/index.html
  inflating: Labsetup/image_www/Dockerfile
   creating: Labsetup/image_www/certs/
  inflating: Labsetup/image_www/certs/bank32.crt
  inflating: Labsetup/image_www/certs/bank32.key
  inflating: Labsetup/image_www/certs/README.txt
  inflating: Labsetup/image_www/certs/modelCA.crt
  inflating: Labsetup/image_www/bank32_apache_ssl.conf
  inflating: Labsetup/docker-compose.yml
   creating: Labsetup/volumes/
  inflating: Labsetup/volumes/README.md
[05/22/26]seed@VM:~/Experiment03$

启动容器:

[05/22/26]seed@VM:~/.../Labsetup$ docker-compose up -d
WARNING: Found orphan containers (user1-10.9.0.6, victim-10.9.0.5, user2-10.9.0.7, seed-attacker) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Building web-server
Step 1/7 : FROM handsonsecurity/seed-server:apache-php
apache-php: Pulling from handsonsecurity/seed-server
da7391352a9b: Already exists
14428a6d4bcd: Already exists
2c2d948710f2: Already exists
d801bb9d0b6c: Pull complete
Digest: sha256:fb3b6a03575af14b6a59ada1d7a272a61bc0f2d975d0776dba98eff0948de275
Status: Downloaded newer image for handsonsecurity/seed-server:apache-php
 ---> 2365d0ed3ad9
Step 2/7 : ARG WWWDIR=/var/www/bank32
 ---> Running in d217d9577b28
Removing intermediate container d217d9577b28
 ---> 15e140177f46
Step 3/7 : COPY ./index.html ./index_red.html $WWWDIR/
 ---> 255744ca0146
Step 4/7 : COPY ./bank32_apache_ssl.conf /etc/apache2/sites-available
 ---> 9f2f91a11ad7
Step 5/7 : COPY ./certs/bank32.crt ./certs/bank32.key  /certs/
 ---> 8f4487a016bc
Step 6/7 : RUN  chmod 400 /certs/bank32.key      && chmod 644 $WWWDIR/index.html      && chmod 644 $WWWDIR/index_red.html      && a2ensite bank32_apache_ssl
 ---> Running in 94055aacbf0c
Enabling site bank32_apache_ssl.
To activate the new configuration, you need to run:
  service apache2 reload
Removing intermediate container 94055aacbf0c
 ---> 65cfefe59a17
Step 7/7 : CMD  tail -f /dev/null
 ---> Running in 6708887f24cb
Removing intermediate container 6708887f24cb
 ---> f566ac0b46ed

Successfully built f566ac0b46ed
Successfully tagged seed-image-www-pki:latest
WARNING: Image for service web-server was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating www-10.9.0.80 ... done
[05/22/26]seed@VM:~/.../Labsetup$

2.2 DNS设置

/etc/hosts 末尾中添加 #PKI Lab 注释下的条目,将域名映射到容器的IP地址(第一条必要,第二条域名自行填写)。

[05/22/26]seed@VM:~/.../Labsetup$ sudo vim /etc/hosts

完整文件:

127.0.0.1       localhost
127.0.1.1       VM

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# For DNS Rebinding Lab
192.168.60.80   www.seedIoT32.com

# For SQL Injection Lab
10.9.0.5        www.SeedLabSQLInjection.com

# For XSS Lab
10.9.0.5        www.xsslabelgg.com
10.9.0.5        www.example32a.com
10.9.0.5        www.example32b.com
10.9.0.5        www.example32c.com
10.9.0.5        www.example60.com
10.9.0.5        www.example70.com

# For CSRF Lab
10.9.0.5        www.csrflabelgg.com
10.9.0.5        www.csrflab-defense.com
10.9.0.105      www.csrflab-attacker.com

# For Shellshock Lab
10.9.0.80       www.seedlab-shellshock.com

# PKI Lab
10.9.0.80 www.bank32.com
10.9.0.80 www.vaultattic.cn

3 实验内容

PKI、证书与 HTTPS 中的几个基础概念

公钥和私钥

公钥和私钥是一对配套使用的密钥,属于非对称加密体系。所谓非对称,是指加密和解密不使用同一个密钥,而是使用一对数学上相关、功能上不同的密钥。

私钥由拥有者自己保存,不能泄露;公钥可以公开给其他人使用。两者通常有两种常见用途:一种是加密,另一种是签名。

在加密场景中,别人可以使用你的公钥加密数据,而只有你手中的私钥能够解密。这样即使数据在传输过程中被截获,攻击者也无法直接得到明文内容。

在签名场景中,拥有者使用自己的私钥对数据进行签名,其他人可以使用对应的公钥验证签名。如果验证通过,就能说明这份数据确实来自持有该私钥的一方,并且内容没有被篡改。

因此可以简单理解为:私钥负责完成只有拥有者才能完成的操作,比如解密和签名;公钥负责让别人进行加密或验证。常见的非对称加密算法包括 RSA、ECC 等,其中 RSA 是比较经典的一种。

数字证书

仅有公钥和私钥还不够,因为还存在一个关键问题:如何确认某个公钥真的属于某个网站或组织?

例如,一个网站声称自己是 example.com,并把一个公钥发送给浏览器。浏览器不能只凭网站自己声明就相信这个公钥,因为攻击者也可以伪造一个公钥并假冒该网站。如果浏览器没有验证身份,用户可能以为自己正在访问真实网站,实际却在和攻击者建立加密连接。此时即使通信内容是加密的,也只是“加密地发送给了错误的人”,安全性就失去了意义。

因此,在建立加密通信之前,必须先确认通信对象的身份。数字证书就是为了解决这个问题而出现的。它可以理解为一份经过签名的身份说明文件,用来证明某个公钥和某个实体之间的绑定关系。证书中通常包含证书持有者的信息、公钥、签发者信息、有效期以及签发者的数字签名。

当浏览器访问 HTTPS 网站时,服务器会把自己的证书发送给浏览器。浏览器会检查证书中的域名是否匹配、证书是否过期、签名是否有效,以及证书是否由可信机构签发。只有这些检查通过后,浏览器才会信任证书中的公钥。

所以,数字证书的核心作用不是“加密数据本身”,而是证明“这个公钥确实属于这个身份”。身份验证是加密通信的前提,否则攻击者可以冒充目标网站,把自己的公钥发给用户,从而让用户在不知情的情况下与攻击者建立所谓的“安全连接”。

CA

CA 的全称是 Certificate Authority(证书颁发机构)。它是 PKI 体系中的可信第三方,负责签发和管理数字证书。

CA 会对证书申请者的身份进行验证。验证通过后,CA 使用自己的私钥对证书进行数字签名。这样,浏览器或操作系统只要信任这个 CA,就可以通过验证 CA 的签名来判断证书是否可信。

浏览器和操作系统中通常预置了一批受信任的根 CA 证书。当一个网站证书能够通过证书链追溯到这些受信任的根 CA 时,浏览器就会认为这个证书是可信的。

也就是说,CA 的核心作用是建立信任关系。它通过自己的签名来证明某个公钥确实属于某个域名、组织或实体。

CSR

CSR 的全称是 Certificate Signing Request(证书签名请求)。它是申请证书时提交给 CA 的请求文件。

当一个网站或服务器想要申请证书时,通常会先在本地生成一对公钥和私钥。私钥必须自己保存,不能泄露;公钥则会和域名、组织等身份信息一起放入 CSR 中。随后,申请者将 CSR 提交给 CA,由 CA 审核并签发证书。

CSR 中通常包含申请者的公钥、身份信息,以及申请者使用私钥生成的签名。这个签名可以证明申请者确实持有与 CSR 中公钥对应的私钥。

需要注意的是,CSR 里包含公钥,但不包含私钥。私钥始终应该保存在申请者自己手中,不能发送给 CA,也不能交给任何第三方。

SSL、TLS 与 HTTPS

SSL 和 TLS 都是用于网络安全通信的协议。SSL 是较早的版本,现在已经基本被淘汰;TLS 是 SSL 的后续版本,也是目前实际使用的安全协议。不过在日常表达中,人们仍然经常把 TLS 证书称为“SSL 证书”。

HTTPS 可以理解为运行在 TLS 之上的 HTTP。普通 HTTP 传输的数据是明文的,而 HTTPS 会先通过 TLS 建立安全连接,然后再在这个加密通道中传输 HTTP 数据。

在 HTTPS 连接建立过程中,服务器会向浏览器发送数字证书。浏览器验证证书可信后,会继续完成 TLS 握手,协商出后续通信使用的会话密钥。之后真正传输网页内容时,主要使用对称加密来保护数据。

这里需要注意一点:HTTPS 并不是全程都用公钥加密传输数据。非对称加密主要用于身份验证和密钥协商,而大量数据传输通常使用效率更高的对称加密。

因此,HTTPS 的安全性主要体现在三个方面:通过证书确认服务器身份,通过 TLS 建立加密通道,通过加密算法保护传输数据。

OpenSSL

OpenSSL 是一个开源的密码学工具包,常用于处理 SSL/TLS、数字证书、密钥和加密相关操作。它既可以作为程序中的加密库使用,也提供了命令行工具,方便用户在终端中生成密钥、创建 CSR、查看证书或测试 TLS 连接。

在学习 PKI 和 HTTPS 时,OpenSSL 经常用于完成一些基础操作。例如,可以用它生成私钥,根据私钥创建 CSR,查看证书的详细内容,或者搭建测试用的 CA 来签发证书。

相比记忆具体命令,更重要的是理解 OpenSSL 的定位:它是一个用来操作密钥、证书、CSR 和 TLS 连接的工具。后续遇到 .key.csr.crt.pem 等文件时,OpenSSL 通常都可以用来生成、解析或验证它们。

小结

PKI 体系可以理解为一套围绕“公钥可信性”建立起来的机制。公钥和私钥提供非对称加密能力,数字证书负责把公钥和身份绑定起来,CA 负责为这种绑定关系背书,CSR 是申请证书时提交给 CA 的请求文件。TLS 使用证书完成身份验证并建立安全连接,而 HTTPS 则是在 TLS 之上运行的 HTTP。

OpenSSL 则是学习和实践这些概念时最常用的工具之一。理解这些概念之间的关系后,再去看证书链、HTTPS 握手或 OpenSSL 命令,就会清晰很多。

3.1 任务 1: 构建一个证书颁发机构(CA)

在实际互联网环境中,许多商业 CA 会被操作系统、浏览器等软件预置信任。网站如果希望自己的 HTTPS 证书被用户浏览器默认信任,通常需要向这些受信任的 CA 申请证书。

在本实验中,我们不依赖商业 CA,而是自己创建一个根 CA,并使用它为其他实体(例如服务器)签发证书。也就是说,我们将在实验环境中自己扮演证书颁发机构的角色。

与通常由第三方 CA 签名的证书不同,根 CA 的证书是自签名的(即由根 CA 使用自己的私钥为自己的证书签名)。根 CA 的证书通常被预加载到大多数操作系统、Web 浏览器和其他依赖 PKI 的软件中。根 CA 的证书是无条件被信任的

配置文件

使用 OpenSSL 来创建证书,修改其默认配置文件。

进入实验目录,复制 OpenSSL 的配置文件。

[05/29/26]seed@VM:~$ cd Experiment03
[05/29/26]seed@VM:~/Experiment03$ cp /usr/lib/ssl/openssl.cnf ./openssl.cnf
[05/29/26]seed@VM:~/Experiment03$

修改配置文件:

[05/29/26]seed@VM:~/Experiment03$ vim openssl.cnf

[ CA_default ] 中的 #unique_subject = no 注释去掉。

LgJ5sb9Z-1.png

这一项的作用是允许创建多个 Subject 相同的证书。实验里可能会重复生成证书,所以要把它打开。

根据配置文件中的设置,OpenSSL 默认会使用 demoCA 目录作为 CA 工作目录,所以要手动创建这些目录和文件。

执行:

[05/29/26]seed@VM:~/Experiment03$ mkdir -p demoCA/certs
[05/29/26]seed@VM:~/Experiment03$ mkdir -p demoCA/crl
[05/29/26]seed@VM:~/Experiment03$ mkdir -p demoCA/newcerts
[05/29/26]seed@VM:~/Experiment03$ touch demoCA/index.txt
[05/29/26]seed@VM:~/Experiment03$ echo 1000 > demoCA/serial
[05/29/26]seed@VM:~/Experiment03$

各文件作用如下:

demoCA/certs       保存证书
demoCA/crl         保存证书吊销列表
demoCA/newcerts    保存新签发的证书
demoCA/index.txt   CA 数据库索引文件
demoCA/serial      下一个证书序列号

index.txt 是空文件即可,serial 里顺便放一个字符串形式的数字。

证书颁发机构(CA)

如前所述,我们需要为我们的 CA 生成一个自签名证书。这意味着该 CA 是完全受信任的,并且其证书将用作根证书。运行以下命令为CA生成自签名证书:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 \
  -keyout ca.key -out ca.crt \
  -subj "/CN=www.modelCA.com/O=Model CA LTD./C=US" \
  -passout pass:dees
[05/29/26]seed@VM:~/Experiment03$ openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 \
>   -keyout ca.key -out ca.crt \
>   -subj "/CN=www.modelCA.com/O=Model CA LTD./C=US" \
>   -passout pass:dees
Generating a RSA private key
..........................................................................................................................................................................................................................................................................++++
.....................................++++
writing new private key to 'ca.key'
-----
[05/29/26]seed@VM:~/Experiment03$ ls
ca.crt  ca.key  demoCA  Labsetup  openssl.cnf
[05/29/26]seed@VM:~/Experiment03$

查看 RSA 私钥的参数:

openssl rsa -in ca.key -text -noout -passin pass:dees
[05/29/26]seed@VM:~/Experiment03$ openssl rsa -in ca.key -text -noout -passin pass:dees
RSA Private-Key: (4096 bit, 2 primes)
modulus:
    00:c0:58:dd:50:c7:30:3a:5d:60:b2:83:4d:e1:23:
    8a:b7:73:fd:76:d0:f7:73:96:8a:fa:67:55:b1:65:
    7c:64:e5:af:f4:7f:e9:88:f2:d0:d2:4b:cd:9e:7f:
    6c:90:88:78:58:b0:14:c2:80:75:ba:22:6c:bd:91:
    c0:04:47:36:39:cc:40:42:2c:7d:3d:4d:84:59:7f:
    7f:00:09:61:1d:fe:fd:78:35:4d:6b:7d:be:4e:27:
    47:2d:6c:16:2e:8e:42:13:3c:63:e9:e9:b3:2a:a2:
    5f:af:6c:d9:2b:1b:61:df:3f:48:49:98:e4:9f:6f:
    22:2c:43:68:f5:b3:df:bf:a4:c3:d5:3f:e6:68:7a:
    6c:ca:3a:f8:5e:14:33:3c:c7:b7:96:43:dd:b5:a5:
    04:a2:30:8c:24:69:ed:af:bc:dd:79:c5:3f:f2:c9:
    55:17:0c:84:3c:f5:5b:90:d6:a5:73:d9:45:53:a6:
    b5:d4:7c:f8:3c:6a:59:ea:7d:13:5f:bf:0f:d6:d5:
    e3:d8:1b:ae:98:a4:10:68:a1:28:28:11:a1:e5:5c:
    c6:77:04:04:f8:6d:0a:a1:91:41:9c:2e:05:48:66:
    69:d0:d4:6c:39:d5:eb:34:60:47:d6:7d:0b:7c:71:
    aa:8b:d6:e8:88:8f:e5:58:94:1d:f6:c6:80:32:76:
    70:6c:60:b3:02:fb:1a:fd:31:36:40:c3:39:ba:65:
    9b:28:e1:57:e3:87:97:59:39:27:76:c7:de:8b:d5:
    1a:08:8c:80:6e:ea:c1:ad:0d:34:f6:1b:68:6c:98:
    bb:03:b2:24:1f:b8:0c:85:a6:80:24:2b:2b:e7:db:
    fc:d7:dc:b9:a1:85:82:ea:4c:6e:b7:38:83:b4:fc:
    d9:29:5a:52:ec:44:72:3b:ef:40:1d:60:5b:86:06:
    95:c1:57:47:d7:84:75:0e:ca:96:b4:0a:54:2d:e6:
    06:ae:c9:d5:72:a2:ae:92:b3:e1:11:96:70:e9:6a:
    85:80:c4:24:9c:56:4c:75:b7:44:d7:4e:cc:05:0b:
    b4:1f:72:fd:12:fb:f8:f6:f4:b5:59:86:eb:e3:32:
    74:60:a0:10:80:c2:62:ea:8d:e1:38:bf:23:81:50:
    9b:17:48:fe:5f:b6:3c:61:cd:93:3d:32:20:7d:c5:
    30:96:50:e0:77:42:07:ba:4d:bb:22:b9:3a:f6:06:
    dd:fb:bb:ab:81:ec:97:8a:9c:ba:9f:2f:a1:42:c8:
    85:09:ad:a5:e0:50:09:a3:54:88:a3:ac:0c:63:c4:
    09:6e:66:ff:33:cd:a9:cc:e1:e8:69:42:d8:cc:28:
    66:4e:6f:00:94:c8:fa:11:3e:62:a8:55:1a:89:ed:
    1f:4c:17
publicExponent: 65537 (0x10001)
privateExponent:
    43:d2:d1:ef:3a:dd:69:a7:25:82:ac:c4:18:60:14:
    f8:cd:40:91:d5:eb:7b:69:99:05:e4:cc:15:aa:68:
    6b:97:86:2c:db:b1:b8:65:8e:76:a8:de:0f:46:75:
    3c:9d:b2:79:eb:54:d6:a4:bf:5e:6b:e7:16:0d:3f:
    bd:02:73:3f:7c:23:28:72:51:92:fd:33:6e:ef:83:
    13:bb:3a:f0:7d:ca:58:c9:ca:cb:dd:61:ee:62:f1:
    39:36:04:b8:53:d7:3e:bb:2b:ab:fe:88:fb:be:97:
    a8:de:e3:d0:cc:6d:fd:6f:6e:08:ed:8d:a8:1e:62:
    d9:62:c7:ae:e3:c7:40:e7:53:5a:6d:96:cc:3e:67:
    00:04:3d:31:c7:43:ad:e9:ea:75:64:e6:d7:b7:21:
    64:23:64:37:2e:d6:ee:01:d5:c2:ab:67:fa:2f:3d:
    fe:cb:9e:11:74:9e:dd:fa:a2:0a:b0:91:3e:86:e9:
    54:cc:e0:27:45:85:01:27:2b:5e:b6:9b:5a:30:bf:
    8f:a3:6b:34:4d:9d:af:97:2b:f6:bd:08:ee:3c:81:
    8a:d3:f3:00:ba:4a:66:60:36:d7:60:6e:e2:71:a2:
    5c:4d:9a:ff:e5:cb:73:03:84:31:40:94:7d:44:03:
    54:1d:ea:8e:c4:d6:a5:1e:4d:56:87:f6:0a:55:33:
    1c:97:94:ee:d0:53:b8:a7:f0:d4:88:c7:31:7b:31:
    db:b2:ad:e2:9a:2e:25:52:7f:30:2b:e4:1b:cb:f4:
    6f:94:25:29:62:a8:f0:df:54:56:e6:65:92:13:76:
    a9:f7:f5:2b:a6:35:00:eb:86:e3:ee:e4:78:b5:b3:
    c8:00:e7:8b:f7:03:28:68:97:31:f5:09:57:8f:0a:
    bb:6b:4a:f6:97:1c:03:af:85:11:1c:91:43:df:3b:
    14:87:a2:84:cd:85:6a:e4:a1:35:fe:ad:6f:5d:c8:
    a5:44:55:55:e6:77:be:fa:7b:ea:13:88:f0:71:62:
    41:a3:c2:90:b4:bc:a3:9c:11:ba:d0:42:43:db:2e:
    62:c7:3b:d9:34:c8:63:67:a2:a6:78:c4:96:a8:82:
    25:5b:41:9e:fd:90:a7:91:cb:bd:21:b6:77:9d:71:
    e0:f9:64:9b:c1:0d:b7:4f:07:4e:83:bf:7a:0b:b1:
    e6:f0:64:67:82:e5:df:52:4c:be:19:71:92:b7:d1:
    38:08:7d:cf:a4:e1:74:bf:6e:93:dc:48:5b:19:7a:
    5b:a8:20:b9:b2:cc:28:13:ef:d6:57:bc:7d:8a:a2:
    7f:c5:9f:88:cd:79:1b:3e:16:fd:88:17:ea:70:ab:
    9f:37:b3:3b:36:b2:1d:54:47:69:ed:28:36:0c:e0:
    54:61
prime1:
    00:e1:8e:97:b8:be:94:6d:d7:c7:09:b4:a6:98:14:
    37:fe:d6:09:ee:88:13:de:65:22:02:4a:fa:a5:fe:
    aa:eb:e2:c8:5c:62:07:03:a9:85:64:97:54:aa:3a:
    df:29:dd:20:fa:70:f0:71:c3:bf:dd:bf:52:41:3c:
    0f:88:d4:0c:ad:24:8a:87:a6:64:7d:7e:15:04:70:
    f0:5b:76:9b:22:9a:36:fe:b8:50:ca:a9:e1:f6:0d:
    cd:0f:81:ad:b2:d1:92:5d:6c:8f:e3:67:d0:6a:f8:
    e7:24:8e:b6:ce:c4:fe:fb:72:19:d3:9f:54:30:69:
    24:7f:4e:ca:96:0b:1c:7a:97:05:32:bd:27:c8:af:
    9a:8c:f7:6a:2b:e6:49:29:4c:f2:af:08:1b:a0:d1:
    00:0f:52:f0:d9:92:e0:66:35:b4:51:db:70:13:28:
    bb:10:57:c7:16:5a:09:ec:36:a2:cf:05:1d:fb:c5:
    fd:1e:f8:e7:e5:44:ce:f1:4d:c6:c0:8c:35:87:0d:
    e9:8c:80:35:b8:57:bb:4e:c9:69:23:ed:10:8e:5d:
    cd:6f:80:50:f7:a3:0b:33:f1:d5:6f:2d:6a:d3:bf:
    62:c1:37:65:29:85:95:f7:09:9e:ff:04:17:b8:63:
    1a:79:94:92:cd:96:53:1c:fc:66:ff:ee:51:80:e5:
    69:67
prime2:
    00:da:4e:cf:52:c5:c5:8b:6b:8a:cc:d4:e9:c4:d3:
    c1:ac:fe:8d:1a:a1:45:c4:b3:ec:23:ca:8a:0f:69:
    0c:a4:29:e4:32:1c:eb:97:b7:70:76:56:85:9f:fe:
    7e:2b:08:65:e4:ea:85:d5:c4:51:89:f0:3d:2d:b2:
    48:e6:d6:ea:6a:81:e5:78:97:c6:09:c8:63:fa:a4:
    42:8b:61:46:8d:4d:de:5f:11:9f:b3:74:c6:1a:00:
    d4:06:4a:b7:92:5b:e8:2b:7e:53:9c:74:97:0c:df:
    5f:b3:9a:bf:05:39:66:52:0d:68:c8:c1:9b:d9:17:
    f3:7e:5c:55:63:02:2a:d2:de:af:d2:d2:2a:c2:11:
    5b:e1:92:aa:63:d2:e9:86:ca:5c:db:82:f6:fb:3c:
    38:91:d0:b6:91:c1:4d:f5:40:3a:71:84:89:c4:d8:
    cb:13:3e:c5:ab:d2:2a:5d:29:73:42:5f:29:8e:f2:
    98:5f:35:a0:95:ce:fb:16:fd:6f:39:09:b8:df:92:
    36:a7:f1:47:f1:48:33:2c:5c:85:13:c6:fd:c0:b9:
    13:29:0f:a9:29:85:42:64:e5:85:b7:1b:55:3f:ea:
    bf:a3:f8:ad:a6:a8:3b:c1:9f:e1:f8:87:79:81:ec:
    c2:a3:8f:e3:df:7b:0c:e6:bb:c9:21:7b:48:04:ff:
    69:d1
exponent1:
    65:ce:e3:e2:aa:7a:fa:9d:73:a4:88:da:cd:38:0b:
    12:46:70:13:2f:6e:b0:6a:3b:90:87:61:5d:3d:76:
    ce:a3:fd:45:dd:a5:46:dc:e4:6d:c3:f4:9e:25:96:
    87:21:dd:79:cd:32:6a:57:2d:aa:1c:6a:37:31:b1:
    dd:53:c1:29:01:9e:59:9e:1c:2b:9c:96:45:fb:e8:
    31:90:76:73:86:e2:1d:d4:f9:fa:8f:f5:83:07:35:
    b0:b3:1a:c0:e4:e1:48:b3:f0:ba:77:28:56:b0:64:
    3c:57:02:62:8f:fe:7b:66:44:0c:06:15:8d:08:58:
    45:f2:3d:74:be:2d:2b:94:30:ef:76:fb:97:14:d4:
    10:9e:b8:58:7a:48:39:91:16:d5:34:36:ac:3e:c9:
    e5:20:cd:bf:97:11:1c:71:4f:23:c7:85:6d:d0:6b:
    a6:f3:c7:d3:e9:ee:22:a5:82:95:28:bd:20:e0:7b:
    e0:d7:fe:6b:b8:c4:23:9c:b4:82:42:87:02:9f:9f:
    f4:20:06:9f:5f:52:17:3c:c7:ed:44:5a:bd:b7:cf:
    3b:6d:d2:9e:04:04:d1:7c:6d:97:12:0b:ee:e9:aa:
    dc:85:71:6e:ed:72:04:20:5e:98:c2:b3:26:31:ed:
    48:45:6c:81:c9:41:58:8b:00:be:b2:46:2d:84:df:
    2f
exponent2:
    49:2b:8d:15:c3:2f:f9:10:ec:8e:c6:f6:2b:80:86:
    33:c3:85:eb:dd:0e:13:65:f2:c9:f4:42:dd:f3:69:
    c7:44:3b:36:08:b7:76:3c:87:b7:42:3c:bb:69:83:
    44:4d:26:49:d9:c9:4d:e2:e5:29:84:9a:1c:cc:da:
    de:74:3e:51:c0:83:f7:2d:77:b5:23:b3:4e:f8:eb:
    4c:e8:27:cb:88:c3:f5:bd:64:77:b3:b6:0a:55:28:
    bb:8b:23:88:2c:c1:de:82:12:e8:27:b3:d1:1e:b5:
    66:ef:81:02:f1:40:38:54:42:40:b7:93:d2:e9:d2:
    35:12:21:94:73:cf:82:aa:1c:e8:5e:84:f2:52:fb:
    26:da:0f:be:31:9d:10:0e:97:9d:03:82:60:a6:c8:
    97:27:0b:6a:43:0e:2c:1b:80:fb:37:5f:2d:d9:34:
    07:99:4c:8b:d0:7f:5e:86:5c:19:6c:e7:f2:ff:a0:
    ce:98:9c:e0:59:65:93:49:12:94:5d:8b:d7:73:9c:
    5a:21:e6:e9:1a:37:fc:b0:6d:f2:39:0a:28:24:60:
    25:ad:18:17:d0:90:76:5c:ef:ba:75:b0:d7:21:89:
    66:1e:1d:a5:f4:51:43:0e:a1:a0:b9:57:a2:92:86:
    92:67:d2:0a:bf:a5:8d:58:77:8b:7f:54:9e:48:35:
    61
coefficient:
    1f:10:3d:1e:f8:e6:c1:a7:9a:d7:6b:4f:ec:51:44:
    05:ac:ce:4b:f8:51:08:0a:c7:fd:16:16:57:89:d7:
    e6:7e:97:9a:d0:81:dc:aa:02:35:6b:81:11:1f:ed:
    7c:b9:3a:bc:e3:26:b0:94:ae:27:ce:64:2f:9e:50:
    04:88:75:a2:3c:69:8b:e6:33:bc:c7:2c:1f:b6:bf:
    5d:81:7a:e6:e2:2f:a1:6d:14:1b:45:b4:f9:72:b7:
    78:ff:9a:ef:5d:4a:73:5f:85:a1:1e:d2:6d:40:62:
    fd:47:23:80:0a:db:11:17:5d:c5:d4:18:5a:21:bf:
    37:80:ec:21:b7:be:9d:de:89:d4:d9:15:b0:56:66:
    a2:26:c4:7f:32:63:42:48:7c:73:2e:92:49:38:3a:
    17:42:e6:a8:1e:17:5d:ef:f5:92:ab:cd:c4:83:78:
    b3:f3:f8:22:49:fd:29:aa:6b:42:08:e3:1a:f9:54:
    22:11:ae:88:3d:af:3c:40:9d:d6:d2:6f:cb:71:1b:
    6f:7d:df:2f:cd:50:c3:89:e6:41:6d:87:7f:bf:e4:
    c4:22:d5:65:b0:07:63:b4:11:4c:84:65:78:32:a4:
    a3:88:62:d5:ad:81:97:5b:b3:d2:f6:7f:3c:7c:8a:
    36:f4:96:36:54:b4:5a:27:71:66:92:64:97:e8:01:
    ee
[05/29/26]seed@VM:~/Experiment03$
证书中的哪一部分说明了这是一个CA的证书?

使用命令查看 CA 证书:

openssl x509 -in ca.crt -text -noout
[05/29/26]seed@VM:~/Experiment03$ openssl x509 -in ca.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            06:2f:41:8d:15:11:ab:4d:94:a4:e1:e3:4b:fa:51:eb:6a:9e:8e:35
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = www.modelCA.com, O = Model CA LTD., C = US
        Validity
            Not Before: May 29 09:03:15 2026 GMT
            Not After : May 26 09:03:15 2036 GMT
        Subject: CN = www.modelCA.com, O = Model CA LTD., C = US
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:c0:58:dd:50:c7:30:3a:5d:60:b2:83:4d:e1:23:
                    8a:b7:73:fd:76:d0:f7:73:96:8a:fa:67:55:b1:65:
                    7c:64:e5:af:f4:7f:e9:88:f2:d0:d2:4b:cd:9e:7f:
                    6c:90:88:78:58:b0:14:c2:80:75:ba:22:6c:bd:91:
                    c0:04:47:36:39:cc:40:42:2c:7d:3d:4d:84:59:7f:
                    7f:00:09:61:1d:fe:fd:78:35:4d:6b:7d:be:4e:27:
                    47:2d:6c:16:2e:8e:42:13:3c:63:e9:e9:b3:2a:a2:
                    5f:af:6c:d9:2b:1b:61:df:3f:48:49:98:e4:9f:6f:
                    22:2c:43:68:f5:b3:df:bf:a4:c3:d5:3f:e6:68:7a:
                    6c:ca:3a:f8:5e:14:33:3c:c7:b7:96:43:dd:b5:a5:
                    04:a2:30:8c:24:69:ed:af:bc:dd:79:c5:3f:f2:c9:
                    55:17:0c:84:3c:f5:5b:90:d6:a5:73:d9:45:53:a6:
                    b5:d4:7c:f8:3c:6a:59:ea:7d:13:5f:bf:0f:d6:d5:
                    e3:d8:1b:ae:98:a4:10:68:a1:28:28:11:a1:e5:5c:
                    c6:77:04:04:f8:6d:0a:a1:91:41:9c:2e:05:48:66:
                    69:d0:d4:6c:39:d5:eb:34:60:47:d6:7d:0b:7c:71:
                    aa:8b:d6:e8:88:8f:e5:58:94:1d:f6:c6:80:32:76:
                    70:6c:60:b3:02:fb:1a:fd:31:36:40:c3:39:ba:65:
                    9b:28:e1:57:e3:87:97:59:39:27:76:c7:de:8b:d5:
                    1a:08:8c:80:6e:ea:c1:ad:0d:34:f6:1b:68:6c:98:
                    bb:03:b2:24:1f:b8:0c:85:a6:80:24:2b:2b:e7:db:
                    fc:d7:dc:b9:a1:85:82:ea:4c:6e:b7:38:83:b4:fc:
                    d9:29:5a:52:ec:44:72:3b:ef:40:1d:60:5b:86:06:
                    95:c1:57:47:d7:84:75:0e:ca:96:b4:0a:54:2d:e6:
                    06:ae:c9:d5:72:a2:ae:92:b3:e1:11:96:70:e9:6a:
                    85:80:c4:24:9c:56:4c:75:b7:44:d7:4e:cc:05:0b:
                    b4:1f:72:fd:12:fb:f8:f6:f4:b5:59:86:eb:e3:32:
                    74:60:a0:10:80:c2:62:ea:8d:e1:38:bf:23:81:50:
                    9b:17:48:fe:5f:b6:3c:61:cd:93:3d:32:20:7d:c5:
                    30:96:50:e0:77:42:07:ba:4d:bb:22:b9:3a:f6:06:
                    dd:fb:bb:ab:81:ec:97:8a:9c:ba:9f:2f:a1:42:c8:
                    85:09:ad:a5:e0:50:09:a3:54:88:a3:ac:0c:63:c4:
                    09:6e:66:ff:33:cd:a9:cc:e1:e8:69:42:d8:cc:28:
                    66:4e:6f:00:94:c8:fa:11:3e:62:a8:55:1a:89:ed:
                    1f:4c:17
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                99:CA:94:67:5D:24:F0:FA:C0:0A:70:32:25:A2:2C:EC:B1:4F:26:A0
            X509v3 Authority Key Identifier:
                keyid:99:CA:94:67:5D:24:F0:FA:C0:0A:70:32:25:A2:2C:EC:B1:4F:26:A0

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         6e:20:57:dc:40:10:f6:d8:85:a8:73:df:ee:b0:d1:b7:1e:58:
         fa:84:94:9f:b8:0e:71:63:5d:37:a3:4b:5d:e5:7c:4b:9a:c6:
         25:0d:72:77:f2:09:c8:c5:f4:45:cf:37:2a:3f:7d:b1:7c:7a:
         cf:c5:5e:3f:56:44:ef:e3:ff:6f:10:23:55:87:25:21:68:31:
         1d:8e:f3:04:e9:23:04:85:4e:a9:2a:03:d9:3c:d6:9e:68:4e:
         7c:13:b0:66:7c:63:c4:c9:2c:1b:d3:02:b8:cc:fb:07:b4:65:
         8f:68:54:fb:2b:28:2f:c5:ce:52:64:ce:79:7e:ed:24:08:b8:
         82:11:70:33:7e:78:73:4e:38:53:4c:a6:ef:22:65:f6:ee:75:
         da:9f:ee:31:c6:7f:f3:9d:17:a5:14:a9:e2:76:c3:1c:19:21:
         5d:34:76:13:6b:ec:01:60:a6:72:40:3e:7d:15:a7:66:f0:f3:
         83:25:bc:2a:59:65:77:17:d9:ab:70:28:9d:e0:bc:69:f0:25:
         c1:16:63:a6:db:1d:37:d4:88:80:30:e6:2f:a0:67:18:ad:a4:
         ed:5f:f0:20:8d:cc:c5:41:67:59:f7:12:88:17:5d:80:57:70:
         55:dd:28:99:34:53:6d:b9:49:93:de:12:97:c6:41:7f:b2:51:
         ae:4e:16:af:3c:fd:11:52:15:7a:3c:eb:cc:40:a3:a9:c9:8b:
         99:11:93:f1:0a:fe:f5:35:4b:1b:78:d4:b5:5c:6f:75:f6:e1:
         cf:de:af:16:d1:f9:e5:84:a3:ca:a7:56:8a:2d:0a:f0:80:a7:
         46:0b:72:2c:49:73:28:90:8d:f4:28:8f:22:e2:3c:15:05:79:
         63:b5:23:b6:99:cc:a0:5c:68:c3:d7:5c:2d:82:57:69:1d:b8:
         94:5c:f6:99:ed:9b:b8:68:ae:b9:09:39:60:4c:46:91:69:1c:
         84:1b:b0:33:80:16:69:07:00:b8:23:af:80:e3:0e:e0:22:29:
         11:9a:9f:52:55:2b:40:d2:89:e0:b1:d4:e8:5e:31:1b:c1:8e:
         51:f4:8e:ef:54:bf:39:14:76:35:8f:49:f8:ab:52:8b:56:4e:
         3a:9d:92:96:5c:ee:a1:54:ee:08:e4:b1:d8:fb:f6:fd:7c:75:
         d0:76:dc:cc:14:39:93:97:1f:49:d9:bc:a6:6b:e1:0a:38:41:
         65:b4:66:e4:7c:6c:ab:eb:96:17:f4:8f:76:85:35:0d:7f:62:
         be:50:43:cb:42:d3:2e:de:55:0d:cb:14:67:58:46:4e:1a:ed:
         fb:04:27:95:ee:98:db:5b:43:63:d7:f0:39:80:fa:05:2b:73:
         a3:3e:47:18:fc:36:ab:3b
[05/29/26]seed@VM:~/Experiment03$

在输出中的 X509v3 Basic Constraints 扩展字段中,可以看到 CA:TRUE。该字段说明此证书是 CA 证书,可以用于证书颁发机构。

证书中的哪一部分说明了这是一个自签名证书?

还是刚才的证书输出。

在输出中的 IssuerSubject 字段相同,说明证书的签发者和证书主体是同一个实体。因此,该证书是自签名证书。

在 RSA 算法中,我们有公开指数 e、私有指数 d、模数 n 以及两个秘密的质数 p 和 q 使得 n=pq。请从你的证书和密钥文件中找出这些元素的值。

使用命令查看 CA 私钥:

openssl rsa -in ca.key -text -noout -passin pass:dees
[05/29/26]seed@VM:~/Experiment03$ openssl rsa -in ca.key -text -noout -passin pass:dees
RSA Private-Key: (4096 bit, 2 primes)
modulus:
    00:c0:58:dd:50:c7:30:3a:5d:60:b2:83:4d:e1:23:
    8a:b7:73:fd:76:d0:f7:73:96:8a:fa:67:55:b1:65:
    7c:64:e5:af:f4:7f:e9:88:f2:d0:d2:4b:cd:9e:7f:
    6c:90:88:78:58:b0:14:c2:80:75:ba:22:6c:bd:91:
    c0:04:47:36:39:cc:40:42:2c:7d:3d:4d:84:59:7f:
    7f:00:09:61:1d:fe:fd:78:35:4d:6b:7d:be:4e:27:
    47:2d:6c:16:2e:8e:42:13:3c:63:e9:e9:b3:2a:a2:
    5f:af:6c:d9:2b:1b:61:df:3f:48:49:98:e4:9f:6f:
    22:2c:43:68:f5:b3:df:bf:a4:c3:d5:3f:e6:68:7a:
    6c:ca:3a:f8:5e:14:33:3c:c7:b7:96:43:dd:b5:a5:
    04:a2:30:8c:24:69:ed:af:bc:dd:79:c5:3f:f2:c9:
    55:17:0c:84:3c:f5:5b:90:d6:a5:73:d9:45:53:a6:
    b5:d4:7c:f8:3c:6a:59:ea:7d:13:5f:bf:0f:d6:d5:
    e3:d8:1b:ae:98:a4:10:68:a1:28:28:11:a1:e5:5c:
    c6:77:04:04:f8:6d:0a:a1:91:41:9c:2e:05:48:66:
    69:d0:d4:6c:39:d5:eb:34:60:47:d6:7d:0b:7c:71:
    aa:8b:d6:e8:88:8f:e5:58:94:1d:f6:c6:80:32:76:
    70:6c:60:b3:02:fb:1a:fd:31:36:40:c3:39:ba:65:
    9b:28:e1:57:e3:87:97:59:39:27:76:c7:de:8b:d5:
    1a:08:8c:80:6e:ea:c1:ad:0d:34:f6:1b:68:6c:98:
    bb:03:b2:24:1f:b8:0c:85:a6:80:24:2b:2b:e7:db:
    fc:d7:dc:b9:a1:85:82:ea:4c:6e:b7:38:83:b4:fc:
    d9:29:5a:52:ec:44:72:3b:ef:40:1d:60:5b:86:06:
    95:c1:57:47:d7:84:75:0e:ca:96:b4:0a:54:2d:e6:
    06:ae:c9:d5:72:a2:ae:92:b3:e1:11:96:70:e9:6a:
    85:80:c4:24:9c:56:4c:75:b7:44:d7:4e:cc:05:0b:
    b4:1f:72:fd:12:fb:f8:f6:f4:b5:59:86:eb:e3:32:
    74:60:a0:10:80:c2:62:ea:8d:e1:38:bf:23:81:50:
    9b:17:48:fe:5f:b6:3c:61:cd:93:3d:32:20:7d:c5:
    30:96:50:e0:77:42:07:ba:4d:bb:22:b9:3a:f6:06:
    dd:fb:bb:ab:81:ec:97:8a:9c:ba:9f:2f:a1:42:c8:
    85:09:ad:a5:e0:50:09:a3:54:88:a3:ac:0c:63:c4:
    09:6e:66:ff:33:cd:a9:cc:e1:e8:69:42:d8:cc:28:
    66:4e:6f:00:94:c8:fa:11:3e:62:a8:55:1a:89:ed:
    1f:4c:17
publicExponent: 65537 (0x10001)
privateExponent:
    43:d2:d1:ef:3a:dd:69:a7:25:82:ac:c4:18:60:14:
    f8:cd:40:91:d5:eb:7b:69:99:05:e4:cc:15:aa:68:
    6b:97:86:2c:db:b1:b8:65:8e:76:a8:de:0f:46:75:
    3c:9d:b2:79:eb:54:d6:a4:bf:5e:6b:e7:16:0d:3f:
    bd:02:73:3f:7c:23:28:72:51:92:fd:33:6e:ef:83:
    13:bb:3a:f0:7d:ca:58:c9:ca:cb:dd:61:ee:62:f1:
    39:36:04:b8:53:d7:3e:bb:2b:ab:fe:88:fb:be:97:
    a8:de:e3:d0:cc:6d:fd:6f:6e:08:ed:8d:a8:1e:62:
    d9:62:c7:ae:e3:c7:40:e7:53:5a:6d:96:cc:3e:67:
    00:04:3d:31:c7:43:ad:e9:ea:75:64:e6:d7:b7:21:
    64:23:64:37:2e:d6:ee:01:d5:c2:ab:67:fa:2f:3d:
    fe:cb:9e:11:74:9e:dd:fa:a2:0a:b0:91:3e:86:e9:
    54:cc:e0:27:45:85:01:27:2b:5e:b6:9b:5a:30:bf:
    8f:a3:6b:34:4d:9d:af:97:2b:f6:bd:08:ee:3c:81:
    8a:d3:f3:00:ba:4a:66:60:36:d7:60:6e:e2:71:a2:
    5c:4d:9a:ff:e5:cb:73:03:84:31:40:94:7d:44:03:
    54:1d:ea:8e:c4:d6:a5:1e:4d:56:87:f6:0a:55:33:
    1c:97:94:ee:d0:53:b8:a7:f0:d4:88:c7:31:7b:31:
    db:b2:ad:e2:9a:2e:25:52:7f:30:2b:e4:1b:cb:f4:
    6f:94:25:29:62:a8:f0:df:54:56:e6:65:92:13:76:
    a9:f7:f5:2b:a6:35:00:eb:86:e3:ee:e4:78:b5:b3:
    c8:00:e7:8b:f7:03:28:68:97:31:f5:09:57:8f:0a:
    bb:6b:4a:f6:97:1c:03:af:85:11:1c:91:43:df:3b:
    14:87:a2:84:cd:85:6a:e4:a1:35:fe:ad:6f:5d:c8:
    a5:44:55:55:e6:77:be:fa:7b:ea:13:88:f0:71:62:
    41:a3:c2:90:b4:bc:a3:9c:11:ba:d0:42:43:db:2e:
    62:c7:3b:d9:34:c8:63:67:a2:a6:78:c4:96:a8:82:
    25:5b:41:9e:fd:90:a7:91:cb:bd:21:b6:77:9d:71:
    e0:f9:64:9b:c1:0d:b7:4f:07:4e:83:bf:7a:0b:b1:
    e6:f0:64:67:82:e5:df:52:4c:be:19:71:92:b7:d1:
    38:08:7d:cf:a4:e1:74:bf:6e:93:dc:48:5b:19:7a:
    5b:a8:20:b9:b2:cc:28:13:ef:d6:57:bc:7d:8a:a2:
    7f:c5:9f:88:cd:79:1b:3e:16:fd:88:17:ea:70:ab:
    9f:37:b3:3b:36:b2:1d:54:47:69:ed:28:36:0c:e0:
    54:61
prime1:
    00:e1:8e:97:b8:be:94:6d:d7:c7:09:b4:a6:98:14:
    37:fe:d6:09:ee:88:13:de:65:22:02:4a:fa:a5:fe:
    aa:eb:e2:c8:5c:62:07:03:a9:85:64:97:54:aa:3a:
    df:29:dd:20:fa:70:f0:71:c3:bf:dd:bf:52:41:3c:
    0f:88:d4:0c:ad:24:8a:87:a6:64:7d:7e:15:04:70:
    f0:5b:76:9b:22:9a:36:fe:b8:50:ca:a9:e1:f6:0d:
    cd:0f:81:ad:b2:d1:92:5d:6c:8f:e3:67:d0:6a:f8:
    e7:24:8e:b6:ce:c4:fe:fb:72:19:d3:9f:54:30:69:
    24:7f:4e:ca:96:0b:1c:7a:97:05:32:bd:27:c8:af:
    9a:8c:f7:6a:2b:e6:49:29:4c:f2:af:08:1b:a0:d1:
    00:0f:52:f0:d9:92:e0:66:35:b4:51:db:70:13:28:
    bb:10:57:c7:16:5a:09:ec:36:a2:cf:05:1d:fb:c5:
    fd:1e:f8:e7:e5:44:ce:f1:4d:c6:c0:8c:35:87:0d:
    e9:8c:80:35:b8:57:bb:4e:c9:69:23:ed:10:8e:5d:
    cd:6f:80:50:f7:a3:0b:33:f1:d5:6f:2d:6a:d3:bf:
    62:c1:37:65:29:85:95:f7:09:9e:ff:04:17:b8:63:
    1a:79:94:92:cd:96:53:1c:fc:66:ff:ee:51:80:e5:
    69:67
prime2:
    00:da:4e:cf:52:c5:c5:8b:6b:8a:cc:d4:e9:c4:d3:
    c1:ac:fe:8d:1a:a1:45:c4:b3:ec:23:ca:8a:0f:69:
    0c:a4:29:e4:32:1c:eb:97:b7:70:76:56:85:9f:fe:
    7e:2b:08:65:e4:ea:85:d5:c4:51:89:f0:3d:2d:b2:
    48:e6:d6:ea:6a:81:e5:78:97:c6:09:c8:63:fa:a4:
    42:8b:61:46:8d:4d:de:5f:11:9f:b3:74:c6:1a:00:
    d4:06:4a:b7:92:5b:e8:2b:7e:53:9c:74:97:0c:df:
    5f:b3:9a:bf:05:39:66:52:0d:68:c8:c1:9b:d9:17:
    f3:7e:5c:55:63:02:2a:d2:de:af:d2:d2:2a:c2:11:
    5b:e1:92:aa:63:d2:e9:86:ca:5c:db:82:f6:fb:3c:
    38:91:d0:b6:91:c1:4d:f5:40:3a:71:84:89:c4:d8:
    cb:13:3e:c5:ab:d2:2a:5d:29:73:42:5f:29:8e:f2:
    98:5f:35:a0:95:ce:fb:16:fd:6f:39:09:b8:df:92:
    36:a7:f1:47:f1:48:33:2c:5c:85:13:c6:fd:c0:b9:
    13:29:0f:a9:29:85:42:64:e5:85:b7:1b:55:3f:ea:
    bf:a3:f8:ad:a6:a8:3b:c1:9f:e1:f8:87:79:81:ec:
    c2:a3:8f:e3:df:7b:0c:e6:bb:c9:21:7b:48:04:ff:
    69:d1
exponent1:
    65:ce:e3:e2:aa:7a:fa:9d:73:a4:88:da:cd:38:0b:
    12:46:70:13:2f:6e:b0:6a:3b:90:87:61:5d:3d:76:
    ce:a3:fd:45:dd:a5:46:dc:e4:6d:c3:f4:9e:25:96:
    87:21:dd:79:cd:32:6a:57:2d:aa:1c:6a:37:31:b1:
    dd:53:c1:29:01:9e:59:9e:1c:2b:9c:96:45:fb:e8:
    31:90:76:73:86:e2:1d:d4:f9:fa:8f:f5:83:07:35:
    b0:b3:1a:c0:e4:e1:48:b3:f0:ba:77:28:56:b0:64:
    3c:57:02:62:8f:fe:7b:66:44:0c:06:15:8d:08:58:
    45:f2:3d:74:be:2d:2b:94:30:ef:76:fb:97:14:d4:
    10:9e:b8:58:7a:48:39:91:16:d5:34:36:ac:3e:c9:
    e5:20:cd:bf:97:11:1c:71:4f:23:c7:85:6d:d0:6b:
    a6:f3:c7:d3:e9:ee:22:a5:82:95:28:bd:20:e0:7b:
    e0:d7:fe:6b:b8:c4:23:9c:b4:82:42:87:02:9f:9f:
    f4:20:06:9f:5f:52:17:3c:c7:ed:44:5a:bd:b7:cf:
    3b:6d:d2:9e:04:04:d1:7c:6d:97:12:0b:ee:e9:aa:
    dc:85:71:6e:ed:72:04:20:5e:98:c2:b3:26:31:ed:
    48:45:6c:81:c9:41:58:8b:00:be:b2:46:2d:84:df:
    2f
exponent2:
    49:2b:8d:15:c3:2f:f9:10:ec:8e:c6:f6:2b:80:86:
    33:c3:85:eb:dd:0e:13:65:f2:c9:f4:42:dd:f3:69:
    c7:44:3b:36:08:b7:76:3c:87:b7:42:3c:bb:69:83:
    44:4d:26:49:d9:c9:4d:e2:e5:29:84:9a:1c:cc:da:
    de:74:3e:51:c0:83:f7:2d:77:b5:23:b3:4e:f8:eb:
    4c:e8:27:cb:88:c3:f5:bd:64:77:b3:b6:0a:55:28:
    bb:8b:23:88:2c:c1:de:82:12:e8:27:b3:d1:1e:b5:
    66:ef:81:02:f1:40:38:54:42:40:b7:93:d2:e9:d2:
    35:12:21:94:73:cf:82:aa:1c:e8:5e:84:f2:52:fb:
    26:da:0f:be:31:9d:10:0e:97:9d:03:82:60:a6:c8:
    97:27:0b:6a:43:0e:2c:1b:80:fb:37:5f:2d:d9:34:
    07:99:4c:8b:d0:7f:5e:86:5c:19:6c:e7:f2:ff:a0:
    ce:98:9c:e0:59:65:93:49:12:94:5d:8b:d7:73:9c:
    5a:21:e6:e9:1a:37:fc:b0:6d:f2:39:0a:28:24:60:
    25:ad:18:17:d0:90:76:5c:ef:ba:75:b0:d7:21:89:
    66:1e:1d:a5:f4:51:43:0e:a1:a0:b9:57:a2:92:86:
    92:67:d2:0a:bf:a5:8d:58:77:8b:7f:54:9e:48:35:
    61
coefficient:
    1f:10:3d:1e:f8:e6:c1:a7:9a:d7:6b:4f:ec:51:44:
    05:ac:ce:4b:f8:51:08:0a:c7:fd:16:16:57:89:d7:
    e6:7e:97:9a:d0:81:dc:aa:02:35:6b:81:11:1f:ed:
    7c:b9:3a:bc:e3:26:b0:94:ae:27:ce:64:2f:9e:50:
    04:88:75:a2:3c:69:8b:e6:33:bc:c7:2c:1f:b6:bf:
    5d:81:7a:e6:e2:2f:a1:6d:14:1b:45:b4:f9:72:b7:
    78:ff:9a:ef:5d:4a:73:5f:85:a1:1e:d2:6d:40:62:
    fd:47:23:80:0a:db:11:17:5d:c5:d4:18:5a:21:bf:
    37:80:ec:21:b7:be:9d:de:89:d4:d9:15:b0:56:66:
    a2:26:c4:7f:32:63:42:48:7c:73:2e:92:49:38:3a:
    17:42:e6:a8:1e:17:5d:ef:f5:92:ab:cd:c4:83:78:
    b3:f3:f8:22:49:fd:29:aa:6b:42:08:e3:1a:f9:54:
    22:11:ae:88:3d:af:3c:40:9d:d6:d2:6f:cb:71:1b:
    6f:7d:df:2f:cd:50:c3:89:e6:41:6d:87:7f:bf:e4:
    c4:22:d5:65:b0:07:63:b4:11:4c:84:65:78:32:a4:
    a3:88:62:d5:ad:81:97:5b:b3:d2:f6:7f:3c:7c:8a:
    36:f4:96:36:54:b4:5a:27:71:66:92:64:97:e8:01:
    ee
[05/29/26]seed@VM:~/Experiment03$

在输出中,各字段对应关系如下:

n = modulus
e = publicExponent
d = privateExponent
p = prime1
q = prime2

3.2 任务 2: 为你的 Web 服务器生成证书请求

生成 CSR 的命令与在创建 CA 自签名证书时使用的命令非常相似,唯一的区别是是否带有-x509 选项。没有这个选项,该命令将生成一个证书签发请求,加上这个选项,该命令将生成一个自签名证书。

生成服务器 CSR 和私钥,并添加两个备用名称:

openssl req -newkey rsa:2048 -sha256 \
  -keyout server.key -out server.csr \
  -subj "/CN=www.bank32.com/O=Bank32 Inc./C=US" \
  -passout pass:dees \
  -addext "subjectAltName = DNS:www.bank32.com, DNS:www.bank32A.com, DNS:www.bank32B.com"
[05/29/26]seed@VM:~/Experiment03$ openssl req -newkey rsa:2048 -sha256 \
>   -keyout server.key -out server.csr \
>   -subj "/CN=www.bank32.com/O=Bank32 Inc./C=US" \
>   -passout pass:dees \
>   -addext "subjectAltName = DNS:www.bank32.com, DNS:www.bank32A.com, DNS:www.bank32B.com"
Generating a RSA private key
..+++++
.....................................................+++++
writing new private key to 'server.key'
-----
[05/29/26]seed@VM:~/Experiment03$ ls
ca.crt  ca.key  demoCA  Labsetup  openssl.cnf  server.csr  server.key
[05/29/26]seed@VM:~/Experiment03$

使用 openssl req -in server.csr -text -nooutopenssl rsa -in server.key -text -noout -passin pass:dees 可以分别查看 CSR 和 私钥证书。

3.3 任务 3: 为你的服务器生成证书

CSR 文件需要具有 CA 的签名才能形成证书。通常情况下是将 CSR 文件发送到受信任的 CA 进行签名。在本实验中,我们将使用我们自己的受信任 CA 生成证书。

复制扩展域

出于安全原因,openssl.cnf 中的默认设置不允许 openssl ca 命令将扩展字段从请求复制到最终证书。为此,我们可以在配置文件的副本中,取消 # copy_extensions = copy 的注释。

[05/29/26]seed@VM:~/Experiment03$ vim openssl.cnf

LgJ5sb9Z-2.png

然后用下面的命令生成证书。

以下命令使用 CA 的 ca.crt 和 ca.key ,将证书签名请求(server.csr )转换为证书(server.crt):

openssl ca -config openssl.cnf -policy policy_anything \
  -md sha256 -days 3650 \
  -in server.csr -out server.crt -batch \
  -cert ca.crt -keyfile ca.key
[05/29/26]seed@VM:~/Experiment03$ openssl ca -config openssl.cnf -policy policy_anything \
>   -md sha256 -days 3650 \
>   -in server.csr -out server.crt -batch \
>   -cert ca.crt -keyfile ca.key
Using configuration from openssl.cnf
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4096 (0x1000)
        Validity
            Not Before: May 29 09:55:49 2026 GMT
            Not After : May 26 09:55:49 2036 GMT
        Subject:
            countryName               = US
            organizationName          = Bank32 Inc.
            commonName                = www.bank32.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                FF:95:D2:89:CC:88:5C:84:33:3F:2F:E4:9E:5F:06:A7:BF:76:47:BB
            X509v3 Authority Key Identifier:
                keyid:99:CA:94:67:5D:24:F0:FA:C0:0A:70:32:25:A2:2C:EC:B1:4F:26:A0

Certificate is to be certified until May 26 09:55:49 2036 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated
[05/29/26]seed@VM:~/Experiment03$

在上面的命令中,openssl.cnf 是从 /usr/lib/ssl/openssl.cnf 复制的配置文件(任务 1 中对此文件进行了更改)。我们使用配置文件中定义的 policy_anything 策略,这不是默认策略,默认策略中的限制太多了。

查看证书是否包含备用名称:

openssl x509 -in server.crt -text -noout
[05/29/26]seed@VM:~/Experiment03$ openssl x509 -in server.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 4097 (0x1001)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = www.modelCA.com, O = Model CA LTD., C = US
        Validity
            Not Before: May 29 10:05:36 2026 GMT
            Not After : May 26 10:05:36 2036 GMT
        Subject: C = US, O = Bank32 Inc., CN = www.bank32.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:f9:10:76:49:32:a9:26:98:f8:12:67:c7:12:b9:
                    18:d1:97:ca:08:1e:d4:9c:11:4f:5a:96:ea:62:ab:
                    de:9d:e1:3f:f8:cf:10:8f:96:e5:9f:03:e5:15:57:
                    c8:60:1d:7a:bb:9b:93:ca:09:92:cf:45:54:92:98:
                    24:58:8e:f8:98:05:41:c2:d4:4c:f5:64:90:de:53:
                    e5:ad:80:c7:09:18:de:cf:5e:19:75:72:2d:a9:c4:
                    6c:61:50:51:76:c1:b8:74:91:bc:64:cb:25:1a:3f:
                    c0:75:7f:f9:ad:49:24:c4:c0:3a:6e:a1:89:3f:b6:
                    7d:f6:66:19:0b:44:7e:01:b2:73:96:85:89:07:6b:
                    f0:0c:8a:83:db:39:b0:1c:33:d7:ab:31:59:d0:88:
                    a6:df:0d:4e:79:db:1e:8c:ed:a9:be:fe:99:be:69:
                    b1:d6:fb:17:d0:35:dc:df:f1:5b:fe:cb:c2:b7:bc:
                    ba:18:e6:66:1f:82:aa:9c:94:42:fc:a1:6f:38:ef:
                    b1:ce:0e:70:21:f9:cb:fb:1b:70:c5:0f:1f:19:bd:
                    1a:56:69:72:53:1b:5d:4e:d4:8c:74:e1:8b:9a:6b:
                    73:34:b2:5d:2f:f5:33:55:e9:e4:41:72:78:c4:73:
                    eb:ea:49:93:2e:35:b6:f7:ef:2f:10:06:56:52:b9:
                    7d:5d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                FF:95:D2:89:CC:88:5C:84:33:3F:2F:E4:9E:5F:06:A7:BF:76:47:BB
            X509v3 Authority Key Identifier:
                keyid:99:CA:94:67:5D:24:F0:FA:C0:0A:70:32:25:A2:2C:EC:B1:4F:26:A0

            X509v3 Subject Alternative Name:
                DNS:www.bank32.com, DNS:www.bank32A.com, DNS:www.bank32B.com
    Signature Algorithm: sha256WithRSAEncryption
         b4:df:06:29:f2:5f:b5:20:22:c8:57:9d:87:9e:74:f2:40:4e:
         5c:09:41:51:90:94:7c:ef:d5:20:53:cc:27:7a:31:b4:cb:19:
         f9:46:49:e0:67:03:ac:99:11:53:5e:1c:64:e2:84:98:33:87:
         8f:33:ea:f8:9b:0b:29:6f:34:47:6c:40:9d:27:49:85:0e:b7:
         bd:8f:a1:31:53:41:fc:f9:34:fc:5b:b7:2f:19:7d:92:4a:78:
         d9:22:50:ee:3c:da:b3:80:3f:0b:0f:76:84:60:89:23:38:09:
         c3:ac:a6:46:23:46:73:c9:a2:7e:04:92:6e:93:6c:dc:de:86:
         9a:3e:eb:fe:48:3b:e6:59:e6:0a:c5:bc:cb:37:69:f7:c7:fd:
         ed:4e:07:a5:94:04:5a:03:3e:7c:ee:ae:bb:81:1d:2c:50:2c:
         ce:8f:bd:4b:aa:92:34:8c:37:6e:fd:a6:e3:10:b1:b8:f9:f9:
         0f:02:1e:4a:34:dc:6c:47:e2:7c:b0:a4:5c:d7:11:14:9d:2d:
         fe:ca:7c:42:03:96:9b:68:77:85:96:0f:c2:99:9d:c0:a3:20:
         ee:5e:c5:ad:98:90:73:23:ae:13:4f:38:48:d9:ed:6d:8b:c4:
         db:49:6c:fc:78:b0:22:a5:bf:cf:93:51:01:4d:17:41:04:7f:
         98:d3:10:ce:c4:6d:ad:95:05:76:3e:14:9d:df:89:69:24:ed:
         4b:55:0a:6e:f1:2f:2d:60:3a:33:a9:2e:e5:2e:7d:b1:d8:34:
         ef:16:0b:b5:a5:90:21:7e:f6:93:06:ae:9e:dd:6f:2f:5c:73:
         4f:ed:dd:8d:c8:b9:61:9a:35:50:81:f1:90:0d:b0:05:51:2f:
         28:4f:ca:a0:21:a7:44:f3:52:75:4d:e0:8b:97:b4:d1:79:83:
         43:68:31:9b:52:ff:8a:72:87:0a:00:27:b1:8c:8f:8d:92:93:
         11:e9:c2:72:b9:aa:c4:28:35:65:a3:cc:e7:b7:48:2a:0c:5b:
         16:5e:43:9e:51:f8:c5:36:b4:86:92:51:1a:eb:ae:08:3f:b8:
         40:b9:0f:06:a9:58:77:01:b5:41:a9:18:15:07:00:d2:5e:b1:
         b0:5a:4a:3c:25:10:6e:46:19:da:3c:b5:20:15:6a:46:39:62:
         94:55:f4:99:34:eb:2a:08:19:5f:4b:32:0a:2f:99:89:31:4b:
         23:70:05:80:f2:f3:d4:15:a4:38:d1:e0:86:07:68:73:3e:49:
         9c:ad:dc:ac:79:d9:6c:27:82:20:26:50:e1:c5:56:2f:06:a9:
         da:2e:ed:04:55:80:65:f4:d5:77:45:c4:5b:a2:8a:fe:a7:95:
         63:a8:b0:a9:42:22:8b:60
[05/29/26]seed@VM:~/Experiment03$

看到 X509v3 Subject Alternative Name:DNS:www.bank32.com, DNS:www.bank32A.com, DNS:www.bank32B.com 说明任务完成。

3.4 任务 4:在基于 Apache 的 HTTPS 网站中部署证书

接下来在 Docker 容器搭建了一个 Apache Web 服务器,并为一个名为 www.bank32.com 的站点配置 HTTPS。

docker ps 查看虚拟机名称,docker exec 进入虚拟机:

[06/01/26]seed@VM:~/.../Labsetup$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS               NAMES
aaa8e187cabf        seed-image-www-pki   "/bin/sh -c 'tail -f…"   2 days ago          Up 10 seconds                           www-10.9.0.80
[06/01/26]seed@VM:~/.../Labsetup$ docker exec -it www-10.9.0.80 bash
root@aaa8e187cabf:/#

查看容器里自带的站点证书是否存在:

root@aaa8e187cabf:/# ls -l /certs
total 12
-rw-rw-r-- 1 root root 5808 Dec  5  2020 bank32.crt
-r-------- 1 root root 1854 Dec  5  2020 bank32.key
root@aaa8e187cabf:/#

查看容器里自带的 Apache Web 配置文件是否存在:

root@aaa8e187cabf:/# cat /etc/apache2/sites-available/bank32_apache_ssl.conf
<VirtualHost *:443>
    DocumentRoot /var/www/bank32
    ServerName www.bank32.com
    ServerAlias www.bank32A.com
    ServerAlias www.bank32B.com
    ServerAlias www.bank32W.com
    DirectoryIndex index.html
    SSLEngine On
    SSLCertificateFile /certs/bank32.crt
    SSLCertificateKeyFile /certs/bank32.key
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/bank32
    ServerName www.bank32.com
    DirectoryIndex index_red.html
</VirtualHost>

# Set the following gloal entry to suppress an annoying warning message
ServerName localhost
root@aaa8e187cabf:/#

使用此配置文件启动服务器(私钥已加密,因此启动 Apache Web 会要求我们输入密码。在容器内,用于 bank32 的密码为 dees):

# 启用 SSL 模块(通常已启用,运行一次确认)
a2enmod ssl
# 启用站点配置文件(bank32_apache_ssl)
a2ensite bank32_apache_ssl
# 启动 Apache 服务
service apache2 start
root@aaa8e187cabf:/# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Module socache_shmcb already enabled
Module ssl already enabled
root@aaa8e187cabf:/# a2ensite bank32_apache_ssl
Site bank32_apache_ssl already enabled
root@aaa8e187cabf:/# service apache2 start
 * Starting Apache httpd web server apache2                                                                                                                                         Enter passphrase for SSL/TLS keys for www.bank32.com:443 (RSA):
 *
root@aaa8e187cabf:/#

查看运行是否成功:

root@aaa8e187cabf:/# service apache2 status
 * apache2 is running
root@aaa8e187cabf:/#

在宿主机浏览器中输入 https://www.bank32.com 访问网站。

LgJ5sb9Z-3.png

可以看到无法建立连接,这是因为浏览器内置了一组受信任的根证书颁发机构(CA)。我们的服务器证书 bank32.crt 由一个自建 CA 签发,该 CA 不在浏览器信任列表中,浏览器无法验证证书合法性,因此认为连接不安全。

要消除警告,必须将签发该服务器证书的 CA 根证书添加到 Firefox 的受信任 CA 列表中。

CA 证书位于 /home/seed/Experiment03/Labsetup/image_www/certs,在 Dockerfile 中,已经包含了将证书和密钥复制到容器的 /certs 文件夹的命令,但没有导入相对应的 CA 文件。

[06/01/26]seed@VM:~/.../certs$ pwd
/home/seed/Experiment03/Labsetup/image_www/certs
[06/01/26]seed@VM:~/.../certs$ ls
bank32.crt  bank32.key  modelCA.crt  README.txt
[06/01/26]seed@VM:~/.../certs$ cat README.txt

bank32.crt: Bank32's public-key certificate, signed by ModelCA.

bank32.key: Bank32's private key
            The password used for protecting the private key is "dees".

modelCA.crt: ModelCA's public-key certificate
[06/01/26]seed@VM:~/.../certs$

要将证书手动添加到 Firefox 浏览器,在地址栏中输入 about:preferences#privacy,滚动到页面底部,点击 "View Certificates",在 Authorities 标签中,可以看到已被 Firefox 接受的证书列表,再点击下面的 "import",导入证书。

LgJ5sb9Z-4.png

选择证书文件后,选择 “Trust this CA to identify websites” 选项。你会看到我们的证书(Model CA LTD)现在 Firefox 接受的证书列表中。

LgJ5sb9Z-5.png

LgJ5sb9Z-6.png

LgJ5sb9Z-7.png

再次访问 https://www.bank32.com,发现访问成功🥰。

LgJ5sb9Z-8.png

3.5 任务 5: 发起中间人攻击

中间人攻击(Man-in-the-Middle Attack,MITM)是指攻击者秘密地插入到通信双方之间,拦截、篡改甚至伪造对话内容。在 HTTPS 场景中,如果攻击者能够让你连接到他控制的服务器,而不是真正的目标服务器,他就可以窃取你的密码、银行卡号等敏感信息。

但是,PKI 通过数字证书和信任链给网站提供了身份证明。服务器的公钥证书里包含了域名信息,并且由受信任的 CA 签名。浏览器在建立连接时会严格验证证书中的域名是否与地址栏中的一致,以及证书链是否可追溯到某个根 CA。只要有一项检查不通过,浏览器就会弹出醒目的安全警告,阻止用户继续访问。

这一部分主要是为了看看 PKI 在 HTTPS 中到底有什么用。我们会模拟一次中间人攻击,看看攻击者想冒充服务器时,浏览器是怎么发现问题并拦住它的。

下图展示了中间人攻击的大致过程。假设 Alice 想访问 example.com。正常情况下,浏览器会从服务器拿到 example.com 的公钥,然后用这个公钥来保护后面 HTTPS 连接中要用到的关键信息。这样只有真正的 example.com 服务器,也就是持有对应私钥的一方,才能解开这些信息并继续建立加密连接。

LgJ5sb9Z-9.png

但如果攻击者能拦截 Alice 和服务器之间的通信,他就可能把服务器的公钥换成自己的公钥。这样 Alice 以为自己拿到的是 example.com 的公钥,其实拿到的是攻击者的公钥。接下来,Alice 发出的关键信息就可能先被攻击者解开,攻击者再把它重新加密后转发给真正的服务器。这样攻击者就夹在了 Alice 和服务器中间,有机会读取甚至修改双方的通信内容。

第 1 步:启动一个恶意网站

我们要让同一个 Apache 服务器同时托管一个伪造的 www.example.com 网站。由于攻击者无法获得该域名的合法证书,我们就使用现有的 bank32 证书。

在真实的中间人攻击中,攻击者正是利用这一点:他当然无法得到目标域名的合法证书,于是便用一张自己控制的证书(也许是自签名的,也许是为另一个域名签发的)来冒充。我们使用 bank32.crt,就是模拟这种典型的伪造证书(真正要访问的是 www.example.com ,它的 IP 不是 10.9.0.80,使用的证书就是 www.example.com 的证书;但实际访问到了假的 www.example.com,这个假的网站 IP 是 10.9.0.80,假的网站使用的 www.bank32.com 的证书)。

进入运行中的容器:

[06/01/26]seed@VM:~$ docker exec -it www-10.9.0.80 bash
root@815f332a2a87:/#

/etc/apache2/sites-available 下新建一个配置文件 example_apache_ssl.conf(容器里面没有 vi 编辑器,直接用管道符):

cat > /etc/apache2/sites-available/example_apache_ssl.conf <<EOF
<VirtualHost *:443>
    DocumentRoot /var/www/example
    ServerName www.example.com
    SSLEngine On
    SSLCertificateFile /certs/bank32.crt
    SSLCertificateKeyFile /certs/bank32.key
</VirtualHost>
EOF
root@815f332a2a87:/# cat > /etc/apache2/sites-available/example_apache_ssl.conf <<EOF
> <VirtualHost *:443>
>     DocumentRoot /var/www/example
>     ServerName www.example.com
>     SSLEngine On
>     SSLCertificateFile /certs/bank32.crt
>     SSLCertificateKeyFile /certs/bank32.key
> </VirtualHost>
> EOF
root@815f332a2a87:/# cat /etc/apache2/sites-available/example_apache_ssl.conf
<VirtualHost *:443>
    DocumentRoot /var/www/example
    ServerName www.example.com
    SSLEngine On
    SSLCertificateFile /certs/bank32.crt
    SSLCertificateKeyFile /certs/bank32.key
</VirtualHost>
root@815f332a2a87:/#

创建网站目录,并写入一个简单的钓鱼页面:

mkdir -p /var/www/example
echo "Fake example.com login page. Please enter your password." > /var/www/example/index.html
root@815f332a2a87:/# mkdir -p /var/www/example
root@815f332a2a87:/# echo "Fake example.com login page. Please enter your password." > /var/www/example/index.html
root@815f332a2a87:/#

启用该站点,并重启 Apache(密码同上 dees):

a2ensite example_apache_ssl
service apache2 restart
root@815f332a2a87:/# a2ensite example_apache_ssl
Enabling site example_apache_ssl.
To activate the new configuration, you need to run:
  service apache2 reload
root@815f332a2a87:/# service apache2 restart
 * Restarting Apache httpd web server apache2                                                                                                                                       Enter passphrase for SSL/TLS keys for www.example.com:443 (RSA):
                                                                                                                                                                             [ OK ]
root@815f332a2a87:/#

第 2 步:成为中间人

真正的攻击者可能会通过 DNS 缓存中毒、ARP 欺骗等手段让受害者的流量重定向。在实验中,我们只需修改宿主机的 /etc/hosts 文件,让 www.example.com 指向攻击者服务器的 IP(也就是我们的容器)。

修改宿主机的 /etc/hosts 文件(不是容器的 hosts 文件):

[06/01/26]seed@VM:~/Experiment03$ sudo vim /etc/hosts

修改后的 hosts 文件:

127.0.0.1       localhost
127.0.1.1       VM

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# For DNS Rebinding Lab
192.168.60.80   www.seedIoT32.com

# For SQL Injection Lab
10.9.0.5        www.SeedLabSQLInjection.com

# For XSS Lab
10.9.0.5        www.xsslabelgg.com
10.9.0.5        www.example32a.com
10.9.0.5        www.example32b.com
10.9.0.5        www.example32c.com
10.9.0.5        www.example60.com
10.9.0.5        www.example70.com

# For CSRF Lab
10.9.0.5        www.csrflabelgg.com
10.9.0.5        www.csrflab-defense.com
10.9.0.105      www.csrflab-attacker.com

# For Shellshock Lab
10.9.0.80       www.seedlab-shellshock.com

# PKI Lab
10.9.0.80 www.bank32.com
10.9.0.80 www.vaultattic.cn
10.9.0.80 www.example.com

第 3 步:浏览目标网站

在宿主机上打开 Firefox,地址栏输入 https://www.example.com 进行访问。

LgJ5sb9Z-10.png

可以看到 Firefox 识别到了此次攻击并且拒绝了访问。

3.6 任务 6: 使用一个被攻陷的 CA 发起中间人攻击

在上一个任务中使用了一张域名不匹配的证书尝试中间人攻击,结果被浏览器的主机名验证信任链检查轻松识破。但攻击者若更进一步,窃取了某个受信任 CA 的私钥,攻击者就可以为任意域名签发“合法”证书,从而让浏览器完全信任一个冒牌网站,毫无警告地将用户引向陷阱。

这里使用 任务 1 创建的 CA 来模拟被窃取私钥了的 CA(/home/seed/Experiment03 目录下的私钥 ca.key 和根证书 ca.crt)。

[06/01/26]seed@VM:~/Experiment03$ ls
ca.crt  ca.key  demoCA  Labsetup  openssl.cnf  server.crt  server.csr  server.key
[06/01/26]seed@VM:~/Experiment03$

生成私钥和证书签名请求:

openssl req -newkey rsa:2048 -sha256 \
  -keyout example.key -out example.csr \
  -subj "/CN=www.example.com/O=Fake Site/C=CN" \
  -passout pass:dees \
  -addext "subjectAltName = DNS:www.example.com"
[06/01/26]seed@VM:~/Experiment03$ openssl req -newkey rsa:2048 -sha256 \
>   -keyout example.key -out example.csr \
>   -subj "/CN=www.example.com/O=Fake Site/C=CN" \
>   -passout pass:dees \
>   -addext "subjectAltName = DNS:www.example.com"
Generating a RSA private key
......+++++
........+++++
writing new private key to 'example.key'
-----
[06/01/26]seed@VM:~/Experiment03$

使用被攻破的 CA 签发证书:

[06/01/26]seed@VM:~/Experiment03$ openssl ca -config openssl.cnf -policy policy_anything \
>   -md sha256 -days 3650 \
>   -in example.csr -out example.crt -batch \
>   -cert ca.crt -keyfile ca.key -passin pass:dees
Using configuration from openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4098 (0x1002)
        Validity
            Not Before: Jun  1 12:55:09 2026 GMT
            Not After : May 29 12:55:09 2036 GMT
        Subject:
            countryName               = CN
            organizationName          = Fake Site
            commonName                = www.example.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                C0:3B:58:7F:FB:0B:3C:C2:26:B6:27:38:B7:6F:1C:E3:58:01:21:D8
            X509v3 Authority Key Identifier:
                keyid:99:CA:94:67:5D:24:F0:FA:C0:0A:70:32:25:A2:2C:EC:B1:4F:26:A0

            X509v3 Subject Alternative Name:
                DNS:www.example.com
Certificate is to be certified until May 29 12:55:09 2036 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated
[06/01/26]seed@VM:~/Experiment03$

你会得到一张由 ca.crt 签发的、有效域名 www.example.com 的真实证书 example.crt

宿主机与容器之间的共享文件夹位于 /home/seed/Experiment03/Labsetup/volumes。把 example.crtexample.key 复制进去,以便容器内可直接使用。

cp example.crt example.key ./Labsetup/volumes/
[06/01/26]seed@VM:~/Experiment03$ cp example.crt example.key ./Labsetup/volumes/
[06/01/26]seed@VM:~/Experiment03$ ls ./Labsetup/volumes/
example.crt  example.key  README.md
[06/01/26]seed@VM:~/Experiment03$

进入容器:

[06/01/26]seed@VM:~$ docker exec -it www-10.9.0.80 bash
root@815f332a2a87:/#

在容器内,将证书移动到 /certs

cp /volumes/example.crt /certs
cp /volumes/example.key /certs
root@815f332a2a87:/# cp /volumes/example.crt /certs
root@815f332a2a87:/# cp /volumes/example.key /certs
root@815f332a2a87:/# ls /certs/
bank32.crt  bank32.key  example.crt  example.key
root@815f332a2a87:/#

修改 Apache Web 配置文件,在 /etc/apache2/sites-available/example_apache_ssl.conf 中使用新的证书:

cat > /etc/apache2/sites-available/example_apache_ssl.conf <<EOF
<VirtualHost *:443>
    DocumentRoot /var/www/example
    ServerName www.example.com
    SSLEngine On
    SSLCertificateFile /certs/example.crt
    SSLCertificateKeyFile /certs/example.key
</VirtualHost>
EOF
root@815f332a2a87:/# cat > /etc/apache2/sites-available/example_apache_ssl.conf <<EOF
> <VirtualHost *:443>
>     DocumentRoot /var/www/example
>     ServerName www.example.com
>     SSLEngine On
>     SSLCertificateFile /certs/example.crt
>     SSLCertificateKeyFile /certs/example.key
> </VirtualHost>
> EOF
root@815f332a2a87:/# cat /etc/apache2/sites-available/example_apache_ssl.conf
<VirtualHost *:443>
    DocumentRoot /var/www/example
    ServerName www.example.com
    SSLEngine On
    SSLCertificateFile /certs/example.crt
    SSLCertificateKeyFile /certs/example.key
</VirtualHost>
root@815f332a2a87:/#

启用站点并重启 Apache:

a2ensite example_apache_ssl
service apache2 restart
root@815f332a2a87:/# a2ensite example_apache_ssl
Site example_apache_ssl already enabled
root@815f332a2a87:/# service apache2 restart
 * Restarting Apache httpd web server apache2                                                                                                                                       Enter passphrase for SSL/TLS keys for www.example.com:443 (RSA):
                                                                                                                                                                             [ OK ]
root@815f332a2a87:/#

然后在 Firefox 导入这个被窃取私钥了的 CA。

在地址栏中输入 about:preferences#privacy,滚动到页面底部,点击 "View Certificates",再点击下面的 "import",导入证书(/home/seed/Experiment03/ca.key),选择证书文件后,选择 “Trust this CA to identify websites” 选项。

LgJ5sb9Z-11.png

回到宿主机,Firefox 中访问 https://www.example.com

LgJ5sb9Z-12.png

攻击成功🥷。


评论