如何在 Debian 11 上设置和配置证书颁发机构 (CA)
介绍
证书颁发机构 (CA) 是负责颁发数字证书以验证 Internet 上的身份的实体。尽管公共 CA 是验证网站身份和提供给公众的其他服务的流行选择,但私有 CA 通常用于封闭组和私有服务。
构建私有证书颁发机构将使您能够配置、测试和运行需要在客户端和服务器之间建立加密连接的程序。使用私有 CA,您可以为基础设施中的用户、服务器或单个程序和服务颁发证书。
Puppet 是 Linux 上使用自己的私有 CA 的一些程序示例。您还可以将 Web 服务器配置为使用私有 CA 颁发的证书,以使开发和暂存环境与使用 TLS 加密连接的生产服务器相匹配。
在本指南中,您将在 Debian 11 服务器上设置私有证书颁发机构,并使用新 CA 生成并签署测试证书。您还将 CA 服务器的公共证书导入操作系统的证书存储区,以便您可以验证 CA 与远程服务器或用户之间的信任链。最后,您将撤销证书并分发证书撤销列表 (CRL) 以确保只有授权用户和系统才能使用依赖于您的 CA 的服务。
先决条件
要完成本教程,您需要:
- 一台 Debian 11 服务器作为您的专用 CA 服务器。它将仅用于导入、签署和撤销证书请求。不要使用承载公共服务的预先存在的服务器。理想情况下,您的 CA 服务器在不使用时应该关闭或离线,这样它的私钥就不会那么容易受到损害。
- 具有
sudo
权限的非根用户。按照我们的 Debian 11 初始服务器设置指南进行设置。链接的教程还将设置一个防火墙,假定该防火墙在整个指南中都已就位。
注意:如果您想了解签署和撤销证书,本教程的最后一部分是可选的。如果您选择完成这些练习步骤,您将需要第二台 Debian 11 服务器,或者您也可以使用您自己的本地 Linux 计算机运行 Debian 或 Ubuntu,或从其中任何一个派生的发行版。
第 1 步 — 安装 Easy-RSA
本教程的第一个任务是在您的 CA 服务器上安装 easy-rsa
实用程序。 Easy-RSA 是一种证书颁发机构管理工具,您将使用它来生成私钥和公共根证书,然后您将使用它们来签署来自依赖您的 CA 的客户端和服务器的请求。
以您在初始设置步骤中创建的非根 sudo 用户身份登录到您的 CA 服务器并运行以下命令:
- sudo apt update
- sudo apt install easy-rsa
系统将提示您下载并安装该软件包。按 y
确认您要安装该软件包。
此时,您已设置好所需的一切并准备好使用 Easy-RSA。在下一步中,您将创建一个公钥基础结构,然后开始构建您的证书颁发机构。
第 2 步 — 准备公钥基础结构目录
现在您已经安装了 easy-rsa
,是时候在 CA 服务器上创建骨架公钥基础设施 (PKI) 了。确保您仍然以非根用户身份登录并创建一个 easy-rsa
目录。确保您不使用 sudo 运行以下任何命令,因为您的普通用户应该在没有提升权限的情况下管理 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,然后按 Y 和 ENTER 进行确认。您现在已准备好构建您的 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 的用户和服务器都需要有一份该文件的副本。各方将依靠公共证书来确保没有人冒充系统并执行中间人攻击。 <李> ca.key
是 CA 用来为服务器和客户端签署证书的私钥。如果攻击者获得了对您的 CA 的访问权限,进而获得了您的 ca.key
文件,您将需要破坏您的 CA。这就是为什么您的 ca.key
文件应该只在您的 CA 机器上,以及为什么理想情况下,您的 CA 机器在不签署证书请求时应该保持离线作为额外的安全措施。 这样,您的 CA 就位并准备好用于签署证书请求和吊销证书。
第 4 步 — 分发证书颁发机构的公共证书
现在您的 CA 已配置并准备好充当您要配置为使用它的任何系统的信任根。您可以将 CA 的证书添加到您的 OpenVPN 服务器、Web 服务器、邮件服务器等。任何需要验证网络中其他用户或服务器身份的用户或服务器都应将 ca.crt
文件的副本导入到其操作系统的证书存储中。
要将 CA 的公共证书导入第二个 Linux 系统(如另一台服务器或本地计算机),请首先从您的 CA 服务器获取 ca.crt
文件的副本。您可以使用 cat
命令在终端中输出它,然后将其复制并粘贴到正在导入证书的第二台计算机上的文件中。您还可以使用 scp
或 rsync
等工具在系统之间传输文件。我们将在这一步中使用 nano
进行复制和粘贴,因为它适用于所有系统。
作为 CA 服务器上的非根用户,运行以下命令:
- 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
,然后按 Y
和 ENTER
进行确认.
现在您在第二个 Linux 系统上有了 ca.crt
文件的副本,是时候将该证书导入其操作系统证书存储区了。
在基于 Debian 和 Ubuntu 的系统上,运行以下命令以导入证书:
- sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/
- sudo update-ca-certificates
update-ca-certificates
脚本,位于 /usr/sbin/update-ca-certificates
在以后的 Debian 和 Ubuntu 系统上,可能不在您用户的 中路径
。将 /usr/sbin
添加到您的 PATH
或只运行 /usr/sbin/update-ca-certificates
。
要在基于 CentOS、Fedora 或 RedHat 的系统上导入 CA 服务器的证书,请将文件内容复制并粘贴到系统中,就像前面示例中名为 /tmp/ca.crt
的文件中一样.接下来,将证书复制到 /etc/pki/ca-trust/source/anchors/
,然后运行 update-ca-trust
命令。
- 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 证书的文档。
如果您将本教程用作其他教程的先决条件,或者熟悉如何签署和吊销证书,则可以到此为止。如果您想了解更多关于如何签署和撤销证书的信息,那么以下可选部分将详细解释每个过程。
第 5 步 — 创建证书签名请求和吊销证书(可选)
本教程的以下部分是可选的。如果您已完成前面的所有步骤,那么您将拥有一个完全配置且有效的证书颁发机构,您可以将其用作其他教程的先决条件。您可以导入 CA 的 ca.crt
文件并验证网络中已由您的 CA 签名的证书。
如果您想练习并了解有关如何签署证书请求以及如何吊销证书的更多信息,那么这些可选部分将解释这两个过程的工作原理。
第 6 步 — 创建并签署实践证书请求(可选)
现在您已准备好使用 CA,您可以练习生成私钥和证书请求以熟悉签名和分发过程。
证书签名请求 (CSR) 由三部分组成:公钥、有关请求系统的标识信息以及使用请求方的私钥创建的请求本身的签名。私钥将保密,并将用于加密信息,任何拥有签名公共证书的人都可以解密。
以下步骤将在运行 Debian、Ubuntu 或从其中任何一个派生的发行版的第二个 Linux 系统上运行。它可以是另一台远程服务器或本地 Linux 机器,如笔记本电脑或台式电脑。由于 easy-rsa
在所有系统上默认不可用,我们将使用 openssl
工具来创建一个实践私钥和证书。
openssl
通常默认安装在大多数 Linux 发行版上,但为了确定,请在您的系统上运行以下命令:
- sudo apt update
- sudo apt install openssl
当系统提示您安装 openssl
时,按 y
继续安装步骤。这可能会升级您的 OpenSSL 库,并且系统可能会提示您重新启动某些使用旧 OpenSSL 库的服务。如果您愿意,请选择确定以重新启动这些服务。
现在您已准备好使用 openssl
创建实践 CSR。
创建 CSR 需要完成的第一步是生成私钥。要使用 openssl
创建私钥,请创建一个 practice-csr
目录,然后在其中生成一个密钥。我们将向名为 sammy-server
的虚构服务器发出此请求,而不是创建用于识别用户或其他 CA 的证书。
- mkdir ~/practice-csr
- cd ~/practice-csr
- openssl genrsa -out sammy-server.key
OutputGenerating RSA private key, 2048 bit long modulus (2 primes)
. . .
. . .
e is 65537 (0x010001)
现在您有了私钥,您可以创建相应的 CSR,再次使用 openssl
实用程序。系统将提示您填写多个字段,例如国家、州和城市。如果您想将字段留空,可以输入 .
,但请注意,如果这是真正的 CSR,最好使用适合您所在位置和组织的正确值。但是,不要将公用名 (CN) 留空,因为此字段是必需的,如果没有它,您的 CA 将无法签署证书:
- 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
一旦您对实践证书请求的主题感到满意,请使用 scp
将 sammy-server.req
文件复制到您的 CA 服务器:
- scp sammy-server.req sammy@your_ca_server_ip:/tmp/sammy-server.req
在此步骤中,您为名为 sammy-server
的虚构服务器生成了证书签名请求。在真实场景中,请求可能来自需要 TLS 证书进行测试的暂存或开发 Web 服务器;或者它可能来自请求证书的 OpenVPN 服务器,以便用户可以连接到 VPN。在下一步中,我们将继续使用 CA 服务器的私钥对证书签名请求进行签名。
第 7 步 — 签署 CSR(可选)
在上一步中,您为虚构服务器创建了实践证书请求和密钥。您将它复制到您的 CA 服务器上的 /tmp
目录,模拟如果您有真实的客户端或服务器向您发送需要签名的 CSR 请求时您将使用的过程。
继续虚构的场景,现在 CA Server 需要导入实践证书并对其进行签名。一旦证书请求被 CA 验证并转发回服务器,信任证书颁发机构的客户端也将能够信任新颁发的证书。
由于我们将在可使用 easy-rsa
实用程序的 CA 的 PKI 中操作,因此签名步骤将使用 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 中包含的通用名称。请求类型可以是 client
、server
或 ca
之一。由于我们正在使用虚构服务器的证书进行练习,因此请务必使用 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 3650 days:
subject=
commonName = sammy-server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
. . .
Certificate created at: /home/sammy/easy-rsa/pki/issued/sammy-server.crt
如果您加密了 CA 密钥,此时系统会提示您输入密码。
完成这些步骤后,您已使用 /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.crt
和 ca.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、配置管理工具、数据库系统或用于客户端身份验证目的。
第 8 步 — 撤销证书(可选)
有时,您可能需要撤销证书以防止用户或服务器使用它。也许某人的笔记本电脑被盗,Web 服务器被破坏,或者员工或承包商离开了您的组织。
要吊销证书,一般过程遵循以下步骤:
- 使用
./easyrsa revoke client_name
命令吊销证书。 - 使用
./easyrsa gen-crl
命令生成新的 CRL。 - 将更新后的
crl.pem
文件传输到依赖您的 CA 的一个或多个服务器,并在这些系统上将其复制到引用它的程序所需的一个或多个目录。 - 重新启动所有使用您的 CA 和 CRL 文件的服务。
您可以使用此过程随时撤销您之前颁发的任何证书。我们将在以下部分详细介绍每个步骤,从 revoke
命令开始。
吊销证书
要撤销证书,请导航到 CA 服务器上的 easy-rsa
目录:
- cd ~/easy-rsa
接下来,运行带有 revoke
选项的 easyrsa
脚本,后跟要撤销的客户端名称。按照上面的实践例子,证书的Common Name是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,但配置这些方法超出了本文的范围。
确保您以非根用户身份登录到您的 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 1 20:48:02 2020 GMT
请注意 grep
命令是如何用于检查您在撤销步骤中记下的唯一序列号的。现在,您可以在任何依赖它来限制对用户和服务的访问的系统上验证证书吊销列表的内容。
结论
在本教程中,您在独立的 Debian 11 服务器上使用 Easy-RSA 包创建了一个私有证书颁发机构。您了解了信任模型如何在依赖 CA 的各方之间工作。您还为练习服务器创建并签署了证书签名请求 (CSR),然后吊销了证书。最后,您为任何依赖您的 CA 的系统生成并分发了证书吊销列表 (CRL),以确保阻止不应访问服务的用户或服务器这样做。
现在您可以为用户颁发证书并将它们用于 OpenVPN 等服务。您还可以使用您的 CA 使用证书配置开发和暂存 Web 服务器,以保护您的非生产环境。在开发过程中使用带有 TLS 证书的 CA 有助于确保您的代码和环境与您的生产环境尽可能匹配。
如果您想了解有关如何使用 OpenSSL 的更多信息,我们的 OpenSSL Essentials:使用 SSL 证书、私钥和 CSR 教程提供了大量其他信息,可帮助您更加熟悉 OpenSSL 基础知识。