介绍
在这个实验中,你将探索创建和管理 X.509 证书的实际方面,这是现代数字安全的一个基石。X.509 证书是数字文档,它将公钥绑定到一个身份(identity),例如个人或服务器,并且是保护 Web 流量的 TLS/SSL 等协议的基础。
你将使用强大的 openssl 命令行工具,学习如何执行基本的证书管理任务。你将从理解证书的结构开始,然后为开发目的创建一个自签名证书(self-signed certificate)。接着,你将生成一个证书签名请求(Certificate Signing Request, CSR),并充当一个简单的证书颁发机构(Certificate Authority, CA)来对其进行签名,从而在你的系统内部生成一个受信任的证书。
到本实验结束时,你将对证书生命周期有一个扎实、亲手的理解。
X.509 证书概述
在这一步中,我们将介绍 X.509 证书背后的基本理论。这里没有需要执行的命令;本节内容旨在让你在开始动手操作任务之前有所了解。
X.509 证书是一种标准化的数字文档,其中包含建立信任所需的重要信息。其主要组成部分包括:
- **主体 (Subject)**:证书持有者的身份(例如,一个人,或像
www.example.com这样的服务器名称)。 - **颁发者 (Issuer)**:验证身份并签署证书的实体(即证书颁发机构或 CA)。
- **公钥 (Public Key)**:与主体私钥相对应的公钥。
- **有效期 (Validity Period)**:证书有效的日期范围(
Not Before和Not After)。 - **签名 (Signature)**:颁发者的数字签名,它保证了证书的真实性。
自签名证书 (Self-signed certificate) 是一种特殊类型的证书,其中颁发者和主体是相同的。本质上,证书会对自己进行签名。虽然这些证书不被公共浏览器或系统信任(因为它们没有经过已知 CA 的验证),但它们对于内部测试、开发环境或你同时控制客户端和服务器的私有网络极其有用。
在下一步中,你将创建自己的自签名证书。
创建自签名证书
在这一步中,你将创建一个自签名证书。为了简化流程,一个名为 private.pem 的私钥已经为你生成在 ~/project 目录下。你将使用这个密钥来生成证书。
openssl req 命令用于创建和处理证书请求。让我们分解一下我们将使用的选项(flags):
-new: 生成一个新的证书请求。-x509: 输出一个自签名证书而不是证书请求。-key private.pem: 指定要使用的私钥。-out cert.pem: 指定证书的输出文件名。-days 365: 将证书的有效期设置为 365 天。-subj "...": 以非交互方式提供主体信息。
现在,在你的终端中运行以下命令来创建证书:
openssl req -new -x509 -key private.pem -out cert.pem -days 365 -subj "/C=US/ST=California/L=Mountain View/O=MyOrg/CN=example.com"
此命令不会产生任何输出,但它会创建一个新文件。你可以通过列出当前目录中的文件来验证 cert.pem 文件是否已创建:
ls
你应该在输出中看到 cert.pem,以及预先生成的文件。
ca-key.pem ca.pem cert.pem private.pem
查看证书详情
在这一步中,你将检查刚刚创建的自签名证书的内容。这能让你以人类可读的格式验证其详细信息并理解其结构。
我们将使用 openssl x509 命令,该命令专为查看和操作证书文件而设计。
-in cert.pem: 指定输入证书文件。-text: 以文本格式打印完整的证书详情。-noout: 防止命令打印证书的编码版本。
执行以下命令来查看 cert.pem 的详情:
openssl x509 -in cert.pem -text -noout
输出内容会很长,请滚动查看并注意以下关键字段:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, ST = California, L = Mountain View, O = MyOrg, CN = example.com
Validity
Not Before: ...
Not After : ...
Subject: C = US, ST = California, L = Mountain View, O = MyOrg, CN = example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
...
请注意,Issuer(颁发者)和 Subject(主体)字段是相同的。这是自签名证书的明确特征。
生成证书签名请求 (CSR)
在这一步中,你将生成一个证书签名请求(Certificate Signing Request, CSR)。CSR 是一段包含你的公钥和身份信息的编码文本块。你将 CSR 发送给证书颁发机构(Certificate Authority, CA)以请求一个签名的数字证书。
我们将再次使用 openssl req 命令,但这次不带 -x509 选项,这样它就会生成一个 CSR 而不是自签名证书。
-new: 表示一个新的请求。-key private.pem: 使用你现有的私钥。-out csr.pem: 指定 CSR 的输出文件名。-subj "...": 为你请求的证书提供身份信息。
运行以下命令为虚构的 Web 应用生成一个 CSR:
openssl req -new -key private.pem -out csr.pem -subj "/C=US/ST=New York/L=New York City/O=MyWebApp/CN=webapp.example.com"
此命令将创建一个名为 csr.pem 的新文件。你可以使用 ls 命令验证其创建情况:
ls
你现在将在你的项目目录中看到 csr.pem。
ca-key.pem ca.pem cert.pem csr.pem private.pem
此 CSR 现在已准备好发送给 CA 进行签名。
签名 CSR
在最后这一步中,你将扮演证书颁发机构(CA)的角色,对你在上一步中创建的 CSR 进行签名。为此,你的环境中已经预先生成了一个简单的 CA 证书(ca.pem)及其对应的私钥(ca-key.pem)。
我们将使用 openssl x509 -req 命令来处理 CSR 并颁发新证书。
-req: 指定我们正在处理一个 CSR。-in csr.pem: 输入的 CSR 文件。-CA ca.pem: 用于签名的 CA 证书。-CAkey ca-key.pem: 用于签名的 CA 私钥。-out signed-cert.pem: 新签名证书的输出文件。-days 365: 设置有效期为 365 天。-CAcreateserial: 创建并管理一个序列号文件(ca.srl),CA 跟踪已颁发的证书需要此文件。
执行以下命令对 CSR 进行签名:
openssl x509 -req -in csr.pem -CA ca.pem -CAkey ca-key.pem -out signed-cert.pem -days 365 -CAcreateserial
你将看到确认签名成功的输出:
Certificate request self-signature ok
subject=C = US, ST = New York, L = New York City, O = MyWebApp, CN = webapp.example.com
现在,列出文件,你将看到新创建的证书 signed-cert.pem 和序列号文件 ca.srl。
ls
ca-key.pem ca.pem ca.srl cert.pem csr.pem private.pem signed-cert.pem
你可以使用 openssl x509 -in signed-cert.pem -text -noout 来检查这个新证书。你会注意到 Issuer(颁发者)现在是 CA(CN=myca.com),而 Subject(主体)是你 CSR 中的身份信息(CN=webapp.example.com)。
总结
在这个实验(Lab)中,你使用 openssl 工具获得了关于 X.509 证书基本生命周期的实践经验。
你已成功学习了如何:
- 理解 X.509 证书的核心组件以及自签名证书的概念。
- 使用
openssl req创建一个适用于开发和测试的自签名证书。 - 使用
openssl x509检查证书的详细信息以验证其内容。 - 生成证书签名请求(CSR),以便正式向 CA 请求证书。
- 扮演一个简单的证书颁发机构(CA),对 CSR 进行签名并颁发一个新的、有效的证书。
这些技能对于任何从事系统管理、网络安全或软件开发的人员来说都至关重要,它们为你管理各种应用中的安全通信奠定了基础。



