介绍
一个证书颁发机构(CA)负责发放数字证书来验证在互联网上的身份的实体。尽管公共 CA 是验证网站身份和提供给公众的其他服务的流行选择,但私有 CA 通常用于封闭组和私有服务。
构建私有证书颁发机构将使您能够配置、测试和运行需要在客户端和服务器之间进行加密连接的程序。借助私有 CA,您可以为基础架构中的用户、服务器或单个程序和服务颁发证书。
Linux 上使用自己私有 CA 的一些程序示例是OpenVPN和Puppet。您还可以将 Web 服务器配置为使用由私有 CA 颁发的证书,以便使开发和登台环境与使用 TLS 加密连接的生产服务器相匹配。
在本指南中,我们将学习如何在 Debian 10 服务器上设置私有证书颁发机构,以及如何使用您的新 CA 生成和签署测试证书。您还将学习如何将 CA 服务器的公共证书导入操作系统的证书库,以便验证 CA 与远程服务器或用户之间的信任链。最后,您将学习如何吊销证书并分发证书吊销列表,以确保只有授权用户和系统才能使用依赖于您的 CA 的服务。
先决条件
要完成本教程,您需要访问 Debian 10 服务器来托管您的 CA 服务器。在开始本指南之前,您需要为非root用户配置sudo
特权。您可以按照我们的Debian 10 初始服务器设置指南来设置具有适当权限的用户。链接的教程还将设置防火墙,本指南中假定该防火墙已就位。
此服务器将在本教程中称为CA 服务器。
确保 CA 服务器是独立系统。它仅用于导入、签署和撤销证书请求。它不应运行任何其他服务,理想情况下,当您不主动使用 CA 时,它将处于脱机状态或完全关闭。
注意:如果您想了解签名和吊销证书,本教程的最后一部分是可选的。如果您选择完成这些练习步骤,您将需要第二台 Debian 10 服务器,或者您也可以使用您自己的本地 Linux 计算机运行 Debian 或 Ubuntu,或从其中任何一个派生的发行版。
步骤 1 — 安装 Easy-RSA
本教程中的第一个任务是easy-rsa
在您的 CA 服务器上安装脚本集。easy-rsa
是一个证书颁发机构管理工具,您将使用它来生成私钥和公共根证书,然后您将使用这些证书对来自依赖于您的 CA 的客户端和服务器的请求进行签名。
以您在初始设置步骤中创建的非 root sudo 用户身份登录到您的 CA 服务器并运行以下命令:
- sudo apt update
- sudo apt install easy-rsa
系统将提示您下载该软件包并进行安装。按y
确认您要安装该软件包。
此时,您已完成设置并准备好使用 Easy-RSA。在下一步中,您将创建一个公钥基础设施,然后开始构建您的证书颁发机构。
步骤 2 — 准备公钥基础设施目录
现在您已经安装了easy-rsa
,是时候在 CA 服务器上创建一个骨架公钥基础设施(PKI)。确保您仍然以非 root 用户身份登录并创建一个easy-rsa
目录。确保您没有使用 sudo运行以下任何命令,因为您的普通用户应该在没有提升权限的情况下管理 CA 并与 CA 交互。
- mkdir ~/easy-rsa
这将easy-rsa
在您的主文件夹中创建一个名为的新目录。我们将使用此目录创建指向easy-rsa
我们在上一步中安装的包文件的符号链接。这些文件位于/usr/share/easy-rsa
CA 服务器上的文件夹中。
使用以下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
目录,然后您将vars
使用nano
或您喜欢的文本编辑器创建和编辑文件:
- 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 "[email protected]"
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 交互时都提示输入密码,您可以运行build-ca
带有nopass
选项的命令,如下所示:
- ./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.crt
从 CA 服务器获取文件的副本。您可以使用该cat
命令在终端中输出它,然后将其复制并粘贴到正在导入证书的第二台计算机上的文件中。您也可以用这样的工具scp
,rsync
来传输文件系统之间。但是,我们将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
、Y
和ENTER
来确认。
现在您ca.crt
在第二个 Linux 系统上拥有该文件的副本,是时候将该证书导入其操作系统证书存储区了。
在基于 Debian 和 Ubuntu 的系统上,运行以下命令以导入证书:
- cp /tmp/ca.crt /usr/local/share/ca-certificates/
- 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/
- update-ca-trust
现在,您的第二个 Linux 系统将信任已由 CA 服务器签名的任何证书。
注意:如果您将 CA 与 Web 服务器一起使用并使用 Firefox 作为浏览器,则需要将公共ca.crt
证书直接导入 Firefox。Firefox 不使用本地操作系统的证书存储。有关如何将 CA 证书添加到 Firefox 的详细信息,请参阅 Mozilla 的这篇关于在 Firefox 中设置证书颁发机构 (CA) 的支持文章。
如果您使用 CA 与 Windows 环境或台式计算机集成,请参阅有关如何使用certutil.exe
安装 CA 证书的文档。
如果您将本教程用作其他教程的先决条件,或者熟悉如何签署和撤销证书,您可以到此为止。如果您想了解有关如何签署和撤销证书的更多信息,那么以下可选部分将详细解释每个过程。
(可选)— 创建证书签名请求和吊销证书
本教程的以下部分是可选的。如果您已完成所有前面的步骤,那么您就有了一个完全配置且有效的证书颁发机构,您可以将其用作其他教程的先决条件。您可以导入您的 CAca.crt
文件并验证您的网络中已由您的 CA 签署的证书。
如果您想练习并了解有关如何签署证书请求以及如何撤销证书的更多信息,那么这些可选部分将解释这两个过程的工作原理。
(可选)— 创建和签署实践证书请求
现在您已准备好使用 CA,您可以练习生成私钥和证书请求,以熟悉签名和分发过程。
一个证书签名请求(CSR)由三个部分组成:一个公开密钥,识别关于请求的系统信息,并请求本身,它是使用请求方的私有密钥创建的签名。私钥将保密,并将用于加密任何拥有签名公共证书的人都可以解密的信息。
以下步骤将在您的第二个 Linux 系统 Debian、Ubuntu 或派生自其中任何一个的发行版上运行。它可以是另一台远程服务器,也可以是本地 Linux 机器,如笔记本电脑或台式计算机。由于easy-rsa
并非在所有系统上都默认可用,我们将使用该openssl
工具来创建练习私钥和证书。
openssl
大多数 Linux 发行版上通常默认安装,但为了确定,请在您的系统上运行以下命令:
- sudo apt update
- sudo apt install openssl
当系统提示您安装时,openssl
输入y
以继续安装步骤。现在您已准备好使用openssl
.
创建 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)
现在您有了私钥,您可以再次使用该openssl
实用程序创建相应的 CSR 。系统将提示您填写多个字段,如国家、州和城市。.
如果您想将字段留空,您可以输入 a ,但请注意,如果这是一个真正的 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
一旦您对实践证书请求的主题感到满意,请sammy-server.req
使用scp
以下命令将该文件复制到您的 CA 服务器:
- scp sammy-server.req sammy@your_ca_server_ip:/tmp/sammy-server.req
在此步骤中,您为名为 的虚构服务器生成了证书签名请求sammy-server
。在实际场景中,请求可能来自需要 TLS 证书进行测试的临时或开发 Web 服务器;或者它可能来自请求证书的 OpenVPN 服务器,以便用户可以连接到 VPN。在下一步中,我们将继续使用 CA 服务器的私钥对证书签名请求进行签名。
(可选)— 签署 CSR
在上一步中,您为虚构的服务器创建了练习证书请求和密钥。您将其复制到/tmp
CA 服务器上的目录中,模拟如果您有真实的客户端或服务器向您发送需要签名的 CSR 请求时将使用的过程。
继续虚构场景,现在 CA 服务器需要导入实践证书并对其进行签名。一旦证书请求由 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.
现在,您可以通过运行easyrsa
带有sign-req
选项的脚本来签署请求,后跟请求类型和包含在 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 密钥,此时系统会提示您输入密码。
完成这些步骤后,您已经sammy-server.req
使用 CA 服务器的私钥对CSR 进行了签名/home/sammy/easy-rsa/pki/private/ca.key
。生成的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
命令开始。
吊销证书
要撤销证书,请导航到easy-rsa
CA 服务器上的目录:
- cd ~/easy-rsa
接下来,运行easyrsa
带有revoke
选项的脚本,后跟要撤销的客户端名称。按照上面的练习示例,证书的通用名称是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 的已撤销证书的更新列表。
接下来crl.pem
,每次运行gen-crl
命令时,您都需要将更新的文件传输到依赖此 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 文件,例如确认已撤销证书的列表,openssl
请easy-rsa
在 CA 服务器上的目录中使用以下命令:
- 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 10 服务器上使用 Easy-RSA 软件包创建了一个私有证书颁发机构。您了解了信任模型在依赖 CA 的各方之间是如何工作的。您还为练习服务器创建并签署了证书签名请求 (CSR),然后学习了如何撤销证书。最后,您学习了如何为依赖 CA 的任何系统生成和分发证书吊销列表 (CRL),以确保阻止不应访问服务的用户或服务器这样做。
现在,您可以为用户颁发证书并将其用于 OpenVPN 等服务。您还可以使用您的 CA 配置带有证书的开发和临时 Web 服务器,以保护您的非生产环境。在开发过程中使用带有 TLS 证书的 CA 有助于确保您的代码和环境尽可能匹配您的生产环境。
如果您想了解有关如何使用 OpenSSL 的更多信息,我们的OpenSSL Essentials:使用 SSL 证书、私钥和 CSR教程提供了大量附加信息,可帮助您更加熟悉 OpenSSL 基础知识。