如何在 Debian 11 上设置和配置证书颁发机构 (CA)

介绍

认证机构(CA)是负责在互联网上发行数字证书来验证身份的实体,尽管公共CAs是对向公众提供的网站和其他服务的身份验证的普遍选择,但私人CAs通常用于封闭的群组和私人服务。

建立私有证书授权机构将使您能够配置、测试和运行需要客户端和服务器之间加密连接的程序。

在 Linux 上使用自己的私人 CA 的某些程序的例子是 OpenVPNPuppet. 您还可以配置您的 Web 服务器使用私人 CA 发行的证书,以使开发和舞台环境匹配使用 TLS 加密连接的生产服务器。

在本指南中,您将在 Debian 11 服务器上设置私有证书授权机构,并使用新 CA 生成和签署测试证书,您还将将 CA 服务器的公共证书导入操作系统的证书库,以便您可以验证 CA 和远程服务器或用户之间的信任链条。

前提条件

要完成本教程,您将需要:

  • Debian 11 服务器将成为您的专用 CA 服务器。它只会用于导入、签名和撤销证书请求。不要使用预先存在的服务器来托管公共服务。理想情况下,您的 CA 服务器在不使用时应该关闭或离线,以便其私钥不容易受到损害。
  • 具有sudo特权的非根用户。 按照我们的 Debian 11 初始服务器设置指南来设置。

<$>[注] **注:**本教程的最后一部分是可选的,如果你想了解签名和撤销证书。如果你选择完成这些练习步骤,你将需要第二台 Debian 11 服务器,或者你也可以使用自己的本地 Linux 计算机运行 Debian 或 Ubuntu,或从其中任何一个分布。

步骤 1 – 安装 Easy-RSA

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

登录您的 CA 服务器作为您在初始设置步骤中创建的非 root sudo 用户,并执行以下操作:

1sudo apt update
2sudo apt install easy-rsa

您将被要求下载包并安装它. 按y来确认您想要安装包。

在这一点上,你有所有你需要的设置,并准备使用 Easy-RSA. 在下一步,你将创建一个公共密钥基础设施,然后开始建立你的证书权威。

步骤2:准备一个公共关键基础设施目录

现在你已经安装了easy-rsa,现在是时候在 CA 服务器上创建一个骨骼 Public Key Infrastructure (PKI)。 确保你仍然登录为非根用户,并创建一个easy-rsa目录。

1mkdir ~/easy-rsa

这将创建一个名为easy-rsa的新目录在您的主文件夹中. 我们将使用这个目录创建符号链接,指向我们在上一步安装的easy-rsa包文件。

ln命令创建 symlinks:

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

