Debian 11搭建与配置证书颁发机构(CA):完整指南

引言

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

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

一些在Linux上使用自己私有CA的程序例子包括OpenVPN和Puppet。您还可以配置您的Web服务器,使用由私有CA颁发的证书,以使开发和预发布环境与使用TLS加密连接的生产服务器相匹配。

在本指南中,您将在Debian 11服务器上设置一个私有证书颁发机构,并使用您的新CA生成和签署一个测试证书。您还将把CA服务器的公共证书导入到操作系统的证书存储中,以便您能够验证CA与远程服务器或用户之间的信任链。最后,您将注销一个证书,并分发一个证书吊销列表(CRL),以确保只有授权的用户和系统可以使用依赖于您的CA的服务。

先决条件

完成本教程,您需要:

  • 一台Debian 11服务器作为您的专用CA服务器。它将仅用于导入、签署和撤销证书请求。请勿使用已托管公共服务的现有服务器。理想情况下,您的CA服务器在不使用时应处于关机或离线状态,以降低其私钥被泄露的风险。
  • 一个具有sudo权限的非root用户。请遵循我们的Debian 11初始服务器设置指南进行设置。该指南还将设置防火墙,本指南假设防火墙已到位。

注意:如果您想了解有关签发和撤销证书的内容,则本教程的最后一部分是可选的。如果您选择完成这些实践步骤,您将需要第二台Debian 11服务器,或者您也可以使用自己运行Debian或Ubuntu的本地Linux计算机,或者使用源自这两者的发行版。

第一步 – 安装 Easy-RSA

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

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


  1. sudo apt update
  2. sudo apt install easy-rsa

在下载和安装软件包之前,系统将提示您进行操作。按下y键确认您想要安装该软件包。

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

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

现在您已经安装了easy-rsa,是时候在CA服务器上创建一个公钥基础设施(PKI)的框架了。确保您还以非root用户登录,并创建一个easy-rsa目录。请确保不要使用sudo来运行以下任何命令,因为您的普通用户应该以普通权限管理和与CA交互。


  1. mkdir ~/easy-rsa

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

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


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

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

为了限制对您的新PKI目录的访问,确保只有所有者可以使用chmod命令访问它。


  1. chmod 700 /home/sammy/easy-rsa

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


  1. cd ~/easy-rsa
  2. ./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文件。


  1. cd ~/easy-rsa
  2. nano vars

一旦打开文件,粘贴以下行,并编辑每个高亮值以反映您自己的组织信息。这里的重要部分是确保不留下任何空值。


~/easy-rsa/vars

这是文章《在Debian 11上设置和配置证书颁发机构(CA)的方法》的第2部分(共6部分)。

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选项。

  1. ./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

注意:如果您不想在每次与您的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已经设置好并可以用于签署证书请求和吊销证书。

第四步 – 分发您的证书颁发机构的公开证书

现在您的证书颁发机构(CA)已经配置完毕,并且可以作为其他系统的可信任根证书。您可以将该CA的证书添加到您的OpenVPN服务器、Web服务器、邮件服务器等等。任何需要验证网络中其他用户或服务器身份的用户或服务器,都应该将ca.crt文件导入其操作系统的证书存储中。

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

在CA服务器上作为非root用户运行以下命令。

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

您的终端会输出类似以下的结果。

输出

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

复制全部内容,包括-----BEGIN CERTIFICATE----------END CERTIFICATE-----行以及破折号。

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

  1. nano /tmp/ca.crt

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

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

在基于Debian和Ubuntu的系统上,运行以下命令以导入证书:

Debian和Ubuntu衍生发行版

  1. sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/
  2. 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命令。

CentOS、Fedora、RedHat发行版。

这是文章《在Debian 11上设置和配置证书颁发机构(CA)的方法》的第3部分(共6部分)。

  1. sudo cp /tmp/ca.crt /etc/pki/ca-trust/source/anchors/
  2. 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)由三个部分组成:公钥、有关请求系统的身份信息以及请求本身的签名,该签名是使用请求方的私钥创建的。私钥将保密,并用于加密任何拥有已签名公共证书的人可以解密的信息。

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

通常情况下,大多数Linux发行版都会默认安装OpenSSL,但为了确保,请在您的系统上运行以下命令:

  1. sudo apt update
  2. sudo apt install openssl

当您收到安装OpenSSL的提示时,按y键继续安装步骤。这可能会升级您的OpenSSL库,并且您可能会被提示重新启动一些正在使用旧的OpenSSL库的服务。如果愿意,请选择确定以重新启动这些服务。

现在您已经准备好使用openssl创建一个练习用的证书签名请求(CSR)了。

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

  1. mkdir ~/practice-csr
  2. cd ~/practice-csr
  3. 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将无法对证书进行签名。

  1. openssl req -new -key sammy-server.key -out sammy-server.req
输出

这是文章《在Debian 11上设置和配置证书颁发机构(CA)的方法》的第4部分(共6部分)。

. . . —– 国家名称 (2个字母代码) [XX]:US 省/州名称 (全称) []:New York 地区名称 (例如,城市) [默认城市]:New York City 组织名称 (例如,公司) [默认公司有限公司]:Silicon Cloud 组织单位名称 (例如,部门) []:Community 通用名称 (例如,您的姓名或服务器主机名) []:sammy-server 电子邮件地址 []: 请输入以下“额外”属性以随您的证书请求发送 挑战密码 []: 可选公司名称 []:

