OpenSSL简单使用
网络空间安全设计与实践课程实验报告,学习OpenSSL生成密钥、生成数字证书的基本使用方法
网络空间安全设计与实践课程实验报告
一、实验目的和要求
- 学习OpenSSL生成密钥、生成数字证书的基本使用方法
- 使用OpenSSL生成根CA密钥和自签根CA证书
- 使用OpenSSL为某域名生成TLS密钥,并使用自签根CA签发证书
- 使用web服务器(例如NGINX)在本地部署一个可通过域名以HTTP方式访问的web站点后,为该站点部署生成的证书,以HTTPS方式访问,查看浏览器的访问提示
- 在浏览器/操作系统中导入生成的自签根CA证书,查看浏览器访问配置的HTTPS网站的访问提示
二、实验环境
硬件环境
- 宿主机配置:
- 处理器:i5-12450h
- 内存:16GB
- 硬盘:1TB SSD
- 网络环境:无线互联网连接
- 客户机(虚拟机)配置:
- Windows 10 专业版
- CPU:2 核
- 内存:2GB
- 硬盘:60G
- 网络:NAT模式
- Debian 12.9
- CPU:2 核
- 内存:2GB
- 硬盘:30GB
- 网络:NAT模式
- Windows 10 专业版
软件环境
- 宿主机操作系统: Windows 11 专业版,64位操作系统,基于x64的处理器
- 虚拟机软件: VMware® Workstation 17 Pro 17.6.2 build-24409262
三、实验原理
SSL/TLS 的核心原理是通过混合加密、身份认证和完整性校验实现安全通信,其关键机制如下:
1. 混合加密(Hybrid Encryption)
- 非对称加密(如RSA、ECDHE):用于安全交换对称密钥(密钥协商),解决密钥分发难题。例如:TLS 握手阶段通过 ECDHE 生成临时公私钥对,交换密钥信息。
- 对称加密(如AES-GCM、ChaCha20):使用协商后的密钥加密实际数据,高效且安全。例如:加密HTTP请求内容,防止窃听。
2. 身份认证(数字证书)
- 服务器证书:由受信任的 CA(证书颁发机构) 签发,包含服务器公钥、域名等信息。客户端验证证书有效性(有效期、域名匹配、CA信任链)。
- 客户端证书(可选):双向认证场景中,客户端提供证书验证自身身份。
3. 数据完整性
- 哈希算法(如SHA-256):对通信数据生成摘要,确保传输过程中未被篡改。结合MAC(消息认证码)或AEAD(如AES-GCM)实现防篡改。
4. TLS握手流程(核心步骤)
- 协商协议版本:客户端与服务器协商使用TLS 1.2/1.3。
- 密钥交换:通过非对称加密(如ECDHE)生成共享密钥。
- 身份验证:服务器提供证书,客户端验证CA签名。
- 生成会话密钥:基于交换的密钥派生出对称密钥,用于后续数据加密。
TLS 1.3优化:
- 简化握手为 1-RTT(仅需1次往返),移除不安全算法(如RSA密钥交换)。
- 默认启用前向保密(PFS),即使私钥泄露,历史会话也无法解密。
5. 安全增强机制
- 前向保密(PFS):每次会话生成独立密钥,防止长期密钥泄露导致历史数据被破解。
- 证书透明度(CT):公开证书签发日志,防止恶意CA签发假证书。
- 防降级攻击:强制使用高版本协议(如禁用SSLv3),阻止攻击者强制降级到弱版本。
核心价值
- 机密性:对称加密保护数据隐私。
- 真实性:数字证书验证通信双方身份。
- 完整性:哈希校验防止数据篡改。
通过上述机制,SSL/TLS 在不可信的网络(如互联网)中建立了安全的通信通道,是HTTPS、电子邮件等应用的基础。
四、实验准备
实验准备(一):安装软件
-
在Windows虚拟机中安装所需软件,安装Mozilla Firefox(建议”美式英语/en-US”)
-
安装OpenSSL

