密码学中生成 X.509 证书

LinuxBeginner
立即练习

介绍

在这个实验中,你将探索创建和管理 X.509 证书的实际方面,这是现代数字安全的一个基石。X.509 证书是数字文档,它将公钥绑定到一个身份(identity),例如个人或服务器,并且是保护 Web 流量的 TLS/SSL 等协议的基础。

你将使用强大的 openssl 命令行工具,学习如何执行基本的证书管理任务。你将从理解证书的结构开始,然后为开发目的创建一个自签名证书(self-signed certificate)。接着,你将生成一个证书签名请求(Certificate Signing Request, CSR),并充当一个简单的证书颁发机构(Certificate Authority, CA)来对其进行签名,从而在你的系统内部生成一个受信任的证书。

到本实验结束时,你将对证书生命周期有一个扎实、亲手的理解。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

X.509 证书概述

在这一步中,我们将介绍 X.509 证书背后的基本理论。这里没有需要执行的命令;本节内容旨在让你在开始动手操作任务之前有所了解。

X.509 证书是一种标准化的数字文档,其中包含建立信任所需的重要信息。其主要组成部分包括:

  • 主体 (Subject):证书持有者的身份(例如,一个人,或像 www.example.com 这样的服务器名称)。
  • 颁发者 (Issuer):验证身份并签署证书的实体(即证书颁发机构或 CA)。
  • 公钥 (Public Key):与主体私钥相对应的公钥。
  • 有效期 (Validity Period):证书有效的日期范围(Not BeforeNot 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 进行签名并颁发一个新的、有效的证书。

这些技能对于任何从事系统管理、网络安全或软件开发的人员来说都至关重要,它们为你管理各种应用中的安全通信奠定了基础。