在Debian 11上设置和配置证书颁发机构(CA)的方法
引言
证书颁发机构(CA)是负责向互联网上的实体发放数字证书以验证身份的机构。虽然公共CA是验证面向公众提供的网站和其他服务身份的一种流行选择,但私有CA通常用于闭合群体和私有服务。
建立一个私有的证书机构将使您能够配置、测试和运行需要客户端和服务器之间加密连接的程序。通过私有的证书机构,您可以为用户、服务器或基础设施内的单个程序和服务颁发证书。
一些在Linux上使用自己私有CA的程序例子包括OpenVPN和Puppet。您还可以配置您的Web服务器,使用由私有CA颁发的证书,以使开发和预发布环境与使用TLS加密连接的生产服务器相匹配。
在这个指南中,您将在Debian 11服务器上设置一个私有证书颁发机构,并使用您的新CA生成和签署一个测试证书。您还将把CA服务器的公共证书导入到操作系统的证书存储中,以便您能够验证CA与远程服务器或用户之间的信任链。最后,您将注销一个证书,并分发一个证书吊销列表(CRL),以确保只有授权的用户和系统可以使用依赖于您的CA的服务。
先决条件
完成这个教程,你需要:
- A Debian 11 server to be your dedicated CA server. It will only be used to import, sign, and revoke certificate requests. Do not use a pre-existing server that hosts public services. Ideally, your CA server should be shut down or offline when not in use so that its private key is not so vulnerable to compromise.
- A non-root user with sudo privileges. Follow our Debian 11 Initial Server Setup guide to set that up. The linked tutorial will also set up a firewall, which is assumed to be in place throughout this guide.
Note
第一步 – 安装 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服务器上创建一个公钥基础设施(PKI)的框架了。确保你还以非root用户登录,并创建一个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/
Note
为了限制对你的新PKI目录的访问,确保只有所有者可以使用chmod命令访问它。
- chmod 700 /home/sammy/easy-rsa
最后,在easy-rsa目录中初始化PKI。
- cd ~/easy-rsa
- ./easyrsa init-pki
init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/sammy/easy-rsa/pki
完成本节后,您将拥有包含创建证书机构所需的所有文件的目录。在下一节中,您将为您的证书机构生成私钥和公共证书。
第三步——创建证书机构
在创建CA的私钥和证书之前,您需要创建并填充一个名为vars的文件,其中包含一些默认值。首先,您将进入easy-rsa目录,然后使用nano或您喜欢的文本编辑器创建和编辑vars文件。
- cd ~/easy-rsa
- nano vars
一旦打开文件,粘贴以下行,并编辑每个高亮值以反映您自己的组织信息。这里的重要部分是确保不留下任何空值。
set_var EASYRSA_REQ_COUNTRY “US” set_var EASYRSA_REQ_PROVINCE “NewYork” set_var EASYRSA_REQ_CITY “New York City” set_var EASYRSA_REQ_ORG “Silicon Cloud” 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再按下回车键来确认。现在你已经准备好构建你的CA了。
为了为您的证书颁发机构创建根公钥和私钥对,再次运行./easy-rsa命令,这次使用build-ca选项。
- ./easyrsa build-ca
在输出中,您将看到一些关于OpenSSL版本的行,并将提示您为密钥对输入一个密码短语。务必选择一个强密码短语,并在安全的地方记下来。每当您需要与您的CA交互时,例如签署或撤销证书,您都需要输入该密码短语。
您还将被要求确认您的CA(证书颁发机构)的通用名称(CN)。在证书颁发机构的环境中,CN是用于指代这台机器的名称。您可以输入任意字符串作为CA的通用名称,但为了简单起见,请按ENTER键接受默认名称。
. . . 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
Note
./easyrsa build-ca nopass
你现在有两个重要文件 — ~/easy-rsa/pki/ca.crt 和 ~/easy-rsa/pki/private/ca.key — 它们组成了证书颁发机构的公共和私有部分。
- ca.crt is the CA’s public certificate file. Users, servers, and clients will use this certificate to verify that they are part of the same web of trust. Every user and server that uses your CA will need to have a copy of this file. All parties will rely on the public certificate to ensure that someone is not impersonating a system and performing a Man-in-the-middle attack.
- ca.key is the private key that the CA uses to sign certificates for servers and clients. If an attacker gains access to your CA and, in turn, your ca.key file, you will need to destroy your CA. This is why your ca.key file should only be on your CA machine and why, ideally, your CA machine should be kept offline when not signing certificate requests as an extra security measure.
这样一来,您的CA已经设置好并可以用于签署证书请求和吊销证书。
第四步 – 分发您的证书颁发机构的公开证书
现在您的证书颁发机构(CA)已经配置完毕,并且可以作为其他系统的可信任根证书。您可以将该CA的证书添加到您的OpenVPN服务器、Web服务器、邮件服务器等等。任何需要验证网络中其他用户或服务器身份的用户或服务器,都应该将ca.crt文件导入其操作系统的证书存储中。
将CA的公共证书导入到第二个Linux系统(如另一个服务器或本地计算机)中,首先从您的CA服务器获取ca.crt文件副本。您可以使用cat命令在终端输出它,然后将其复制粘贴到导入证书的第二台计算机上的文件中。您还可以使用scp或rsync等工具在系统之间传输文件。在此步骤中,我们将使用nano并进行复制粘贴,因为它适用于所有系统。
在CA服务器上作为非root用户运行以下命令。
- cat ~/easy-rsa/pki/ca.crt
你的终端会输出类似以下的结果。
—–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
位于后来的Debian和Ubuntu系统上的/usr/sbin/update-ca-certificates的更新证书脚本可能不在您用户的$PATH中。要么将/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服务器签名的证书。
Note
如果你正在使用你的CA与Windows环境或桌面计算机集成,请查阅相关文档以了解如何使用certutil.exe安装CA证书。
如果你将这个教程作为另一个教程的前提条件,或者你已经熟悉如何签署和撤销证书,你可以在这里停止。如果你想要了解更多关于如何签署和撤销证书的内容,那么以下的可选部分将详细解释每个步骤。
第五步-创建证书签名请求和撤销证书(可选)
如果您已经完成了所有前面的步骤,那么教程中的以下部分是可选的。您现在已经完全配置好并正常运行的证书授权机构,可以作为其他教程的先决条件。您可以导入您CA的ca.crt文件,并验证您网络中由您的CA签名的证书。
如果你想要练习并学习更多关于如何签署证书请求以及如何撤销证书的内容,那么以下的可选章节将会解释这两个过程是如何工作的。
步骤6 – 创建并签署一个实践证书申请(可选)
现在你已经准备好使用CA了,你可以练习生成私钥和证书请求,熟悉签名和分发过程。
证书签名请求(CSR)由三个部分组成:公钥、有关请求系统的身份信息以及请求本身的签名,该签名是使用请求方的私钥创建的。私钥将保密,并用于加密任何拥有已签名公共证书的人可以解密的信息。
以下步骤将在您的第二个运行Debian、Ubuntu或从它们任何一个衍生出来的发行版的Linux系统上运行。它可以是另一个远程服务器,也可以是一个本地的Linux机器,比如笔记本电脑或台式电脑。由于不是所有系统默认都有easy-rsa,我们将使用openssl工具来创建一个演练用的私钥和证书。
通常情况下,大多数Linux发行版都会默认安装OpenSSL,但为了确保,请在您的系统上运行以下命令。
- 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
Generating RSA private key, 2048 bit long modulus (2 primes) . . . . . . e is 65537 (0x010001)
既然您已经拥有了私钥,您可以使用openssl工具创建相应的CSR。您将会被要求填写一些字段,比如国家、省份和城市。如果您想留某个字段为空,可以输入 . 但请注意,如果这是一个真实的CSR,最好是使用与您所在地和组织相对应的正确值。然而,请不要将“通用名称(CN)”留空,因为这是必填字段,如果没有填写,您的CA将无法对证书进行签名。
- openssl req -new -key sammy-server.key -out sammy-server.req
. . . —– 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]:Silicon Cloud 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=Silicon Cloud/OU=Community/CN=sammy-server
要验证CSR的内容,您可以使用openssl读取请求文件并检查其内部的字段。
- openssl req -in sammy-server.req -noout -subject
subject=C = US, ST = New York, L = New York City, O = Silicon Cloud, 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证书;或者可能来自请求证书以便用户可以连接到VPN的OpenVPN服务器。在下一步中,我们将使用CA服务器的私钥对证书签名请求进行签名。
步骤7 – 签署CSR(可选)
在之前的步骤中,您创建了一个虚构服务器的实践证书请求和密钥。您将其复制到CA服务器上的/tmp目录中,模拟出当真正的客户端或服务器向您发送需要签名的CSR请求时,您会使用的流程。
继续设想的情景,现在CA服务器需要导入并签署练习证书。一旦证书请求经CA验证并返回服务器,信任证书颁发机构的客户端也将能够信任新颁发的证书。
由于我们将在CA的PKI内进行操作,因此签名步骤将使用easy-rsa工具来简化操作,而不像之前的示例中直接使用openssl。
签署虚拟的CSR的第一步是使用easy-rsa脚本导入证书请求。
- cd ~/easy-rsa
- ./easyrsa import-req /tmp/sammy-server.req sammy-server
. . . 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中的公共名称。请求类型可以是客户端、服务器或者CA之一。由于我们正在使用一个虚构的服务器证书进行练习,请确保使用服务器请求类型。
- ./easyrsa sign-req server sammy-server
在输出中,您将被要求验证请求来自可信任的来源。输入是则按回车键确认。
You 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 密钥进行了加密,此时会提示您输入密码。
完成这些步骤后,您使用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、配置管理工具、数据库系统或客户端身份验证等进行配合使用。
第8步 — 撤销证书(可选)
偶尔,您可能需要吊销证书以防止用户或服务器使用它。也许有人的笔记本电脑被盗,网络服务器被入侵,或者一个员工或承包商已经离开了您的组织。
撤销证书的一般流程如下所示:
-
- 使用./easyrsa revoke client_name命令吊销证书。
-
- 使用./easyrsa gen-crl命令生成新的证书撤销列表(CRL)。
-
- 将更新后的crl.pem文件传输到依赖您的证书颁发机构(CA)的服务器或服务器,并将其复制到程序所需的目录或目录上。
- 重新启动使用您的CA和CRL文件的任何服务。
您可以随时使用此流程撤销之前发行的任何证书。我们将在接下来的章节中逐步详细介绍每个步骤,从撤销命令开始。
撤销证书
要撤销证书,请在您的CA服务器上导航到easy-rsa目录。
- cd ~/easy-rsa
接下来,使用easyrsa脚本运行回收选项,然后输入要回收的客户端名称。根据上面的示例,证书的通用名称是sammy-server。
- ./easyrsa revoke sammy-server
这将要求您通过输入“是”来确认撤销。
Please 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 . . .
请注意吊销证书行上的突出显示的数值。此数值是被吊销证书的唯一序列号。如果您想在本节最后一步中检查吊销列表,以确认该证书是否在其中,您将需要这个数值。
在确认操作后,CA将吊销证书。然而,依赖于CA的远程系统无法检查是否有证书被吊销。用户和服务器仍然可以使用证书,直到CA的证书吊销列表(CRL)被分发给所有依赖于该CA的系统。
在接下来的步骤中,您将生成一个 CRL 或更新现有的 crl.pem 文件。
生成一个证书吊销列表
现在你已经吊销了一个证书,重要的是要在你的CA服务器上更新被吊销证书的列表。一旦你有了更新的吊销清单,你就能知道哪些用户和系统在你的CA中拥有有效证书。
要生成证书吊销列表(CRL),在~/easy-rsa目录中运行easy-rsa命令并使用gen-crl选项。
- ./easyrsa gen-crl
如果在创建ca.key文件时使用了密码短语,您将被提示输入该密码短语。gen-crl命令将生成一个名为crl.pem的文件,其中包含该CA撤销的证书的更新列表。
接下来,每次运行gen-crl命令时,您需要将更新的crl.pem文件传输给依赖于此CA的所有服务器和客户端。否则,客户端和系统仍然能够访问使用您的CA的服务和系统,因为这些服务需要了解证书的吊销状态。
转移证书吊销清单
现在您已经在您的 CA 服务器上生成了一个 CRL,您需要将其传输到依赖于您的 CA 的远程系统上。要将此文件传输到您的服务器上,您可以使用 scp 命令。
Note
确保您以非root用户登录到您的CA服务器,并运行以下命令,将您的服务器IP或DNS名称替换为your_server_ip。
- scp ~/easy-rsa/pki/crl.pem sammy@your_server_ip:/tmp
既然文件已经发送到远程系统上,最后一步就是使用新的吊销列表副本更新所有的服务。
更新支持证书撤销列表的服务。
本教程不涵盖列出使用crl.pem文件更新服务所需的步骤。一般情况下,您需要将crl.pem文件复制到服务所指定的位置,然后使用systemctl重新启动服务。
一旦您使用新的crl.pem文件更新了您的服务,您的服务将能够拒绝来自使用已废止证书的客户端或服务器的连接。
检查和验证证书撤销列表的内容
如果您想要检查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
Serial Number: 8348B3F146A765581946040D5C4D590A Revocation Date: Apr 1 20:48:02 2020 GMT
请注意grep命令如何用于检查您在吊销步骤中记录的唯一序列号。现在,您可以验证证书吊销列表的内容,以便于任何依赖该列表限制用户和服务访问权限的系统。
结论
在本教程中,您在独立的Debian 11服务器上使用Easy-RSA软件包创建了一个私有的证书颁发机构。您学习了依赖于该机构的各方之间的信任模型的工作原理。您还创建并签署了用于实践服务器的证书签名请求(CSR),并撤销了一份证书。最后,您生成并分发了一个证书吊销列表(CRL),以确保依赖于您的证书颁发机构的任何系统都可以防止未经授权的用户或服务器访问服务。
现在您可以为用户发布证书,并使用OpenVPN等服务。您还可以使用您的CA为开发和暂存Web服务器配置证书,以保护非生产环境。在开发过程中使用CA和TLS证书可以帮助确保您的代码和环境与生产环境尽可能相匹配。
如果你想学习更多关于如何使用OpenSSL的内容,我们的OpenSSL基础教程:SSL证书、私钥和CSR的操作有很多额外的信息,可以帮助你更熟悉OpenSSL的基本概念。