-
在C盘下建立一个目录用于存放TLS证书和密钥,如
C:\cert,并将分发压缩包中的x509v3.ext文件复制到该文件夹下 -
解压NGINX到
C:\nginx目录下使得:nginx.exe文件位于C:\nginx\nginx.exe,目录结构保持不变
实验准备(二):Windows虚拟机中编辑hosts文件配置本地域名解析
-
使用命令
netstat -anp tcp查看并确认tcp 80/tcp 443端口未被占用
-
选定/确定域名,如
tls.practice2025.learncybersecurity.cn与myweb.test -
以管理员权限编辑
C:\Windows\System32\drivers\etc\hosts末尾添加以下两行内容后保存:127.0.0.1 tls.practice2025.learncybersecurity.cn 127.0.0.1 myweb.test -
分别使用命令
ping tls.practice2025.learncybersecurity.cn和命令ping myweb.test检查主机名或域名的host配置是否成功
实验准备(三):Windows虚拟机中修改NGINX主配置文件
-
编辑NGINX配置文件
C:\nginx\conf\nginx.conf -
在http块中添加一行:
server_names_hash_bucket_size 128;,保存文件(注意:末尾为英文分号”;”)
-
注意:不可放置在其它块中
-
打开一个命令提示符窗口,工作目录切换到
C:\nginx,保持该窗口打开,并完成以下操作:检查NGINX配置文件是否语法正确,执行nginx -t,如报错则应修正。若弹出防火墙提示,根据需要放行,仅本机访问则取消或关闭该对话框
实验准备(四):Windows虚拟机中测试准备工作是否完成
-
双击
C:\nginx目录下的nginx.exe可执行文件启动NGINX -
打开Firefox浏览器,打开两个标签页通过地址栏输入分别访问以下网站:
http://myweb.test/— 实验内容(一)〜(四)将使用此域名http://tls.practice2025.learncybersecurity.cn/— 实验内容(五)将使用此域名
-
按F12或Ctrl+Shift+I打开开发人员工具:切换到”Network”(网络)标签页(或直接用Ctrl+Shift+E打开),选中”Disable Cache”后刷新页面,使用开发人员工具查看网络通信

-
换用Edge浏览器访问,查看开发人员工具中的”网络""安全性”页
-
在命令提示符中于
C:\nginx目录下执行nginx -s stop停止NGINX服务器 -
查看NGINX配置文件并找到在http块中的所有server块,阅读配置
五、实验步骤
实验内容(一):Windows虚拟机中使用OpenSSL
-
安装好OpenSSL后,使用开始菜单中的”Win64 OpenSSL Command Prompt”打开一个OpenSSL命令提示符窗口

-
在该命令提示符窗口运行
openssl,查看输出信息
-
在该命令提示符窗口运行
openssl version,查看输出信息
-
确认OpenSSL可使用即可
实验内容(二):Windows虚拟机中使用OpenSSL生成自签根CA
-
确保已在C盘下建立了
C:\cert并做好了准备工作 -
使用开始菜单中的”Win64 OpenSSL Command Prompt”打开一个OpenSSL命令提示符窗口
-
在该命令提示符窗口中进入
C:\cert为当前工作目录 -
执行以下命令生成根 CA 密钥(4096位RSA密钥):
openssl genrsa 4096 > ca-key.pem
关注命令行:亦可用下列命令配合相应选项参数生成各类密钥:
openssl genpkey亦可使用指定密码命令生成该密码的密钥,如可用命令
openssl ecparam配合相应选项和参数生成EC密钥。 -
执行以下命令生成根CA的证书申请请求(CSR)并自签,输入所需信息:
openssl req -new -sha256 -key ca-key.pem -out ca-csr.pem注意:整个命令为一行,参数和选项之间用空格隔开,下同。