<$>[注] 注: 虽然其他指南可能指示您将easy-rsa包文件复制到您的PKI目录,但本教程采用了symlink方法(https://andsky.com/tech/tutorials/workflow-symbolic-links)。

若要限制对新 PKI 目录的访问,请确保只有所有者可以使用chmod命令访问它:

1chmod 700 /home/sammy/easy-rsa

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

1cd ~/easy-rsa
2./easyrsa init-pki
1[secondary_label Output]
2init-pki complete; you may now create a CA or requests.
3Your newly created PKI dir is: /home/sammy/easy-rsa/pki

完成此部分后,您将有一个目录,其中包含创建证书权限所需的所有文件. 在下一部分,您将为您的 CA 创建私钥和公共证书。

步骤 3 – 创建证书授权机构

在你可以创建你的CA的私钥和证书之前,你需要创建和填充一个名为vars的文件,其中有一些默认值。首先你将cd进入easy-rsa目录,然后你将创建和编辑vars文件使用nano或你喜欢的文本编辑器:

1cd ~/easy-rsa
2nano vars

一旦文件被打开,粘贴下列行,并编辑每个突出值,以反映您自己的组织信息。

1[secondary_label ~/easy-rsa/vars]
2set_var EASYRSA_REQ_COUNTRY    "US"
3set_var EASYRSA_REQ_PROVINCE   "NewYork"
4set_var EASYRSA_REQ_CITY       "New York City"
5set_var EASYRSA_REQ_ORG        "DigitalOcean"
6set_var EASYRSA_REQ_EMAIL      "[email protected]"
7set_var EASYRSA_REQ_OU         "Community"
8set_var EASYRSA_ALGO           "ec"
9set_var EASYRSA_DIGEST         "sha512"

当你完成时,保存并关闭文件. 如果你正在使用nano,你可以通过按 CTRL+X,然后 YENTER来确认这样做。

要为您的证书权限创建 root 公钥和私钥对,请再次运行 ./easy-rsa 命令,这次使用 build-ca 选项:

1./easyrsa build-ca

在输出中,你会看到一些关于OpenSSL版本的行,你将被要求输入你的密钥对的密码短语. 请确保选择一个强大的密码短语,并在安全的地方记下它。

您还将被要求确认您的 CA 的常用名称(CN)。CN 是指在证书授权机构的背景下使用这个机器的名称。您可以输入 CA 的常用名称的任何字符串,但为了简单,请按 ENTER 以接受默认名称。

 1[secondary_label Output]
 2. . .
 3Enter New CA Key Passphrase:
 4Re-Enter New CA Key Passphrase:
 5. . .
 6Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
 7
 8CA creation complete and you may now import and sign cert requests.
 9Your new CA certificate file for publishing is at:
10/home/sammy/easy-rsa/pki/ca.crt

<$>[注] 注: 如果您不希望每次与 CA 交互时被要求使用密码,则可以使用nopass选项运行build-ca命令,如下:

1./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 的公共证书导入第二个 Linux 系统,如另一个服务器或本地计算机,请先从 CA 服务器上获取一个.ca.crt 文件的副本. 您可以使用.cat 命令将其输出到终端,然后将其复制并粘贴到正在导入该证书的第二台计算机上的文件中。

作为 CA 服务器上的非根用户,运行以下命令:

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

您的终端将有类似于以下的输出:

1[secondary_label Output]
2-----BEGIN CERTIFICATE-----
3MIIDSzCCAjOgAwIBAgIUcR9Crsv3FBEujrPZnZnU4nSb5TMwDQYJKoZIhvcNAQEL
4BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAwMzE4MDMxNjI2WhcNMzAw
5. . .
6. . .
7-----END CERTIFICATE-----

复制所有内容,包括 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 行和插件。

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

1[environment second]
2nano /tmp/ca.crt

将您刚刚从 CA Server 复制的内容粘贴到编辑器中. 完成后,保存并关闭文件. 如果您正在使用nano,您可以按CTRL+X,然后按YENTER来确认。

现在,你在你的第二个Linux系统上有crt文件的副本,是时候将证书导入其操作系统证书库了。

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

1[label Debian and Ubuntu derived distributions]
2[environment second]
3sudo cp /tmp/ca.crt /usr/local/share/ca-certificates/
4sudo update-ca-certificates

在以后的 Debian 和 Ubuntu 系统中,位于 /usr/sbin/update-ca-certificates 的 update-ca-certificates脚本可能不在您的用户的$PATH中,或者将/usr/sbin添加到您的$PATH,或者只是运行 /usr/sbin/update-ca-certificates。

要在 CentOS、Fedora 或 RedHat 系统上导入 CA 服务器的证书,请像上面的例子一样将文件内容复制并粘贴到系统中,然后将证书复制到 /etc/pki/ca-trust/source/anchors/,然后运行 update-ca-trust 命令。

1[label CentOS, Fedora, RedHat distributions]
2[environment second]
3sudo cp /tmp/ca.crt /etc/pki/ca-trust/source/anchors/
4sudo update-ca-trust

现在,你的第二个Linux系统将信任CA服务器签署的任何证书。

<$>[注] 注: 如果您正在使用您的 CA 与 Web 服务器并使用 Firefox 作为浏览器,您将需要直接导入 Firefox 的公共 ca.crt 证书。

如果您正在使用 CA 与 Windows 环境或桌面计算机集成,请参阅有关如何使用 certutil.exe 的文档(https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil#-installcert)。

如果您正在使用本教程作为另一个教程的先决条件,或熟悉如何签署和撤销证书,您可以停留在这里. 如果您想了解有关如何签署和撤销证书的更多信息,那么下面的可选部分将详细解释每个过程。

步骤 5 — 创建证书签名请求和撤销证书(可选)

以下教程的部分是可选的. 如果您已经完成了所有之前的步骤,那么您有一个完全配置和工作证书权威,您可以使用作为其他教程的先决条件. 您可以导入您的CA的‘ca.crt’文件,并验证在您的网络中已被您的CA签署的证书。

如果您想练习并了解有关如何签署证书请求以及如何撤销证书的更多信息,那么这些可选部分将解释这两个流程的运作方式。

步骤 6 – 创建和签署实践证书申请(可选)

现在你已经准备好使用了CA,你可以练习生成私钥和证书请求,以熟悉签名和分发过程。

证书签名请求(CSR)由三个部分组成:一个公钥,识别有关请求系统的信息,以及使用请求方的私钥创建的请求本身的签名。

以下步驟將在您的第二個 Linux 系統上執行 Debian、Ubuntu 或從其中任何一種發行版. 它可以是另一個遠端伺服器或本地 Linux 機器,如筆記本電腦或桌面電腦。

openssl通常在大多数Linux发行版上默认安装,但要确定,请在您的系统上运行以下操作:

1[environment second]
2sudo apt update
3sudo apt install openssl

當您被要求安裝「openssl」時,請按「y」進行安裝步驟,這可能會更新您的 OpenSSL 庫,並且您可能會被要求重新啟動一些使用舊 OpenSSL 庫的服務。

现在你已经准备好创建一个实践的CSR与openssl

要使用openssl创建私钥,请创建一个实践-csr目录,然后在其内部生成一个密钥,我们将为一个名为sammy-server的虚构服务器提出这个请求,而不是创建用于识别用户或其他CA的证书。

1[environment second]
2mkdir ~/practice-csr
3cd ~/practice-csr
4openssl genrsa -out sammy-server.key
1[secondary_label Output]
2Generating RSA private key, 2048 bit long modulus (2 primes)
3. . .
4. . .
5e is 65537 (0x010001)

现在你有一个私钥,你可以创建一个相应的CSR,再次使用openssl实用程序. 你将被要求填写一些字段,如国家,州和城市. 你可以输入一个. 如果你想让一个字段空白,但要记住,如果这是一个真正的CSR,最好使用正确的值为你的位置和组织。 但是,不要让共同名称(CN)空白,因为这个字段是必需的,你的CA将无法签署证书没有它:

1[environment second]
2openssl req -new -key sammy-server.key -out sammy-server.req
 1[secondary_label Output]
 2. . .
 3-----
 4Country Name (2 letter code) [XX]:US
 5State or Province Name (full name) []:New York
 6Locality Name (eg, city) [Default City]:New York City
 7Organization Name (eg, company) [Default Company Ltd]:DigitalOcean
 8Organizational Unit Name (eg, section) []:Community
 9Common Name (eg, your name or your server's hostname) []:sammy-server
10Email Address []:
11
12Please enter the following 'extra' attributes
13to be sent with your certificate request
14A challenge password []:
15An optional company name []:

如果您希望自动添加这些值作为openssl召唤的一部分,而不是通过交互式提示,您可以将-subj参数传递给OpenSSL。

1[environment second]
2openssl req -new -key sammy-server.key -out server.req -subj \
3/C=US/ST=New\ York/L=New\ York\ City/O=DigitalOcean/OU=Community/CN=sammy-server

要验证 CSR 的内容,您可以在请求文件中阅读openssl,并检查内部的字段:

1[environment second]
2openssl req -in sammy-server.req -noout -subject
1[secondary_label Output]
2subject=C = US, ST = New York, L = New York City, O = DigitalOcean, OU = Community, CN = sammy-server

一旦您对实践证书请求的主题满意,请使用scpsammy-server.req文件复制到您的CA服务器:

1[environment second]
2scp sammy-server.req sammy@your_ca_server_ip:/tmp/sammy-server.req

在这个步骤中,你为一个虚构的服务器生成了一个证书签名请求,称为sammy-server。在现实世界的情况下,请求可能来自某个需要测试TLS证书的站点或开发网页服务器,或者它可能来自一个OpenVPN服务器,该服务器正在请求证书,以便用户可以连接到VPN。

步骤 7 – 签署 CSR (可选)

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

继续虚构的场景,现在CA 服务器需要导入实践证书并签署它.一旦 CA 验证证书请求并转发回服务器,信任 Certificate Authority 的客户也将能够信任新发行的证书。

由于我们将在 CA 的 PKI 中运行,在那里可使用easy-rsa实用程序,签名步骤将使用easy-rsa实用程序来使事情变得更容易,而不是直接使用openssl,就像我们在上一个例子中所做的。

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

1cd ~/easy-rsa
2./easyrsa import-req /tmp/sammy-server.req sammy-server
1[secondary_label Output]
2. . .
3The request has been successfully imported with a short name of: sammy-server
4You may now use this name to perform signing operations on this request.

现在你可以通过运行easyrsa脚本来签名请求,然后是sign-req选项,然后是包含在 CSR 中的请求类型和常用名称。

1./easyrsa sign-req server sammy-server

在输出中,您将被要求验证请求来自可信来源. 输入,然后按 ** ENTER** 来确认:

 1[secondary_label Output]
 2You are about to sign the following certificate.
 3Please check over the details shown below for accuracy. Note that this request
 4has not been cryptographically verified. Please be sure it came from a trusted
 5source or that you have verified the request checksum with the sender.
 6
 7Request subject, to be signed as a server certificate for 3650 days:
 8
 9subject=
10    commonName                = sammy-server
11
12Type the word 'yes' to continue, or any other input to abort.
13  Confirm request details: yes
14. . .
15Certificate 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 服务器的新签名。

如果这个请求是针对一个真实的服务器,如Web服务器或VPN服务器,那么CA服务器的最后一步将是将新的sammy-server.crtca.crt文件从CA服务器分发到执行CSR请求的远程服务器:

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

在这一点上,您可以使用发行的证书与某种东西,如网络服务器,VPN,配置管理工具,数据库系统,或为客户端身份验证目的。

步骤 8 – 撤销证书(可选)

有时,您可能需要撤销证书以防止用户或服务器使用它. 也许某人的笔记本电脑被盗,网页服务器被破坏,或者员工或承包商离开了您的组织。

若要撤销证书,一般过程遵循以下步骤:

  1. 使用命令 ./easyrsa revoke client_name 取消证书.
  2. 使用命令 ./easyrsa gen-crl 生成新 CRL.
  3. 将更新后的 crl.pem 文件传输到依赖 CA 的服务器或服务器,并在这些系统上将其复制到所需的目录或目录,用于参考它的程序。
  4. 重启使用 CA 和 CRL 文件的任何服务。

您可以使用此过程随时撤销您之前发行的任何证书,我们将在下面的部分详细介绍每个步骤,从撤销命令开始。

取消证书

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

1cd ~/easy-rsa

接下来,运行easyrsa脚本以撤销选项,然后是您想要撤销的客户端名称。

1./easyrsa revoke sammy-server

这将要求您通过输入来确认撤销:

 1[secondary_label Output]
 2Please confirm you wish to revoke the certificate with the following subject:
 3
 4subject=
 5    commonName                = sammy-server
 6
 7Type the word 'yes' to continue, or any other input to abort.
 8  Continue with revocation: yes
 9. . .
10Revoking Certificate 8348B3F146A765581946040D5C4D590A
11. . .

请注意撤销证书行上的突出值. 此值是正在撤销的证书的唯一序列号. 如果您希望在本节的最后一步中查看撤销列表以验证该证书是否存在,则需要此值。

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

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

创建证书撤销列表

现在您已撤销证书,重要的是更新 CA 服务器上撤销证书的列表. 一旦您有更新的撤销列表,您将能够知道哪些用户和系统在 CA 中有有效证书。

要生成 CRL,请使用gen-crl选项在~/easy-rsa目录中运行easy-rsa命令:

1./easyrsa gen-crl

如果你在创建你的ca.key文件时使用了密码,你将被要求输入它. gen-crl命令将生成一个名为crl.pem的文件,其中包含该 CA 的被撤销证书的最新列表。

接下来,您将需要将更新后的crl.pem文件传输到依赖该 CA 的所有服务器和客户端,每次运行gen-crl命令,否则客户端和系统仍然可以访问使用您的 CA 的服务和系统,因为这些服务需要知道证书的被撤销状态。

转移证书撤销列表

现在你已经在你的 CA 服务器上生成了一个 CRL,你需要将其传输到依赖你的 CA 的远程系统。

<$>[注] **注:**本教程解释了如何手动生成和分发 CRL。虽然有更强大和自动的方法来分发和检查撤销列表,如 OCSP-Stapling,但配置这些方法超出了本文的范围。

确保您已登录到 CA 服务器作为非根用户,并执行以下操作,在自己的服务器 IP 或 DNS 名称中代替your_server_ip:

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

现在该文件已在远程系统上,最后一步是更新任何服务,使用新的撤销列表副本。

更新支持 CRL 的服务

列出您需要使用更新使用「crl.pem」文件的服务的步骤超出了本教程的范围。一般来说,您需要将「crl.pem」文件复制到服务预计的位置,然后使用「systemctl」重新启动。

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

检查和验证CRL的内容

如果您想查看 CRL 文件,例如确认被撤销的证书列表,请使用 CA 服务器上的easy-rsa目录中的以下openssl命令:

1cd ~/easy-rsa
2openssl crl -in pki/crl.pem -noout -text

例如,如果您将crl.pem文件转移到您的第二个系统,并希望验证sammy-server证书被撤销,您可以使用如下这样的openssl命令,取代您在撤销证书时提到的序列号,而不是这里提到的序列号:

1[environment second]
2openssl crl -in /tmp/crl.pem -noout -text |grep -A 1 8348B3F146A765581946040D5C4D590A
1[secondary_label Output]
2    Serial Number: 8348B3F146A765581946040D5C4D590A
3        Revocation Date: Apr 1 20:48:02 2020 GMT

注意如何使用抓住命令来检查您在撤销步骤中注明的独特序列号,现在您可以在依靠该命令的任何系统上验证您的证书撤销列表的内容,以限制访问用户和服务。

结论

在本教程中,您使用独立的 Debian 11 服务器上的 Easy-RSA 包创建了私人证书授权机构,您了解了信任模型如何在依赖 CA 的各方之间工作,您还为实践服务器创建并签署了证书签名请求(CSR),然后撤销了证书。

现在,您可以向用户发行证书,并使用它们与OpenVPN等服务一起使用,您还可以使用您的CA来配置与证书的开发和阶段化Web服务器,以确保您的非生产环境。

如果您想了解更多有关如何使用OpenSSL的信息,我们的教程 OpenSSL Essentials: 使用SSL证书,私钥和CSR有许多额外的信息,以帮助您更熟悉OpenSSL的基本知识。

Published At
Categories with 技术
comments powered by Disqus