Public Key Infrastructure Laboratory实验测试Ubuntu 20.04
PKI Lab(Public-Key Infrastructure Lab)
实验准备
本次实验依托于最新版seed2.0平台开展,所采用的虚拟机环境为Ubuntu2004系统。安装过程在此不予赘述。
需准备以下文件,所有资料均可通过官方网站获取(或由教师提供/doge):
Labsetup.zip
OpenSSL Command-Line HOWTO.mht.zip
配置环境设置
将文件labsetup.zip传输至虚拟机内部,并运行相应操作:
dcbuild
dcup
dcdown
其相关内容已由alias进行设定,详细信息可参阅~/.bashrc文件。

实际操作流程可能较为耗时,具体时长取决于设备的运算性能。从图中可见,docker容器已启动运行。
根据实验规范,需要将docker的ip地址与dns服务器的映射关系录入至/etc/hosts文件中,具体示例如下:

实验任务
1. 成为一个CA
配置文件
系统默认的openssl配置文件位于usr/lib/ssl/openssl.cnf,为满足自定义CA的创建需求,需对这一文件进行相应调整。建议先将其复制至个人目录中再进行编辑操作。
请取消下图中被标注行的注释状态:

【该部分内容归属于CA_default,主要用于配置CA的相关参数信息,通过取消注释可实现多证书的生成功能。在当前目录中建立名为demoCA的子目录,并在其中生成上述所需文件。
关于index.txt文件,只需创建一个空文件即可。至于serial文件,则需在其中输入一个字符串格式的单一数字(例如:1000)。完成openssl.cnf配置文件的设置后,即可进行证书的生成与签发操作。

证书认证
通过使用以下语句,我们能够为自身的CA生成一个证书,并在此过程中将密码设定为dees

提问
• 证书中哪一部分能够表明这是证书颁发机构的证书?
• 证书中哪一部分能够表明这是一份自签名证书?
• 在RSA算法中,我们拥有一个公钥指数e、一个私钥指数d、一个模数n,以及两个保密数值p和q,其中n = pq。请在你的证书和密钥文件中识别出这些元素的对应数值。
借助openssl进行解密操作,可以对上述问题作出解答:
openssl x509 -in ca.crt -text -noout
openssl rsa -in ca.key -text -noout
通过x509生成公钥证书,其中包含CA:TRUE标识用于明确该证书属于证书颁发机构类型。

从图中可以观察到,证书的签发机构与持有者信息完全吻合,由此可判断该证书属于自签名类型。

RSA算法由e,d,n,p,q这五个组成部分构成,其中在ca.crt和ca.key文件中均作出了清晰的定义,此处仅对e,即RSA公钥部分进行展示:

2. 为你的网页服务器创建一个证书申请
通过执行下列指令即可生成相应证书:
openssl req -newkey rsa:2048 -sha256 \
-keyout server.key out server.csr \
-subj "/CN-www.sun2022.com/O=Sun2022 Inc./C=CN" \
-passout pass:dees
同样可借助命令行工具查阅证书内容,其中所标记的网站相关数据已准确无误地进行添加:

拓展域名(SAN)配置与实现
在生成证书的指令之后,直接追加以下内容:
-addext "subjectAltName=DNS : www.sun2022.com, DNS : www.sun2020.com, DNS : www.sun2022.net "
如图所示,可为其余两个域名分配相应的证书:

3. 为服务器创建证书
借助前一节所述的证书申请流程以及前前节所提及的CA证书,为服务器生成对应的证书
openssl ca -config myCA_openssl.cnf -policy policy_anything \
-md sha256 -days 3650 \
-in server.csr -out server.crt \
-batch \
-cert ./ca.crt -keyfile ./ca.key

在CA内部临时生成的文件夹创建完成后,其相关属性发生了如下变动:

然而,通过这种方式生成的服务器证书并未将此前提及的SAN信息进行复制,具体示例如下:

对CA的配置参数进行调整后,即可实现此类复制操作。
请将cnf文件中对应的这一项注释取消,随后再次生成证书:
# Extension copying option: use with caution.
copy_ extensions = copy
检测到额外数据内容已成功复制至当前工作区:

4. 打开我们的网站
通过实验,我们已获得一个名为bank32的网站资源,接下来需要依据该网站的文件结构作为模板,搭建属于我们自己的网站。在此过程中,决定将所有与bank32相关的文件及信息内容替换为刚刚构建的内容。
- 启动Apache2服务
可通过执行下列命令来开启ssl服务:
a2enmod ssl
a2ensite sun2022_apache_ssl
随后,我们借助虚拟机中的浏览器访问了https://www.sun2022.com即可访问`地址。

在操作过程中遇到浏览器提示无法访问的情况,原因在于证书发布者未获得合法认证,若执意继续访问则可突破限制。若未采用https协议进行访问,系统将默认连接至80端口的http服务,此时页面背景会呈现红色。

浏览器CA证书添加方法
从实际观察可知,当使用https协议访问特定网站时,地址栏通常会显示证书存在安全隐患的警告信息。这主要是由于为该网站颁发数字证书的认证机构(CA)尚未被纳入浏览器默认的安全信任列表所致。
为将先前创建的CA证书纳入系统认证范围,可按照以下操作步骤进行添加:


在后续再次访问该网站时,其认证状态将被确认为成功,具体示例如下图所示:

5. 发起攻击!!!
计划对目标网站实施中间人攻击
我们打算针对自身的网站首页实施攻击行为。假设我们刚刚建立的www.sun2022.com被设定为一个广受欢迎的网站登录页面,然而依据我们在实验环境搭建阶段的操作,已经将本机对该网站的访问引导至我们自行设定的IP地址(模拟对路由器中IP配置的修改)。因此,当用户尝试访问该网站时,系统将自动跳转至我们所搭建的服务器端页面。
我们将seu的ehall登录界面保存至虚拟机中(露出坏笑),并将其作为www.sun2022.com的登录页面进行模拟,此时可以观察到该页面已成功加载:

然而,由于所仿冒的服务器并未具备与真实网站进行通信连接的功能,因此无法正常访问原始网站的服务器,进而无法加载外部图片。不过,客户端层面的中间人攻击已基本实现,成功模拟了目标网站的伪装行为。
6. 冒充CA发放证书
事实上,本阶段的内容已在前四个步骤中得以实现,其结论也与之前所述一致。然而,倘若我们尚未为网站生成合法的证书,又将如何应对?在此情形下,可通过执行以下指令来阻止虚假证书的正常颁发,从而模拟网站缺乏有效证书的状态:
a2dissite sun2022_apache_ssl
service apache2 reload
观察可知,当再次尝试进入该网站时,浏览器系统已自动拦截了此次访问请求:

总结
本次实验通过生成一个符合规范的数字证书,使测试网站能够实现正常访问。这一现象也警示我们,在浏览配备非正规证书的网页时需提高警惕,因为此类访问行为存在较高的风险,可能已被不法分子实施中间人攻击,从而导致信息泄露或操作被操控。