关注命令行选项与参数:
req:PKCS#10格式的证书请求和证书生成命令-new:生成新的证书申请请求(certificate signing request,CSR)-sha256:生成CSR时使用SHA-256哈希算法-key ca-key.pem:从指定文件ca-key.pem读取密钥对CSR签名-out ca-csr.pem:输出证书申请请求至指定文件ca-csr.pem
建议输入的信息:
字段 输入值 Country Name (2 letter code) [AU] CN State or Province Name (full name) [Some-State] Shanxi Locality Name (eg, city) [] Taiyuan Organization Name (eg, company) [Internet Widgits Pty Ltd] SXNU Organizational Unit Name (eg, section) [] SMCS Common Name (e.g. server FQDN or YOUR name) [] Class2307 Email Address [] 2307@sxnu.test A challenge password [] (空) An optional company name [] (空) -
使用以下命令用根CA密钥和证书申请请求生成自签根 CA 证书:
openssl x509 -req -sha256 -days 365 -in ca-csr.pem -key ca-key.pem -out ca-cert.pem关注命令行选项与参数:
x509:证书显示和签名命令-req:将使用已自签的CSR(PKCS#10格式)作为输入-sha256:对证书签名时使用SHA-256哈希算法-days 365:证书有效期设置为365天-in ca-csr.pem:从指定文件ca-csr.pem读取CSR(PKCS#10格式,已签名)-key ca-key.pem:从指定文件ca-key.pem读取密钥以签名证书(旧名-signkey)-out ca-cert.pem:输出证书至指定文件ca-cert.pem

-
执行以下命令可查看上一步生成的自签根CA证书的信息:
openssl x509 -in ca-cert.pem -noout -text
关注命令行选项与参数:
x509:证书显示和签名命令-in:从指定文件ca-cert.pem读取证书-noout:配合后续选项参数,不输出内容(如原始证书内容)-text:以文本方式打印证书详细信息
实验内容(三):Windows虚拟机中使用OpenSSL由自签根CA签发TLS证书
-
仍在”Win64 OpenSSL Command Prompt”命令提示符窗口中,仍在目录
C:\cert中为当前工作目录 -
执行以下命令生成 web 服务器 TLS 通信所使用的密钥(3072位RSA密钥):
openssl genrsa 3072 > server-key.pem
-
以下命令用服务器密钥生成证书申请请求并自签,根据提示输入所需信息:
openssl req -new -sha256 -key server-key.pem -out server-csr.pem建议输入的信息:
字段 输入值 Country Name (2 letter code) [AU] CN State or Province Name (full name) [Some-State] Shanxi Locality Name (eg, city) [] Taiyuan Organization Name (eg, company) [Internet Widgits Pty Ltd] ZhangSan (你的名字) Organizational Unit Name (eg, section) [] (可为空) Common Name (e.g. server FQDN or YOUR name) [] myweb.test (这里为前述域名) Email Address [] webmaster@myweb.test A challenge password [] (空) An optional company name [] (空) 
-
使用以下命令用服务器TLS通信密钥和证书申请请求(CSR)生成 TLS 证书,并使用实验内容(二)中生成的自签根 CA 签发:
openssl x509 -req -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem -days 365 -sha256 -extfile x509v3.ext关注命令行选项与参数:
x509:证书显示和签名命令-req:将使用已自签的CSR(PKCS#10格式)作为输入-CA ca-cert.pem:从指定文件ca-cert.pem读取CA证书-CAkey ca-key.pem:从指定文件ca-key.pem读取CA密钥以签发证书-out server-cert.pem:输出证书至指定文件server-cert.pem-extfile x509v3.ext:从指定文件x509v3.ext读取数字证书第3版扩展信息-sha256:对证书签名时使用SHA-256哈希算法-days 365:证书有效期设置为365天

-
执行以下命令可查看上一步由自签根CA签发的服务器TLS证书的信息:
openssl x509 -in server-cert.pem -noout -text
实验内容(四):用自签根CA签发的证书在NGINX部署HTTPS站点并访问
-
如 NGINX 服务器已启动,则于命令提示符中在
C:\nginx目录下执行命令nginx -s stop停止 NGINX 服务器 -
编辑NGINX配置文件
C:\nginx\conf\nginx.conf,找到http块,在其中添加一个server块,该文件组织形式如下:...(http块外其它内容) http { ...(http块内其它内容) server { # <- 添加的块从此行开始 -> ...(server块内内容) } # <- 添加的块到此行结束 -> ...(http块内其它内容) }注意:在http块中新添加的server块不要落在其它server块或其它配置块内。
添加的server块完整内容为:
server { listen 443 ssl; server_name myweb.test; ssl_certificate C:\\cert\\server-cert.pem; ssl_certificate_key C:\\cert\\server-key.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } -
保存文件后检查配置文件语法,在命令提示符中于
C:\nginx目录下执行nginx -t,如有错误需更正配置错误
-
确保配置无错误后,双击
nginx.exe启动NGINX服务器 -
在Firefox浏览器中访问:
https://myweb.test/ -
在 Firefox 浏览器访问该页面时查看相关安全信息(证书等)

注意:如此时”Accept the Risk and Continue”(“接受风险并继续”)会如何?

-
在 Firefox 中导入自签根 CA 证书至 “Authorities”(“证书颁发机构”)
如使用英文版Firefox:
- 点击Firefox浏览器中”≡“图标 → Settings → Privacy & Security
- 转到”Certificates”设置部分,点击”View Certificates…”按钮
- 切换到”Authorities”页面,点击”Import…”导入实验内容(三)中生成的根 CA 证书,注意下一界面选中 “Trust this CA to identify websites.”
如使用中文版Firefox:
- 点击Firefox浏览器中”≡“图标 → 设置 → 隐私与安全
- 转到”证书”设置部分,点击”查看证书…”按钮
- 切换到”证书颁发机构”页面,点击”导入…”导入实验内容(三)中生成的根 CA 证书,注意下一界面选中 “信任由此证书颁发机构来标识网站” 选项
-
如在前述操作中为该站点添加了例外,则在 “Servers”(“服务器”)页面删除该例外
-
重新在Firefox浏览器中访问(或强制刷新)
https://myweb.test/,查看安全信息、证书(包含服务器证书及签发者的证书)

实验内容(五):用Let’s Encrypt签发的TLS证书配置HTTPS站点并访问
-
从分发的zip压缩包中解压其中的
cert.pem和key.pem放入C:\cert目录下 -
如 NGINX 服务器已启动,则命令提示符中
C:\nginx目录下执行命令nginx -s stop停止 NGINX 服务器 -
编辑NGINX配置文件
C:\nginx\conf\nginx.conf,找到http块,在其中添加一个新的server块。注意:在http块中新添加的server块不要落在其它server块或其它配置块内。添加的server块完整内容为:
server { listen 443 ssl; server_name tls.practice2025.learncybersecurity.cn; ssl_certificate C:\\cert\\cert.pem; ssl_certificate_key C:\\cert\\key.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
-
保存文件,检查配置文件语法:
nginx -t,如有错误需更正配置错误 -
确保配置无错误后,双击
nginx.exe启动NGINX服务器 -
在Firefox浏览器中访问:
https://tls.practice2025.learncybersecurity.cn -
在 Firefox 浏览器访问该页面时查看相关安全信息(证书等)


六、实验小结
一、实验原理总结
TLS/SSL 核心作用:
- 加密通信:通过非对称加密(RSA/ECC)建立安全通道,对称加密(AES)传输数据。
- 身份验证:证书链验证(根 CA → 中间 CA → 服务器证书)确保服务器身份合法。
- 数据完整性:哈希算法(SHA-256)防止数据篡改。
自签名证书与 CA 签名证书区别:
- 自签名证书:由自身作为根 CA 签发,浏览器默认不信任,需手动导入根 CA 证书。
- CA 签名证书:由可信第三方机构(如 Let’s Encrypt)签发,浏览器自动信任。
Hosts 文件作用:
本地域名解析,将 myweb.test 映射到本地 IP(如 127.0.0.1),绕过公共 DNS 解析。
二、实验步骤核心总结
1. 生成自签根 CA 证书
密钥生成:
openssl genrsa 4096 > ca-key.pem # 生成根 CA 私钥
CSR 与自签证书:
openssl req -new -sha256 -key ca-key.pem -out ca-csr.pem # 生成 CSR
openssl x509 -req -sha256 -days 365 -in ca-csr.pem -key ca-key.pem -out ca-cert.pem # 自签根 CA 证书
2. 签发服务器 TLS 证书
服务器密钥与 CSR:
openssl genrsa 3072 > server-key.pem # 生成服务器私钥
openssl req -new -sha256 -key server-key.pem -out server-csr.pem # 生成服务器 CSR
使用根 CA 签发证书:
openssl x509 -req -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem -days 365 -sha256
3. Nginx 部署 HTTPS 站点
Nginx 配置核心片段:
server {
listen 443 ssl;
server_name myweb.test;
ssl_certificate C:\\cert\\server-cert.pem;
ssl_certificate_key C:\\cert\\server-key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
4. 浏览器信任自签根 CA
Firefox 导入根 CA:
- 设置 → 隐私与安全 → 查看证书 → 证书颁发机构 → 导入
ca-cert.pem。 - 勾选 “信任此 CA 标识网站”。
5. Let’s Encrypt 证书对比
- 自动化流程:通过 ACME 协议自动验证域名所有权并签发证书(无需手动生成 CSR)。
- 免费与可信:浏览器默认信任 Let’s Encrypt,无需手动导入根 CA。
七、遇到问题、其它疑问想法和感悟
Nginx 启动失败,浏览器提示”不安全连接”,证书有效期问题。
自签名证书风险:
- 中间人攻击风险:若攻击者控制根 CA 证书,可伪造服务器证书。
- 适用场景:内网测试、开发环境;生产环境应使用可信 CA 签发证书。
HTTPS 最佳实践:
- 强制 HTTPS:配置 HTTP 到 HTTPS 的重定向。
- 启用 HSTS:通过响应头
Strict-Transport-Security强制浏览器使用 HTTPS。 - 定期更新密钥:防止密钥泄露导致的安全风险。
Let’s Encrypt 优势:
- 零成本:免费签发 DV(域名验证)证书。
- 自动化工具:通过 Certbot 实现证书申请、部署、续期全自动化。
实验感悟:
- 技术收获:掌握 OpenSSL 命令行工具生成证书的完整流程;理解 TLS 握手过程中证书链验证的核心逻辑。
- 安全意识提升:证书透明性 — 实际应用中需监控证书透明度日志(CT Log),防止恶意证书签发;最小权限原则 — 服务器私钥文件应限制访问权限(如
chmod 400 server-key.pem)。 - 延伸思考:探索自动化工具(如 mkcert)简化本地开发环境 HTTPS 配置;研究 ACME 协议实现,理解 Let’s Encrypt 的工作机制。
八、思考题回答
1. 在互联网基础设施中,SSL/TLS协议常用于哪些场景、协议、技术或产品中?
- Web安全(HTTPS):保护浏览器与服务器之间的通信(如网银、电商支付)
- 电子邮件加密:SMTP(STARTTLS)、IMAP/POP3 over TLS
- VPN隧道:OpenVPN、IPsec(部分实现依赖TLS)
- API安全:RESTful API通过TLS加密数据传输
- 物联网(IoT):设备固件更新、远程控制通信
- 数据库连接:MySQL SSL Mode、PostgreSQL SSL
- 即时通讯:WhatsApp、Signal等端到端加密通信的基础协议
2. SSL/TLS工作在ISO OSI/RM中的哪一层/哪些层?
主要工作层次:
- 会话层(Session Layer, 第5层):管理加密会话的建立与维护
- 应用层(Application Layer, 第7层):作为应用协议(如HTTP)的安全封装层
实际实现:位于传输层(TCP)之上,为应用层提供透明加密服务。
3. SSL/TLS协议能通过哪些加密技术、加密算法、密码系统为其它协议或技术提供怎样的安全性?这些密码技术属于对称密码系统还是公钥密码系统?
| 技术类型 | 算法示例 | 密码系统类型 | 功能说明 |
|---|---|---|---|
| 密钥交换 | RSA、Diffie-Hellman、ECDH | 公钥密码系统 | 安全协商会话密钥 |
| 数据加密 | AES-256、ChaCha20、3DES | 对称密码系统 | 加密传输内容 |
| 完整性验证 | SHA-256、SHA-384 | 哈希算法 | 防止数据篡改 |
| 身份认证 | ECDSA、RSA签名 | 公钥密码系统 | 验证服务器/客户端证书合法性 |
安全性作用:
- 保密性:通过对称加密防止窃听
- 完整性:哈希算法确保数据未被篡改
- 身份认证:数字证书验证通信方身份
4. SSL协议与TLS协议各版本的安全情况如何?对于SSL/TLS协议各版本的攻击有哪些?当前应使用SSL/TLS协议中的哪一版本?
| 协议版本 | 安全状态 | 已知攻击示例 |
|---|---|---|
| SSLv2 | 已废弃(CVE-2011-3389等) | DROWN攻击(利用SSLv2漏洞) |
| SSLv3 | 已废弃(CVE-2014-3566) | POODLE攻击(降级到SSLv3) |
| TLS 1.0 | 高危(CVE-2011-3389) | BEAST攻击(CBC模式漏洞) |
| TLS 1.1 | 已过时(仅限遗留系统) | 未修复的CBC模式风险 |
| TLS 1.2 | 当前主流安全版本 | 需禁用弱密码套件(如RC4) |
| TLS 1.3 | 最安全版本(RFC 8446) | 无已知重大漏洞 |
常见协议层攻击:
- 降级攻击(Downgrade Attack):强制使用低版本协议(如TLS→SSLv3)
- 中间人攻击(MITM):伪造证书或利用未验证的CA信任链
- 心脏出血(Heartbleed):CVE-2014-0160(OpenSSL实现漏洞)
当前推荐版本:
- 必须启用:TLS 1.2 和 TLS 1.3
- 禁用:SSLv2、SSLv3、TLS 1.0、TLS 1.1
5. 词汇解释:digital certificate、public-key infrastructure(PKI)、certificate authorities(CA)
Digital Certificate(数字证书)
- 定义:由CA颁发的电子文档,包含公钥、持有者身份信息、有效期等
- 作用:验证实体身份(如网站域名),建立信任链
- 示例:X.509证书用于HTTPS服务器认证
Public-Key Infrastructure(PKI,公钥基础设施)
组成:
- 证书颁发机构(CA)
- 证书注册机构(RA)
- 证书吊销列表(CRL)或OCSP服务
功能:管理数字证书的生成、分发、验证和吊销。
Certificate Authorities(CA,证书颁发机构)
- 角色:受信任的第三方机构,负责审核申请者身份并签发证书
- 分类:
- 公共CA:Let’s Encrypt、DigiCert(用于互联网公开服务)
- 私有CA:企业自建CA(用于内网服务)
- 信任机制:操作系统和浏览器预置根证书列表
九、拓展操作(可选)
-
实验内容(六):在实验内容(五)中将浏览器由Firefox换为Edge完成
-
实验内容(七):在Debian虚拟机中安装OpenSSL等软件完成前述操作
提示:
- Debian中可安装OpenSSL、NGINX、CURL等软件
- OpenSSL跨平台命令行操作基本一致
- NGINX配置可查阅官方文档、教程或借助AI
- 浏览器访问网站可藉由CURL实现
- 使用CURL可通过选项
--cacert并提供CA证书路径作为参数在访问中信任CA签发的证书:curl --cacert ca-cert.pem https://...
-
实验内容(八):学习OpenSSL多种用途
-
实验内容(九):尝试使用免费证书颁发机构提供的服务获取一本可用于真实网站的证书
💬 评论