如何在Ubuntu22.04上设置和配置证书颁发机构

来自菜鸟教程
跳转至:导航、​搜索

介绍

证书颁发机构 (CA) 是负责颁发数字证书以验证互联网身份的实体。 尽管公共 CA 是验证提供给公众的网站和其他服务的身份的流行选择,但私有 CA 通常用于封闭组和私人服务。

构建私有证书颁发机构将使您能够配置、测试和运行需要在客户端和服务器之间进行加密连接的程序。 使用私有 CA,您可以为基础架构中的用户、服务器或单个程序和服务颁发证书。

Linux 上使用自己的私有 CA 的程序的一些示例是 OpenVPNPuppet 。 您还可以将 Web 服务器配置为使用私有 CA 颁发的证书,以使开发和登台环境与使用 TLS 加密连接的生产服务器相匹配。

在本指南中,您将在 Ubuntu 22.04 服务器上设置私有证书颁发机构,然后使用您的新 CA 生成并签署测试证书。 您还将学习如何将 CA 服务器的公共证书导入操作系统的证书存储区,以便验证 CA 与远程服务器或用户之间的信任链。 最后,您将学习如何吊销证书并分发证书吊销列表,以确保只有授权用户和系统才能使用依赖于您的 CA 的服务。

先决条件

要完成本教程,您需要访问 Ubuntu 22.04 服务器来托管您的 CA 服务器。 在开始本指南之前,您需要配置具有 sudo 权限的非 root 用户。 您可以按照我们的 Ubuntu 22.04 初始服务器设置指南 设置具有适当权限的用户。 链接的教程还将设置一个 防火墙 ,假定在本指南中都已到位。

在本教程中,此服务器将被称为 CA Server

确保 CA 服务器是独立系统。 它仅用于导入、签署和撤销证书请求。 它不应该运行任何其他服务,理想情况下,它会在您不主动使用 CA 时处于脱机状态或完全关闭。

注意: 如果您想了解签名和撤销证书,本教程的最后一部分是可选的。 如果您选择完成这些练习步骤,您将需要第二台 Ubuntu 22.04 服务器,或者您也可以使用自己的本地 Linux 计算机运行 Ubuntu 或 Debian,或从其中任何一个派生的发行版。


第 1 步 — 安装 Easy-RSA

本教程中的第一个任务是在您的 CA 服务器上安装 easy-rsa 脚本集。 easy-rsa 是一个证书颁发机构管理工具,您将使用它来生成私钥和公共根证书,然后您将使用它来签署来自依赖您的 CA 的客户端和服务器的请求。

以您在初始设置步骤中创建的非 root sudo 用户身份登录到您的 CA 服务器并运行以下命令:

sudo apt update
sudo apt install easy-rsa

系统将提示您下载软件包并安装它。 按 y 确认您要安装该软件包。

至此,您已经准备好使用 Easy-RSA 所需的一切。 在下一步中,您将创建一个公钥基础设施,然后开始构建您的证书颁发机构。

第 2 步 — 准备公钥基础设施目录

现在您已经安装了 easy-rsa,是时候在 CA 服务器上创建一个骨架 Public Key Infrastructure (PKI)。 确保您仍然以非 root 用户身份登录并创建一个 easy-rsa 目录。 确保您 不使用 sudo 运行以下任何命令,因为您的普通用户应该在没有提升权限的情况下管理 CA 并与 CA 交互。

mkdir ~/easy-rsa

这将在您的主文件夹中创建一个名为 easy-rsa 的新目录。 我们将使用此目录创建指向我们在上一步中安装的 easy-rsa 包文件的符号链接。 这些文件位于 CA 服务器上的 /usr/share/easy-rsa 文件夹中。

使用 ln 命令创建符号链接:

