如何在 Ubuntu 22.04 上设置和配置证书颁发机构
介绍
证书颁发机构 (CA) 是负责颁发数字证书以在互联网上验证身份的实体。尽管公共 CA 是验证提供给公众的网站和其他服务的身份的流行选择,但私有 CA 通常用于封闭组和私人服务。
构建私有证书颁发机构将使您能够配置、测试和运行需要在客户端和服务器之间进行加密连接的程序。使用私有 CA,您可以为基础架构中的用户、服务器或单个程序和服务颁发证书。
OpenVPN 是 Linux 上使用自己的私有 CA 的一些程序示例-04) 和 Puppet 。您还可以将 Web 服务器配置为使用私有 CA 颁发的证书,以使开发和登台环境与使用 TLS 加密连接的生产服务器相匹配。
在本指南中,您将在 Ubuntu 22.04 服务器上设置私有证书颁发机构,然后使用您的新 CA 生成并签署测试证书。您还将学习如何将 CA 服务器的公共证书导入操作系统的证书存储区,以便验证 CA 与远程服务器或用户之间的信任链。最后,您将学习如何吊销证书并分发证书吊销列表,以确保只有授权用户和系统才能使用依赖于您的 CA 的服务。
先决条件
要完成本教程,您需要访问 Ubuntu 22.04 服务器来托管您的 CA 服务器。在开始本指南之前,您需要配置具有 sudo 权限的非 root 用户。您可以按照我们的 Ubuntu 22.04 初始服务器设置指南 设置具有适当权限的用户。链接的教程还将设置一个防火墙,假定在本指南中已到位。
在本教程中,此服务器将被称为 CA 服务器。
确保 CA 服务器是独立系统。它仅用于导入、签署和撤销证书请求。它不应该运行任何其他服务,理想情况下,它会在您不主动使用 CA 时处于脱机状态或完全关闭。
注意: 如果您想了解有关签署和撤销证书的知识,本教程的最后一部分是可选的。如果您选择完成这些练习步骤,您将需要第二台 Ubuntu 22.04 服务器,或者您也可以使用自己的本地 Linux 计算机运行 Ubuntu 或 Debian,或从其中任何一个派生的发行版。
步骤 1 — 安装 Easy-RSA
本教程的第一个任务是在 CA 服务器上安装 easy-rsa 脚本集。 easy-rsa 是一个证书颁发机构管理工具,您将使用它来生成私钥和公共根证书,然后您将使用它来签署来自依赖于您的 CA 的客户端和服务器的请求。
以您在初始设置步骤中创建的非 root sudo 用户身份登录到您的 CA 服务器并运行以下命令:
sudo apt 更新
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 初始化-pki
输出init-pki完成;您现在可以创建 CA 或请求。
您新创建的 PKI 目录是:/home/sammy/easy-rsa/pki
完成本节后,您将拥有一个目录,其中包含创建证书颁发机构所需的所有文件。在下一部分中,您将为您的 CA 创建私钥和公共证书。
步骤 3 — 创建证书颁发机构
在创建 CA 的私钥和证书之前,您需要创建一个名为“vars”的文件并使用一些默认值填充。首先,您将 cd 进入 easy-rsa 目录,然后使用 nano 或您喜欢的文本编辑器创建和编辑 vars 文件:
cd ~/easy-rsa
纳米年
打开文件后,粘贴以下行并编辑每个突出显示的值以反映您自己的组织信息。这里的重要部分是确保您不要将任何值留空:
~/easy-rsa/varsset_var EASYRSA_REQ_COUNTRY "美国"
set_var EASYRSA_REQ_PROVINCE "纽约"
set_var EASYRSA_REQ_CITY "纽约市"
set_var EASYRSA_REQ_ORG "DigitalOcean"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "社区"
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 接受默认名称。
输出。 . .
输入新的 CA 密钥密码:
重新输入新的 CA 密钥密码:
. . .
通用名称(例如:您的用户、主机或服务器名称)[Easy-RSA CA]:
CA 创建完成,您现在可以导入和签署证书请求。
您用于发布的新 CA 证书文件位于:
/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文件应该仅在您的 CA 机器上,并且理想情况下,您的 CA 机器应该在不签署证书请求时保持离线作为额外的安全措施。
这样,您的 CA 就到位了,它可以用于签署证书请求和吊销证书。
第 4 步 — 分发证书颁发机构的公共证书
现在您的 CA 已配置好并准备好充当您想要配置为使用它的任何系统的信任根。您可以将 CA 的证书添加到您的 OpenVPN 服务器、Web 服务器、邮件服务器等。任何需要验证网络中其他用户或服务器身份的用户或服务器都应将“ca.crt”文件的副本导入其操作系统的证书存储区。
要将 CA 的公共证书导入第二个 Linux 系统(如另一台服务器或本地计算机),请首先从您的 CA 服务器获取“ca.crt”文件的副本。您可以使用 cat 命令在终端中输出它,然后将其复制并粘贴到正在导入证书的第二台计算机上的文件中。您还可以使用 scp、rsync 等工具在系统之间传输文件。但是,我们将在此步骤中使用带有“nano”的复制和粘贴,因为它适用于所有系统。
作为 CA 服务器上的非 root 用户,运行以下命令:
猫 ~/easy-rsa/pki/ca.crt
您的终端中将有类似于以下内容的输出:
输出-----开始证书-----
MIIDSzCCAjOgAwIBAgIUcR9Crsv3FBEujrPZnZnU4nSb5TMwDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAwMzE4MDMxNjI2WhcNMzAw
. . .
. . .
-----结束证书-----
复制所有内容,包括 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 行和破折号。
在您的第二个 Linux 系统上,使用 nano 或您喜欢的文本编辑器打开一个名为 /tmp/ca.crt 的文件:
纳米/tmp/ca.crt
将您刚刚从 CA 服务器复制的内容粘贴到编辑器中。完成后,保存并关闭文件。如果您使用的是 nano,可以按 CTRL+X,然后按 Y 和 ENTER 确认。
现在您已经在第二个 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/
须藤更新-CA-信任
现在您的第二个 Linux 系统将信任任何已由 CA 服务器签名的证书。
注意: 如果您将 CA 与 Web 服务器一起使用并使用 Firefox 作为浏览器,则需要将公共 ca.crt 证书直接导入 Firefox。 Firefox 不使用本地操作系统的证书存储。有关如何将 CA 的证书添加到 Firefox 的详细信息,请参阅 Mozilla 关于 [在 Firefox 中设置证书颁发机构 (CA)] 的支持文章 (https://support.mozilla.org/en-US/kb/setting-certificate -当局-火狐)。
如果您使用 CA 与 Windows 环境或台式计算机集成,请参阅有关如何使用 certutil.exe 安装 CA 证书 的文档/windows-server/administration/windows-commands/certutil#-installcert)。
如果您将本教程用作另一个教程的先决条件,或者熟悉如何签署和撤销证书,您可以在此处停止。如果您想了解有关如何签署和撤销证书的更多信息,那么以下可选部分将详细解释每个过程。
##(可选)- 创建证书签名请求和吊销证书
本教程的以下部分是可选的。如果您已完成前面的所有步骤,那么您就拥有了一个完全配置且正常工作的证书颁发机构,您可以将其用作其他教程的先决条件。您可以导入 CA 的“ca.crt”文件并验证网络中已由 CA 签名的证书。
如果您想练习并了解有关如何签署证书请求以及如何撤销证书的更多信息,那么这些可选部分将解释这两个过程是如何工作的。
###(可选)- 创建和签署实践证书请求
现在您已经准备好使用 CA,您可以练习生成私钥和证书请求以熟悉签名和分发过程。
证书签名请求 (CSR) 由三部分组成:公钥、有关请求系统的标识信息和请求本身的签名,即使用请求方的私钥创建。私钥将被保密,并将用于加密任何拥有签名公共证书的人都可以解密的信息。
以下步骤将在您的第二个 Ubuntu 或 Debian 系统或从其中任何一个派生的发行版上运行。它可以是另一台远程服务器,也可以是本地 Linux 机器,如笔记本电脑或台式电脑。由于 easy-rsa 并非默认在所有系统上都可用,我们将使用 openssl 工具来创建练习私钥和证书。
openssl 通常默认安装在大多数 Linux 发行版上,但为了确定,请在您的系统上运行以下命令:
sudo apt 更新
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
输出。 . .
-----
国家名称(2 个字母代码)[XX]:US
州或省名称(全名)[]:纽约
地区名称(例如,城市)[默认城市]:纽约市
组织名称(例如,公司)[默认公司有限公司]:DigitalOcean
组织单位名称(例如,部分)[]:社区
通用名称(例如,您的姓名或服务器的主机名)[]:sammy-server
电子邮件地址 []:
请输入以下“额外”属性
与您的证书请求一起发送
一个挑战密码[]:
可选的公司名称 []:
如果您想将这些值作为 openssl 调用的一部分而不是通过交互式提示自动添加,可以将 -subj 参数传递给 OpenSSL。请务必编辑突出显示的值以匹配您的练习位置、组织和服务器名称:
openssl req -new -key sammy-server.key -out server.req -subj \
/Cu003dUS/STu003dNew\York/Lu003dNew\York\City/Ou003dDigitalOcean/OUu003dCommunity/CNu003dsammy-server
要验证 CSR 的内容,您可以使用 openssl 读取请求文件并检查其中的字段:
openssl req -in sammy-server.req -noout -subject
Outputsubjectu003dC u003d 美国,ST u003d 纽约,L u003d 纽约市,O u003d DigitalOcean,OU u003d 社区,CN u003d sammy-server
对练习证书请求的主题感到满意后,使用 scp 将 sammy-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 实用程序使事情变得更容易,而不是像我们在前面的例子。
签署虚构 CSR 的第一步是使用“easy-rsa”脚本导入证书请求:
cd ~/easy-rsa
./easyrsa import-req /tmp/sammy-server.req sammy-server
输出。 . .
请求已成功导入,短名称为:sammy-server
您现在可以使用此名称对此请求执行签名操作。
现在您可以通过运行带有 sign-req 选项的 easyrsa 脚本来签署请求,然后是请求类型和 CSR 中包含的通用名称。请求类型可以是 client、server 或 ca 之一。由于我们正在使用虚拟服务器的证书进行练习,因此请务必使用“服务器”请求类型:
./easyrsa sign-req 服务器 sammy-server
在输出中,您将被要求验证请求是否来自受信任的来源。输入 yes 然后按 ENTER 确认:
输出您即将签署以下证书。
请检查下面显示的详细信息以确保准确性。注意这个请求
尚未经过密码验证。请确保它来自受信任的
来源或您已与发件人验证请求校验和。
请求主题,作为服务器证书签署 825 天:
主题u003d
国名 u003d 美国
stateOrProvinceName u003d 纽约
localityName u003d 纽约市
组织名称 u003d DigitalOcean
组织单位名称 u003d 社区
commonName u003d sammy-server
键入单词“yes”继续,或任何其他输入中止。
确认请求详细信息:是
. . .
如果您加密了 CA 密钥,此时将提示您输入密码。
您将收到如下输出:
输出检查请求是否匹配签名
签名ok
主题的可分辨名称如下
countryName :PRINTABLE:'US'
stateOrProvinceName :ASN.1 12:'纽约'
localityName :ASN.1 12:'纽约市'
组织名称:ASN.1 12:'DigitalOcean'
组织单位名称:ASN.1 12:'社区'
commonName :ASN.1 12:'sammy-server'
证书将在 2024 年 7 月 21 日 13:59:08 GMT(825 天)之前获得认证
用 1 个新条目写出数据库
数据库更新
证书创建于:/home/sammy/easy-rsa/pki/issued/sammy-server.crt
完成这些步骤后,您已经使用 CA 服务器在 /home/sammy/easy-rsa/pki/private/ca.key 中的私钥签署了 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、配置管理工具、数据库系统或用于客户端身份验证目的。
###(可选)- 吊销证书
有时,您可能需要撤销证书以防止用户或服务器使用它。可能有人的笔记本电脑被盗,网络服务器遭到破坏,或者员工或承包商离开了您的组织。
要撤销证书,一般流程遵循以下步骤:
-
使用
./easyrsa revoke client_name命令撤销证书。 -
使用
./easyrsa gen-crl命令生成新的 CRL。 -
将更新后的
crl.pem文件传输到依赖于 CA 的服务器或服务器,然后在这些系统上将其复制到引用它的程序所需的一个或多个目录。 -
重新启动任何使用您的 CA 和 CRL 文件的服务。
您可以使用此流程随时撤销您之前颁发的任何证书。我们将在接下来的部分中详细介绍每个步骤,从 revoke 命令开始。
吊销证书
要撤销证书,请导航到 CA 服务器上的 easy-rsa 目录:
cd ~/easy-rsa
接下来,使用 revoke 选项运行 easyrsa 脚本,后跟要撤消的客户端名称。按照上面的实践示例,证书的通用名称是 sammy-server:
./easyrsa 撤销 sammy-server
这将要求您通过输入“是”来确认撤销:
输出 请确认您希望撤销具有以下主题的证书:
主题u003d
commonName u003d sammy-server
键入单词“yes”继续,或任何其他输入中止。
继续撤销:是
. . .
吊销证书 8348B3F146A765581946040D5C4D590A
. . .
请注意“撤销证书”行上突出显示的值。此值是被吊销的证书的唯一序列号。如果您想在本节的最后一步检查吊销列表以验证证书是否在其中,您将需要此值。
确认操作后,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
输出序列号:8348B3F146A765581946040D5C4D590A
撤销日期:格林威治标准时间 2022 年 4 月 18 日 14:00:37
请注意 grep 命令如何用于检查您在撤销步骤中记下的唯一序列号。现在,您可以在依赖它来限制对用户和服务的访问的任何系统上验证证书吊销列表的内容。
结论
在本教程中,您在独立的 Ubuntu 22.04 服务器上使用 Easy-RSA 包创建了一个私有证书颁发机构。您探索了信任模型如何在依赖 CA 的各方之间工作。您还为练习服务器创建并签署了证书签名请求 (CSR),然后学习了如何吊销证书。最后,您学习了如何为依赖 CA 的任何系统生成和分发证书撤销列表 (CRL),以确保阻止不应访问服务的用户或服务器这样做。
现在,您可以为用户颁发证书并将其与 OpenVPN 等服务一起使用。您还可以使用 CA 配置开发和登台 Web 服务器并使用证书来保护您的非生产环境。在开发过程中使用带有 TLS 证书的 CA 有助于确保您的代码和环境尽可能地匹配您的生产环境。
如果您想了解有关如何使用 OpenSSL 的更多信息,我们的 [OpenSSL Essentials:使用 SSL 证书、私钥和 CSR](https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with -ssl-certificates-private-keys-and-csrs) 教程包含大量附加信息,可帮助您更加熟悉 OpenSSL 基础知识。
更多推荐




所有评论(0)