如果您希望将这些值作为openssl调用的一部分自动添加而不是通过交互提示添加,您可以将-subj参数传递给OpenSSL。请确保编辑高亮的值以与您的实际位置、组织和服务器名称相匹配。

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

 

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

  1. 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

在你对实践证书请求的主题满意之后,使用scpsammy-server.req文件复制到你的CA服务器。

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

 

在这一步中,您为一个名为sammy-server的虚构服务器生成了证书签名请求(CSR)。在实际情况下,请求可能来自需要进行测试的类似于分段或开发网络服务器,这些服务器需要TLS证书;或者可能来自请求证书以便用户可以连接到VPN的OpenVPN服务器。

在下一步中,我们将使用CA服务器的私钥对证书签名请求进行签名。

步骤7 – 签署CSR(可选)

在之前的步骤中,您创建了一个虚构服务器的实践证书请求和密钥。您将其复制到CA服务器上的/tmp目录中,模拟出当真正的客户端或服务器向您发送需要签名的CSR请求时,您会使用的流程。

继续设想的情景,现在CA服务器需要导入并签署练习证书。一旦证书请求经CA验证并返回服务器,信任证书颁发机构的客户端也将能够信任新颁发的证书。

由于我们将在CA的PKI内进行操作,因此签名步骤将使用easy-rsa工具来简化操作,而不像之前的示例中直接使用openssl

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

  1. cd ~/easy-rsa
  2. ./easyrsa import-req /tmp/sammy-server.req sammy-server

 

输出

. . . 请求已成功导入,短名称为: sammy-server 您现在可以使用此名称对此请求执行签名操作。

现在你可以通过运行easyrsa脚本并使用sign-req选项来签署请求,接着是请求类型和包含在CSR中的公共名称。请求类型可以是客户端、服务器或者CA之一。由于我们正在使用一个虚构的服务器证书进行练习,请确保使用服务器请求类型。

  1. ./easyrsa sign-req server sammy-server

 

在输出中,您将被要求验证请求是否来自可信任的来源。输入yes(是)然后按回车键确认。

输出

您即将签署以下证书。请仔细核对以下详细信息以确保准确性。请注意,此请求尚未经过加密验证。请确保它来自受信任的来源,或者您已与发送方核实了请求校验和。
请求主题,将作为服务器证书签署,有效期为3650天:
subject= commonName = sammy-server
输入“yes”继续,或输入任何其他内容中止。
确认请求详情:yes
. . .
证书已创建于:/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.crtca.crt文件从CA服务器分发到发出CSR请求的远程服务器。

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

 

至此,您将能够使用已颁发的证书与Web服务器、VPN、配置管理工具、数据库系统或客户端身份验证等进行配合使用。

第8步 — 撤销证书(可选)

偶尔,您可能需要吊销证书以防止用户或服务器使用它。例如,某人的笔记本电脑被盗,Web服务器被入侵,或者一名员工或承包商已离开您的组织。

撤销证书的一般流程如下所示:

    1. 使用./easyrsa revoke client_name命令吊销证书。

 

    1. 使用./easyrsa gen-crl命令生成新的证书撤销列表(CRL)。

 

    1. 将更新后的crl.pem文件传输到依赖您的证书颁发机构(CA)的服务器或服务器,并将其复制到程序所需的目录或目录中。

 

    重新启动使用您的CA和CRL文件的任何服务。

您可以随时使用此流程撤销之前颁发的任何证书。我们将在接下来的章节中逐步详细介绍每个步骤,从撤销命令开始。

撤销证书

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

  1. cd ~/easy-rsa

 

接下来,使用easyrsa脚本运行revoke选项,然后输入要撤销的客户端名称。根据上面的示例,证书的通用名称是sammy-server

  1. ./easyrsa revoke sammy-server

 

这将要求您通过输入“yes”来确认撤销。

输出

请确认您希望撤销以下主题的证书:
subject= commonName = sammy-server
输入“yes”继续,或输入任何其他内容中止。
继续撤销:yes
. . .
正在撤销证书 8348B3F146A765581946040D5C4D590A
. . .

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

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

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

生成证书撤销列表

现在您已经吊销了一个证书,重要的是要在您的CA服务器上更新被吊销证书的列表。一旦您有了更新的吊销清单,您就能知道哪些用户和系统在您的CA中拥有有效证书。

要生成证书撤销列表(CRL),在~/easy-rsa目录中运行easy-rsa命令并使用gen-crl选项。

  1. ./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

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

 

既然文件已经发送到远程系统上,最后一步就是使用新的吊销列表副本更新所有的服务。

更新支持证书撤销列表的服务

本教程不涵盖列出使用crl.pem文件更新服务所需的步骤。一般情况下,您需要将crl.pem文件复制到服务所指定的位置,然后使用systemctl重新启动服务。

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

检查和验证证书撤销列表的内容

这是文章《在Debian 11上设置和配置证书颁发机构(CA)的方法》的第6部分(共6部分)。

如果您想要检查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的基本概念。

bannerAds