ln -s /usr/share/easy-rsa/* ~/easy-rsa/

注意: 虽然其他指南可能会指示您将 easy-rsa 包文件复制到 PKI 目录中,但本教程采用符号链接方法。 因此,对 easy-rsa 包的任何更新都将自动反映在您的 PKI 脚本中。


要限制对新 PKI 目录的访问,请确保只有所有者才能使用 chmod 命令访问它:

chmod 700 /home/sammy/easy-rsa

最后,在 easy-rsa 目录中初始化 PKI:

cd ~/easy-rsa
./easyrsa init-pki
Outputinit-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/sammy/easy-rsa/pki

完成本节后,您将拥有一个目录,其中包含创建证书颁发机构所需的所有文件。 在下一部分中,您将为您的 CA 创建私钥和公共证书。

第 3 步 — 创建证书颁发机构

在创建 CA 的私钥和证书之前,您需要使用一些默认值创建并填充名为 vars 的文件。 首先您将 cd 进入 easy-rsa 目录,然后您将使用 nano 或您喜欢的文本编辑器创建和编辑 vars 文件:

cd ~/easy-rsa
nano vars

打开文件后,粘贴以下行并编辑每个突出显示的值以反映您自己的组织信息。 这里的重要部分是确保您不要将任何值留空:

~/easy-rsa/varsset_var EASYRSA_REQ_COUNTRY    "US"
set_var EASYRSA_REQ_PROVINCE   "NewYork"
set_var EASYRSA_REQ_CITY       "New York City"
set_var EASYRSA_REQ_ORG        "DigitalOcean"
set_var EASYRSA_REQ_EMAIL      "admin@example.com"
set_var EASYRSA_REQ_OU         "Community"
set_var EASYRSA_ALGO           "ec"
set_var EASYRSA_DIGEST         "sha512"

完成后,保存并关闭文件。 如果您使用的是 nano,您可以按 CTRL+X,然后按 YENTER 确认。 您现在已准备好构建您的 CA。

要为您的证书颁发机构创建根公钥和私钥对,请再次运行 ./easy-rsa 命令,这次使用 build-ca 选项:

./easyrsa build-ca

在输出中,您将看到一些关于 OpenSSL 版本的行,并且系统将提示您输入密钥对的密码。 请务必选择一个强大的密码,并将其记在安全的地方。 您需要在需要与 CA 交互的任何时候输入密码,例如签署或撤销证书。

您还将被要求确认您的 CA 的通用名称 (CN)。 CN 是用于在证书颁发机构的上下文中指代此机器的名称。 您可以为 CA 的通用名称输入任何字符串,但为简单起见,请按 ENTER 接受默认名称。

Output. . .
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
. . .
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/sammy/easy-rsa/pki/ca.crt

注意: 如果不想每次与 CA 交互时都提示输入密码,可以运行带有 nopass 选项的 build-ca 命令,例如这:

./easyrsa build-ca nopass

您现在有两个重要文件 - ~/easy-rsa/pki/ca.crt~/easy-rsa/pki/private/ca.key - 它们构成了证书颁发机构的公共和私有组件。

  • ca.crt 是 CA 的公共证书文件。 用户、服务器和客户端将使用此证书来验证他们是否属于同一信任网络。 使用您的 CA 的每个用户和服务器都需要拥有此文件的副本。 各方将依靠公共证书来确保没有人冒充系统并执行 Man-in-the-middle 攻击
  • ca.key 是 CA 用来为服务器和客户端签署证书的私钥。 如果攻击者可以访问您的 CA,进而访问您的 ca.key 文件,您将需要销毁您的 CA。 这就是为什么您的 ca.key 文件应该 only 位于您的 CA 机器上,并且理想情况下,您的 CA 机器应该在不签署证书请求时保持离线作为额外的安全措施。

这样,您的 CA 就到位了,它可以用于签署证书请求和吊销证书。

第 4 步 — 分发您的证书颁发机构的公共证书

现在您的 CA 已配置好并准备好充当您想要配置为使用它的任何系统的信任根。 您可以将 CA 的证书添加到您的 OpenVPN 服务器、Web 服务器、邮件服务器等。 任何需要验证网络中其他用户或服务器身份的用户或服务器都应将 ca.crt 文件的副本导入到其操作系统的证书存储中。

要将 CA 的公共证书导入第二个 Linux 系统(如另一台服务器或本地计算机),请首先从您的 CA 服务器获取 ca.crt 文件的副本。 您可以使用 cat 命令将其输出到终端中,然后将其复制并粘贴到正在导入证书的第二台计算机上的文件中。 您还可以使用 scprsync 等工具在系统之间传输文件。 但是,我们将在此步骤中使用带有 nano 的复制和粘贴,因为它适用于所有系统。

作为 CA 服务器上的非 root 用户,运行以下命令:

cat ~/easy-rsa/pki/ca.crt

您的终端中将有类似于以下内容的输出:

Output-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUcR9Crsv3FBEujrPZnZnU4nSb5TMwDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAwMzE4MDMxNjI2WhcNMzAw
. . .
. . .
-----END CERTIFICATE-----

复制所有内容,包括 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 线和破折号。

在您的第二个 Linux 系统上,使用 nano 或您喜欢的文本编辑器打开一个名为 /tmp/ca.crt 的文件:

nano /tmp/ca.crt

将您刚刚从 CA 服务器复制的内容粘贴到编辑器中。 完成后,保存并关闭文件。 如果您使用的是 nano,您可以按 CTRL+X,然后按 YENTER 确认。

现在您在第二个 Linux 系统上拥有了 ca.crt 文件的副本,是时候将证书导入其操作系统证书存储区了。

在基于 Ubuntu 和 Debian 的系统上,以非 root 用户身份运行以下命令来导入证书:

Ubuntu 和 Debian 派生发行版

sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

要在基于 CentOS、Fedora 或 RedHat 的系统上导入 CA 服务器的证书,请将文件内容复制并粘贴到系统上,就像前面示例中名为 /tmp/ca.crt 的文件中一样。 接下来,您将证书复制到 /etc/pki/ca-trust/source/anchors/,然后运行 update-ca-trust 命令。

CentOS、Fedora、RedHat 发行版

sudo cp /tmp/ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust

现在您的第二个 Linux 系统将信任任何已由 CA 服务器签名的证书。

注意: 如果您将 CA 与 Web 服务器一起使用并使用 Firefox 作为浏览器,则需要将公共 ca.crt 证书直接导入 Firefox。 Firefox 不使用本地操作系统的证书存储。 有关如何将 CA 证书添加到 Firefox 的详细信息,请参阅 Mozilla 的这篇支持文章 在 Firefox 中设置证书颁发机构 (CA)。

如果您使用 CA 与 Windows 环境或台式计算机集成,请参阅文档了解如何使用 certutil.exe 安装 CA 证书


如果您将本教程用作另一个教程的先决条件,或者熟悉如何签署和撤销证书,您可以在此处停止。 如果您想了解有关如何签署和撤销证书的更多信息,那么以下可选部分将详细解释每个过程。

(可选)- 创建证书签名请求和吊销证书

本教程的以下部分是可选的。 如果您已完成前面的所有步骤,那么您就拥有了一个完全配置且正常工作的证书颁发机构,您可以将其用作其他教程的先决条件。 您可以导入 CA 的 ca.crt 文件并验证网络中已由 CA 签名的证书。

如果您想练习和了解有关如何签署证书请求以及如何撤销证书的更多信息,那么这些可选部分将解释这两个过程是如何工作的。

(可选)- 创建和签署实践证书请求

现在您已经准备好使用 CA,您可以练习生成私钥和证书请求以熟悉签名和分发过程。

证书签名请求 (CSR) 由三部分组成:公钥、请求系统的识别信息和请求本身的签名,该签名使用请求方的私钥创建。 私钥将被保密,并将用于加密任何拥有签名公共证书的人都可以解密的信息。

以下步骤将在您的第二个 Ubuntu 或 Debian 系统或从其中任何一个派生的发行版上运行。 它可以是另一台远程服务器,也可以是本地 Linux 机器,如笔记本电脑或台式电脑。 由于 easy-rsa 并非默认在所有系统上都可用,我们将使用 openssl 工具来创建练习私钥和证书。

openssl 通常默认安装在大多数 Linux 发行版上,但为了确定,请在您的系统上运行以下命令:

sudo apt update
sudo apt install openssl

当系统提示您安装 openssl 时,输入 y 以继续安装步骤。 现在您已准备好使用 openssl 创建练习 CSR。

创建 CSR 需要完成的第一步是生成私钥。 要使用 openssl 创建私钥,请创建一个 practice-csr 目录,然后在其中生成一个密钥。 我们将为一个名为 sammy-server 的虚构服务器发出此请求,而不是创建用于识别用户或其他 CA 的证书。

mkdir ~/practice-csr
cd ~/practice-csr
openssl genrsa -out sammy-server.key

现在您有了私钥,您可以再次使用 openssl 实用程序创建相应的 CSR。 系统将提示您填写多个字段,例如国家、州和城市。 如果您想将某个字段留空,您可以输入 .,但请注意,如果这是真正的 CSR,最好为您的位置和组织使用正确的值:

openssl req -new -key sammy-server.key -out sammy-server.req
Output. . .
-----
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:New York
Locality Name (eg, city) [Default City]:New York City
Organization Name (eg, company) [Default Company Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:Community
Common Name (eg, your name or your server's hostname) []:sammy-server
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

如果您想将这些值作为 openssl 调用的一部分而不是通过交互式提示自动添加,您可以将 -subj 参数传递给 OpenSSL。 请务必编辑突出显示的值以匹配您的练习位置、组织和服务器名称:

openssl req -new -key sammy-server.key -out server.req -subj \
/C=US/ST=New\ York/L=New\ York\ City/O=DigitalOcean/OU=Community/CN=sammy-server

要验证 CSR 的内容,您可以使用 openssl 读取请求文件并检查其中的字段:

openssl req -in sammy-server.req -noout -subject
Outputsubject=C = US, ST = New York, L = New York City, O = DigitalOcean, OU = Community, CN = sammy-server

一旦您对练习证书请求的主题感到满意,请使用 scpsammy-server.req 文件复制到您的 CA 服务器:

scp sammy-server.req sammy@your_ca_server_ip:/tmp/sammy-server.req

在此步骤中,您为名为 sammy-server 的虚构服务器生成了证书签名请求。 在实际场景中,请求可能来自需要 TLS 证书进行测试的登台或开发 Web 服务器; 或者它可能来自请求证书以便用户可以连接到 VPN 的 OpenVPN 服务器。 在下一步中,我们将继续使用 CA 服务器的私钥对证书签名请求进行签名。

(可选)- 签署 CSR

在上一步中,您为虚拟服务器创建了练习证书请求和密钥。 您将其复制到 CA 服务器上的 /tmp 目录,模拟如果您有真实的客户端或服务器向您发送需要签名的 CSR 请求时您将使用的过程。

继续虚构场景,现在 CA 服务器需要导入实践证书并对其进行签名。 一旦证书请求由 CA 验证并转发回服务器,信任证书颁发机构的客户端也将能够信任新颁发的证书。

由于我们将在 CA 的 PKI 中进行操作,其中 easy-rsa 实用程序可用,因此签名步骤将使用 easy-rsa 实用程序来简化操作,而不是使用 openssl就像我们在前面的例子中一样。

签署虚构 CSR 的第一步是使用 easy-rsa 脚本导入证书请求:

cd ~/easy-rsa
./easyrsa import-req /tmp/sammy-server.req sammy-server
Output. . .
The request has been successfully imported with a short name of: sammy-server
You may now use this name to perform signing operations on this request.

现在,您可以通过运行带有 sign-req 选项的 easyrsa 脚本来签署请求,然后是请求类型和 CSR 中包含的通用名称。 请求类型可以是 clientserverca 之一。 由于我们正在使用虚拟服务器的证书进行练习,因此请务必使用 server 请求类型:

./easyrsa sign-req server sammy-server

在输出中,系统会要求您验证请求是否来自受信任的来源。 输入 yes 然后按 ENTER 确认:

OutputYou are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    countryName               = US
    stateOrProvinceName       = New York
    localityName              = New York City
    organizationName          = DigitalOcean
    organizationalUnitName    = Community
    commonName                = sammy-server


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
. . .

如果您加密了 CA 密钥,此时将提示您输入密码。

您将收到如下输出:

OutputCheck that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'US'
stateOrProvinceName   :ASN.1 12:'New York'
localityName          :ASN.1 12:'New York City'
organizationName      :ASN.1 12:'DigitalOcean'
organizationalUnitName:ASN.1 12:'Community'
commonName            :ASN.1 12:'sammy-server'
Certificate is to be certified until Jul 21 13:59:08 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/sammy/easy-rsa/pki/issued/sammy-server.crt

完成这些步骤后,您已使用 /home/sammy/easy-rsa/pki/private/ca.key 中的 CA 服务器私钥签署了 sammy-server.req CSR。 生成的 sammy-server.crt 文件包含练习服务器的公共加密密钥,以及来自 CA 服务器的新签名。 签名的目的是告诉任何信任 CA 的人他们也可以信任 sammy-server 证书。

如果此请求是针对 Web 服务器或 VPN 服务器等真实服务器的,CA 服务器上的最后一步是将新的 sammy-server.crtca.crt 文件从 CA 服务器分发到远程发出 CSR 请求的服务器:

scp pki/issued/sammy-server.crt sammy@your_server_ip:/tmp
scp pki/ca.crt sammy@your_server_ip:/tmp

此时,您将能够将颁发的证书用于 Web 服务器、VPN、配置管理工具、数据库系统或用于客户端身份验证目的。

(可选)- 吊销证书

有时,您可能需要撤销证书以防止用户或服务器使用它。 可能某人的笔记本电脑被盗、Web 服务器遭到破坏,或者员工或承包商离开了您的组织。

要撤销证书,一般流程遵循以下步骤:

  1. 使用 ./easyrsa revoke client_name 命令撤销证书。
  2. 使用 ./easyrsa gen-crl 命令生成新的 CRL。
  3. 将更新后的 crl.pem 文件传输到依赖于您的 CA 的服务器或服务器,然后在这些系统上将其复制到引用它的程序所需的一个或多个目录。
  4. 重新启动任何使用您的 CA 和 CRL 文件的服务。

您可以使用此过程随时撤销您之前颁发的任何证书。 我们将在以下部分详细介绍每个步骤,从 revoke 命令开始。

吊销证书

要撤销证书,请导航到 CA 服务器上的 easy-rsa 目录:

cd ~/easy-rsa

接下来,使用 revoke 选项运行 easyrsa 脚本,后跟要撤销的客户端名称。 按照上面的实践例子,证书的通用名称是sammy-server

./easyrsa revoke sammy-server

这将要求您通过输入 yes 来确认撤销:

OutputPlease confirm you wish to revoke the certificate with the following subject:

subject=
    commonName                = sammy-server


Type the word 'yes' to continue, or any other input to abort.
  Continue with revocation: yes
. . .
Revoking Certificate 8348B3F146A765581946040D5C4D590A
. . .

请注意 Revoking Certificate 行上突出显示的值。 此值是被吊销的证书的唯一序列号。 如果您想在本节的最后一步检查吊销列表以验证证书是否在其中,您将需要此值。

确认操作后,CA 将吊销证书。 但是,依赖 CA 的远程系统无法检查是否有任何证书已被吊销。 在 CA 的证书撤销列表 (CRL) 分发到依赖 CA 的所有系统之前,用户和服务器仍然可以使用该证书。

在下一步中,您将生成 CRL 或更新现有的 crl.pem 文件。

生成证书吊销列表

既然您已经吊销了一个证书,那么更新您的 CA 服务器上的吊销证书列表就很重要了。 获得更新的吊销列表后,您将能够知道哪些用户和系统在您的 CA 中拥有有效证书。

要生成 CRL,请在 ~/easy-rsa 目录中运行带有 gen-crl 选项的 easy-rsa 命令:

./easyrsa gen-crl

如果您在创建 ca.key 文件时使用了密码,系统将提示您输入密码。 gen-crl 命令将生成一个名为 crl.pem 的文件,其中包含该 CA 的已撤销证书的更新列表。

接下来,您需要在每次运行 gen-crl 命令时将更新的 crl.pem 文件传输到依赖此 CA 的所有服务器和客户端。 否则,客户端和系统仍然能够访问使用您的 CA 的服务和系统,因为这些服务需要了解证书的撤销状态。

转移证书吊销列表

现在您已经在 CA 服务器上生成了一个 CRL,您需要将它传输到依赖于您的 CA 的远程系统。 要将此文件传输到您的服务器,您可以使用 scp 命令。

注意: 本教程介绍如何手动生成和分发 CRL。 虽然有更强大和自动化的方法来分发和检查撤销列表,如 OCSP-Stapling,但配置这些方法超出了本文的范围。


确保您以非 root 用户身份登录到 CA 服务器并运行以下命令,用您自己的服务器 IP 或 DNS 名称代替 your_server_ip

scp ~/easy-rsa/pki/crl.pem sammy@your_server_ip:/tmp

现在该文件位于远程系统上,最后一步是使用吊销列表的新副本更新任何服务。

更新支持 CRL 的服务

列出更新使用 crl.pem 文件的服务所需的步骤超出了本教程的范围。 通常,您需要将 crl.pem 文件复制到服务预期的位置,然后使用 systemctl 重新启动它。

使用新的 crl.pem 文件更新服务后,您的服务将能够拒绝来自使用已撤销证书的客户端或服务器的连接。

检查和验证 CRL 的内容

如果您想检查 CRL 文件,例如确认已撤销证书的列表,请在 CA 服务器上的 easy-rsa 目录中使用以下 openssl 命令:

cd ~/easy-rsa
openssl crl -in pki/crl.pem -noout -text

您还可以在安装了 openssl 工具和 crl.pem 文件副本的任何服务器或系统上运行此命令。 例如,如果您将 crl.pem 文件传输到您的第二个系统,并且想要验证 sammy-server 证书是否已被吊销,您可以使用如下所示的 openssl 命令代替您之前在吊销证书时记下的序列号,而不是此处突出显示的序列号:

openssl crl -in /tmp/crl.pem -noout -text |grep -A 1 8348B3F146A765581946040D5C4D590A
Output    Serial Number: 8348B3F146A765581946040D5C4D590A
        Revocation Date: Apr 18 14:00:37 2022 GMT

请注意 grep 命令如何用于检查您在撤销步骤中记下的唯一序列号。 现在,您可以在依赖它来限制对用户和服务的访问的任何系统上验证证书吊销列表的内容。

结论

在本教程中,您在独立的 Ubuntu 22.04 服务器上使用 Easy-RSA 包创建了一个私有证书颁发机构。 您探索了信任模型如何在依赖 CA 的各方之间工作。 您还为练习服务器创建并签署了证书签名请求 (CSR),然后学习了如何吊销证书。 最后,您学习了如何为依赖 CA 的任何系统生成和分发证书撤销列表 (CRL),以确保阻止不应访问服务的用户或服务器这样做。

现在,您可以为用户颁发证书并将其与 OpenVPN 等服务一起使用。 您还可以使用 CA 配置开发和登台 Web 服务器并使用证书来保护您的非生产环境。 在开发过程中使用带有 TLS 证书的 CA 有助于确保您的代码和环境尽可能地匹配您的生产环境。

如果您想了解有关如何使用 OpenSSL 的更多信息,我们的 OpenSSL Essentials: Working with SSL Certificates, Private Keys and CSRs 教程包含大量附加信息,可帮助您更加熟悉 OpenSSL 基础知识。