教程:在 Amazon Linux 2 上配置 SSL/TLS
安全套接字层/传输层安全性 (SSL/TLS) 可在 Web 服务器和 Web 客户端之间创建一个加密通道,以防止数据在传输过程中被窃听。本教程介绍如何在具有 Amazon Linux 2 和 Apache Web 服务器的 EC2 实例上手动添加对 SSL/TLS 的支持。本教程假定您未使用负载均衡器。如果您正在使用 Elastic Load Balancing,则可以选择使用来自 Amazon Certificate Manager 的证书在负载均衡器上配置 SSL 卸载。
由于历史原因,Web 加密通常简称为 SSL。虽然 Web 浏览器仍支持 SSL,但使用其下一代协议 TLS 更不易受攻击。默认情况下,Amazon Linux 2 将禁用所有版本的 SSL 的服务器端支持。安全标准机构认为 TLS 1.0 不安全。TLS 1.0 和 TLS 1.1 已于 2021 年 3 月正式弃用。本教程仅包含有关启用 TLS 1.2 的指导。TLS 1.3 于 2018 年定版,只需支持和启用底层 TLS 库(本教程中为 OpenSSL)即可在 Amazon Linux 2 中使用。客户端必须在 2023 年 6 月 28 日之前支持 TLS 1.2 或更高版本。有关更新的加密标准的更多信息,请参阅 RFC 7568 和 RFC 8446。
在本教程中,将现代 Web 加密简称为 TLS。
重要
这些过程适用于 Amazon Linux 2。我们还假定您从新的 Amazon EC2 实例开始。如果您尝试设置运行不同分配的 EC2 实例,或者运行旧版本 Amazon Linux 2 的实例,则本教程中的一些过程可能不适合。对于 Amazon Linux AMI,请参阅 教程:使用 Amazon Linux AMI 配置 SSL/TLS。对于 Ubuntu,请参阅以下社区文档:Open SSL on Ubuntu。有关 Red Hat Enterprise Linux 的信息,请参阅以下:设置 Apache HTTP Web 服务器。有关其他发布版本,请参阅特定于该版本的文档。
注意
或者,您还可以使用适用于 Amazon Nitro Enclaves 的 Amazon Certificate Manager (ACM),这是一个 Enclave 应用程序,可使您通过 Amazon Nitro Enclaves 将公有和私有 SSL/TLS 证书与在 Amazon EC2 实例上运行的 Web 应用程序和服务器一起使用。Nitro Enclaves 是一项 Amazon EC2 功能,可以创建隔离的计算环境以保护和安全地处理高度敏感的数据,例如 SSL/TLS 证书和私有密钥。
适用于 Nitro Enclaves 的 ACM 与运行在 Amazon EC2 Linux 实例上的 nginx 结合使用,以创建私有密钥、分发证书和私有密钥以及管理证书续订。
要使用适用于 Nitro Enclaves 的 ACM,必须使用启用了 Enclave 的 Linux 实例。
有关更多信息,请参阅 Amazon Nitro Enclaves 用户指南中的什么是 Amazon Nitro Enclaves?和适用于 Nitro Enclaves 的 Amazon Certificate Manager。
目录
先决条件
在开始本教程之前,请完成以下步骤:
-
启动 EBS 支持的 Amazon Linux 2 实例。有关更多信息,请参阅步骤 1:启动实例。
-
配置安全组以允许您的实例接受以下 TCP 端口上的连接:
-
SSH (端口 22)
-
HTTP (端口 80)
-
HTTPS (端口 443)
有关更多信息,请参阅为您的 Linux 实例授权入站流量。
-
-
安装 Apache Web 服务器。有关分步说明,请参阅教程:在 Amazon Linux 2 上安装 LAMP Web 服务器。仅需要 httpd 包及其依赖项,因此可以忽略涉及 PHP 和 MariaDB 的说明。
-
要识别和验证网站,TLS 公有密钥基础设施 (PKI) 依赖于域名系统 (DNS)。要使用 EC2 实例托管公共网站,您需要为 Web 服务器注册一个域名,或者将现有域名转让给您的 Amazon EC2 主机。可通过很多第三方域注册和 DNS 托管服务来执行此操作,也可以使用 Amazon Route 53 执行此操作。
步骤 1:在服务器上启用 TLS
选项:使用 Automation 完成本教程
要使用 Amazon Systems Manager Automation 而不是以下任务完成本教程,请运行 Automation 文档。
该过程指导您完成在 Amazon Linux 2 上使用自签名数字证书设置 TLS 的过程。
注意
自签名证书对于测试是可接受的,但对于生产不是。如果您将自签名证书公开到 Internet,您网站的访客将会看到安全警告。
在服务器上启用 TLS
-
连接到您的实例并确认 Apache 正在运行。
[ec2-user ~]$ sudo systemctl is-enabled httpd [ec2-user ~]$ sudo systemctl is-enabled httpd
如果返回的值不是“启用”,则启动 Apache 并将它设置为每次随系统一起启动。
[ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd [ec2-user ~]$ sudo systemctl start httpd && sudo systemctl enable httpd
-
为确保您的所有软件包都处于最新状态,请对您的实例执行快速软件更新。此过程可能需要几分钟的时间,但必须确保您拥有最新的安全更新和缺陷修复。
注意
-y
选项安装更新时不提示确认。如果您希望在安装前检查更新,则可以忽略该选项。[ec2-user ~]$ sudo yum update -y [ec2-user ~]$ sudo yum update -y
-
现在,您的实例是最新的,请安装 Apache 模块
mod_ssl
以添加 TLS 支持。[ec2-user ~]$ sudo yum install -y mod_ssl [ec2-user ~]$ sudo yum install -y mod_ssl
您的实例现在具有以下文件,可使用这些文件配置安全服务器并创建证书以进行测试:
-
/etc/httpd/conf.d/ssl.conf
mod_ssl 的配置文件。它包含一些指令 以指示 Apache 在何处查找以下信息:加密密钥和证书、要允许的 TLS 协议版本以及要接受的加密密码。
-
/etc/pki/tls/certs/make-dummy-cert
用于为服务器主机生成自签名 X.509 证书和私有密钥的脚本。要测试是否正确设置 Apache 以使用 TLS,该证书是非常有用的。由于不提供身份证明,因此,不应在生产环境中使用该证书。如果在生产环境中使用该证书,则将在 Web 浏览器中触发警告。
-
-
运行脚本以生成自签名虚拟证书和密钥以进行测试。
[ec2-user ~]$ cd /etc/pki/tls/certs sudo ./make-dummy-cert localhost.crt [ec2-user ~]$ cd /etc/pki/tls/certs sudo ./make-dummy-cert localhost.crt
这会在
/etc/pki/tls/certs/
目录中生成一个新文件localhost.crt
。指定的文件名与/etc/httpd/conf.d/ssl.conf
中的 SSLCertificateFile 指令指定的默认值匹配。该文件包含自签名证书以及证书的私有密钥。Apache 要求证书和密钥采用 PEM 格式,其中包含 Base64 编码的 ASCII 字符,并用“BEGIN”和“END”行框起来,如以下简短示例所示。
-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD2KKx/8Zk94m1q 3gQMZF9ZN66Ls19+3tHAgQ5Fpo9KJDhzLjOOCI8u1PTcGmAah5kEitCEc0wzmNeo BCl0wYR6G0rGaKtK9Dn7CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vr GvwnKoMh3DlK44D9dX7IDua2PlYx5+eroA+1Lqf32ZSaAO0bBIMIYTHigwbHMZoT ... 56tE7THvH7vOEf4/iUOsIrEzaMaJ0mqkmY1A70qQGQKBgBF3H1qNRNHuyMcPODFs 27hDzPDinrquSEvoZIggkDMlh2irTiipJ/GhkvTpoQlv0fK/VXw8vSgeaBuhwJvS LXU9HvYq0U6O4FgD3nAyB9hI0BE13r1HjUvbjT7moH+RhnNz6eqqdscCS09VtRAo 4QQvAqOa8UheYeoXLdWcHaLP -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy ... z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0 CuIjvubtUysVyQoMVPQ97ldeakHWeRMiEJFXg6kZZ0vrGvwnKoMh3DlK44D9dlU3 WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak 3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg== -----END CERTIFICATE-----
文件名和扩展名只是为了提供便利,对功能没有影响。例如,只要
ssl.conf
文件中的相关指令使用相同的名称,您就可以将证书命名为cert.crt
、cert.pem
或任何其他文件名。注意
在使用您自己的自定义文件替换默认 TLS 文件时,请确保它们采用 PEM 格式。
-
使用您常用的文本编辑器(如 vim 或 nano)以根用户身份打开
/etc/httpd/conf.d/ssl.conf
文件并注释掉以下行,因为自签名虚拟证书也包含密钥。如果在完成下一步之前没有注释掉该行,Apache 服务将无法启动。SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
-
重启 Apache。
[ec2-user ~]$ sudo systemctl restart httpd [ec2-user ~]$ sudo systemctl restart httpd
注意
确保 TCP 端口 443 在您的 EC2 实例上是可访问的,如之前所述。
-
现在,您的 Apache Web 服务器应通过端口 443 支持 HTTPS (安全 HTTP)。通过将您的 EC2 实例的 IP 地址或完全限定域名与前缀
https://
一起输入浏览器 URL 栏中来对其进行测试。由于您正在使用自签名的不可信主机证书连接到站点,因此您的浏览器可能会显示一系列安全警告。忽视这些警告并继续连接站点。
如果默认 Apache 测试页面打开,这意味着您已成功在服务器上配置 TLS。在浏览器和服务器之间传输的所有数据现在都已加密。
注意
为了防止站点访问者遇到警告屏幕,您必须获取一个可信 CA 签名证书,该证书不仅进行加密,而且还公开验证您是否为站点拥有者。
步骤 2:获取 CA 签名的证书
您可以使用以下过程获取 CA 签名证书:
-
从私有密钥生成证书签名请求 (CSR)
-
将 CSR 提交给证书颁发机构 (CA)
-
获取签名的主机证书
-
配置 Apache 以使用证书
从加密角度看,自签名 TLS X.509 主机证书与 CA 签名证书完全相同。二者之间的区别在于社交层面,而非数学层面。CA 承诺,在向申请者颁发证书之前,至少验证域的所有权。每个 Web 浏览器均包含一个 CA 的列表,浏览器供应商信任这些 CA 来执行此操作。X.509 证书主要包含一个与您的私有服务器密钥对应的公有密钥和一个以加密方式与该公有密钥关联的 CA 的签名。当浏览器通过 HTTPS 连接到 Web 服务器时,服务器将提供证书以便浏览器检查其可信 CA 的列表。如果签署人位于列表上,或可通过由其他可信签署人组成的一系列信任访问,则浏览器将与服务器协商一个快速加密数据通道并加载页面。
由于验证请求需要投入人力,证书通常会产生费用,因此应货比三家。一些 CA 免费提供基础级别证书。其中最值得注意的 CA 是 Let's Encrypt 项目,该项目还支持证书创建和续订过程的自动化。有关将 Let's Encrypt 用作 CA 的更多信息,请参阅证书自动化:在 Amazon Linux 2 上将 Let's Encrypt 与 Certbot 结合使用。
如果您打算提供商业级服务,Amazon Certificate Manager 是一个不错的选择。
主机证书的基础是密钥。从 2019 年开始,政府和行业群体建议 RSA 密钥使用 2048 位的最小密钥(模数)大小,旨在将文档一直保护到 2030 年。Amazon Linux 2 中的 OpenSSL 生成的默认模数大小为 2048 位,这适用于 CA 签名证书。在以下过程中,为需要自定义密钥的人员提供了一个可选步骤,例如,具有较大模数或使用不同加密算法的步骤。
重要
除非您拥有注册并托管的 DNS 域,否则,有关获取 CA 签名主机证书的这些说明不适用。
获取 CA 签名的证书
-
连接到您的实例并导航到 /etc/pki/tls/private/。这是存储 TLS 的服务器私有密钥的目录。如果您希望使用现有的主机密钥生成 CSR,请跳到步骤 3。
-
(可选) 生成新的私有密钥。下面是一些密钥配置示例。任何生成的密钥都可用于您的 Web 服务器,但它们实施安全的程度和类型有所不同。
-
示例 1:创建默认 RSA 主机密钥。生成的文件
custom.key
是一个 2048 位 RSA 私有密钥。[ec2-user ~]$ sudo openssl genrsa -out custom.key [ec2-user ~]$ sudo openssl genrsa -out custom.key
-
示例 2:创建具有更大模数的更严格的 RSA 密钥。生成的文件
custom.key
是一个 4096 位 RSA 私有密钥。[ec2-user ~]$ sudo openssl genrsa -out custom.key 4096 [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096
-
示例 3:创建具有密码保护的 4096 位加密的 RSA 密钥。生成的文件
custom.key
是一个已使用 AES-128 密码加密的 4096 位 RSA 私有密钥。重要
对密钥进行加密可增强安全性,但由于加密的密钥需要密码,因此依赖于加密密钥的服务无法自动启动。每当您使用此密钥时,都必须通过 SSH 连接提供密码(在上一示例中为“abcde12345”)。
[ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096 [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096
-
示例 4:使用非 RSA 密码创建密钥。RSA 加密可能相对较慢,因为其公有密钥的大小基于两个大素数的乘积。不过,可以为 TLS 创建使用非 RSA 密码的密钥。在交付同等级别的安全性时,基于椭圆曲线的数学运算的密钥更小,计算起来更快。
[ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey [ec2-user ~]$ sudo openssl ecparam -name prime256v1 -out custom.key -genkey
结果为一个使用 prime256v1(OpenSSL 支持的“命名曲线”)的 256 位椭圆曲线私有密钥。根据 NIST,其加密强度略高于 2048 位 RSA 密钥。
注意
并非所有 CA 对基于椭圆曲线的密钥的支持级别与对 RSA 密钥的支持级别相同。
请确保新的私有密钥具有高度限制的所有权和权限 (所有者=根、组=根、仅面向所有者的读取/写入权限)。命令将如以下示例所示。
[ec2-user ~]$ sudo chown root:root custom.key [ec2-user ~]$ sudo chmod 600 custom.key [ec2-user ~]$ ls -al custom.key [ec2-user ~]$ sudo chown root:root custom.key [ec2-user ~]$ sudo chmod 600 custom.key [ec2-user ~]$ ls -al custom.key
上述命令生成以下结果。
-rw------- root root custom.key
在创建并配置满意的密钥后,可以创建 CSR。
-
-
使用您首选的密钥创建 CSR。下面的示例使用了
custom.key
。[ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem [ec2-user ~]$ sudo openssl req -new -key custom.key -out csr.pem
OpenSSL 将打开一个对话框,并提示您输入下表中显示的信息。对于基本的经域验证的主机证书来说,除 Common Name 以外的所有字段都是可选字段。
名称 描述 示例 国家/地区名称 代表国家/地区的两个字母 ISO 缩写。 US (=美国) 州或省名称 组织所在州或省的名称。此名称不可使用缩写。 Washington 所在地名称 您的组织所在的位置,例如城市。 Seattle 组织名称 组织的法定全称。请勿缩写组织名称。 Example Corporation 组织部门名称 额外的组织信息 (如果有)。 示例部门 公用名 此值必须与您希望用户输入浏览器中的 Web 地址完全匹配。通常,这表示以主机名称为前缀的域名或采用
www.example.com
格式的别名。在使用自签名证书且无 DNS 解析的测试中,公用名可能只包含主机名。CA 还提供费用更高的证书,这些证书接受通配符名称(例如*.example.com
)。www.example.com 电子邮件地址 服务器管理员的电子邮件地址。 someone@example.com 最后,OpenSSL 将提示您输入可选的质询密码。此密码仅适用于 CSR 和您与 CA 之间的事务,因此请遵循 CA 提供的有关此密码以及其他可选字段、可选公司名的建议。CSR 质询密码不会影响服务器操作。
生成的文件
csr.pem
包含您的公有密钥、您的公有密钥的数字签名以及您输入的元数据。 -
将 CSR 提交给 CA。这通常包括在文本编辑器中打开 CSR 文件并将内容复制到 Web 表格中。此时,您可能需要提供一个或多个主题备用名称 (SAN) 以放置到证书上。如果
www.example.com
是公用名,则example.com
将是一个很好的 SAN,反之亦然。您网站的访客如果输入这两个名称的任何一个,便可看到一个没有错误的连接。如果您的 CA Web 表格允许该连接,请在 SAN 列表中包含公用名。一些 CA 会自动包含公用名。在您的请求获得批准后,您将收到一个由 CA 签署的新主机证书。此外,系统可能会指示您下载中间证书文件,该文件包含完成 CA 的信任链所需的其他证书。
注意
您的 CA 可能会针对各种用途发送多种格式的文件。在本教程中,您应只使用 PEM 格式的证书文件,此格式通常会(但不总是)标有
.pem
或.crt
文件扩展名。如果您不确定要使用哪个文件,请使用文本编辑器打开这些文件,并查找一个包含一个或多个以下面的行开始的块的文件。- - - - -BEGIN CERTIFICATE - - - - -
该文件还应以下面的行结束。
- - - -END CERTIFICATE - - - - -
您还可以在命令行上测试文件,如下所示。
[ec2-user certs]$ openssl x509 -in certificate.crt -text [ec2-user certs]$ openssl x509 -in certificate.crt -text certificate.crt
验证这些行是否显示在文件中。请勿使用结尾为
.p7b
、.p7c
或类似文件扩展名的文件。 -
将新的 CA 签名证书和任何中间证书放在
/etc/pki/tls/certs
目录中。注意
可通过多种方法将新证书上传到 EC2 实例,但最直接、最有益的方法是在本地计算机和 EC2 实例上打开一个文本编辑器(例如,vi、nano 或记事本),然后在这两者之间复制并粘贴文件内容。在 EC2 实例上执行这些操作时,您需要根 [sudo] 权限。这样,一旦有任何权限或路径问题,您可以立即看到。但请小心操作,不要在复制内容时添加任何多余的行或以任何方式更改内容。
从
/etc/pki/tls/certs
目录内部,检查文件所有权、组和权限设置是否与高度限制的 Amazon Linux 2 默认权限(所有者根权限、组根权限、仅面向所有者的读取/写入权限)匹配。以下示例显示了要使用的命令。[ec2-user certs]$ sudo chown root:root custom.crt [ec2-user certs]$ sudo chmod 600 custom.crt [ec2-user certs]$ ls -al custom.crt [ec2-user certs]$ sudo chown root:root custom.crt [ec2-user certs]$ sudo chmod 600 custom.crt [ec2-user certs]$ ls -al custom.crt
这些命令应生成以下结果。
-rw------- root root custom.crt
中间证书文件的权限并不严格 (所有者=根、组=根、所有者可以写入、组可以读取、任何人均可读取)。以下示例显示了要使用的命令。
[ec2-user certs]$ sudo chown root:root intermediate.crt [ec2-user certs]$ sudo chmod 644 intermediate.crt [ec2-user certs]$ ls -al intermediate.crt [ec2-user certs]$ sudo chown root:root intermediate.crt [ec2-user certs]$ sudo chmod 644 intermediate.crt [ec2-user certs]$ ls -al intermediate.crt
这些命令应生成以下结果。
-rw-r--r-- root root intermediate.crt
-
将用于创建 CSR 的私有密钥放在
/etc/pki/tls/private/
目录中。注意
可通过多种方法将自定义密钥上传到 EC2 实例,但最直接、最有益的方法是在本地计算机和 EC2 实例上打开一个文本编辑器(例如,vi、nano 或记事本),然后在这两者之间复制并粘贴文件内容。在 EC2 实例上执行这些操作时,您需要根 [sudo] 权限。这样,一旦有任何权限或路径问题,您可以立即看到。但请小心操作,不要在复制内容时添加任何多余的行或以任何方式更改内容。
从
/etc/pki/tls/private
目录内部,使用以下命令验证文件所有权、组和权限设置是否与高度限制的 Amazon Linux 2 默认权限(拥有者=根用户、组=根、仅面向拥有者的读取/写入权限)匹配。[ec2-user private]$ sudo chown root:root custom.key [ec2-user private]$ sudo chmod 600 custom.key [ec2-user private]$ ls -al custom.key [ec2-user private]$ sudo chown root:root custom.key [ec2-user private]$ sudo chmod 600 custom.key [ec2-user private]$ ls -al custom.key
这些命令应生成以下结果。
-rw------- root root custom.key
-
编辑
/etc/httpd/conf.d/ssl.conf
以反映您的新证书和密钥文件。-
在 Apache 的
SSLCertificateFile
指令中提供 CA 签名主机证书的路径和文件名:SSLCertificateFile /etc/pki/tls/certs/custom.crt
-
如果您收到一个中间证书文件(此示例中为
intermediate.crt
),请使用 Apache 的SSLCACertificateFile
指令提供其路径和文件名:SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt
注意
一些 CA 将主机证书和中间证书合并到单个文件中,从而不再需要使用
SSLCACertificateFile
指令。请查询您的 CA 提供的说明。 -
在 Apache 的
SSLCertificateKeyFile
指令中提供私有密钥的路径和文件名(在该示例中为custom.key
):SSLCertificateKeyFile /etc/pki/tls/private/custom.key
-
-
保存
/etc/httpd/conf.d/ssl.conf
并重启 Apache。[ec2-user ~]$ sudo systemctl restart httpd [ec2-user ~]$ sudo systemctl restart httpd
-
通过在浏览器 URL 栏中输入带有
https://
前缀的域名来测试您的服务器。您的浏览器应通过 HTTPS 加载测试页面而不会产生错误。
步骤 3:测试和强化安全配置
在 TLS 可操作且公开发布后,应测试其实际安全性。使用在线服务(例如 Qualys SSL Labs,该服务可对您的安全设置执行免费的全面分析)可轻松执行此操作。根据结果,您可以决定通过控制接受的协议、首选的密码和排除的密码来强化默认安全配置。有关更多信息,请参阅 Qualys 如何用公式表示其分数。
重要
实际测试对服务器的安全性非常重要。少量配置错误可能导致严重的安全漏洞和数据丢失。由于建议的安全实践会不断变化以响应调查和新兴威胁,因此定期安全审核对于良好的服务器管理来说是必不可少的。
在 Qualys SSL Labs 站点上,使用 www.example.com
格式输入服务器的完全限定域名。约两分钟后,您将收到您站点的评级 (从 A 到 F) 和结果的详细信息。下表总结了具有与 Amazon Linux 2 上的默认 Apache 配置相同的设置以及默认 Certbot 证书的域的报告。
总评 | B |
证书 | 100% |
协议支持 | 95% |
密钥交换 | 70% |
密码强度 | 90% |
虽然概述信息显示配置基本正确,但详细报告标记了几个潜在的问题(在此处按严重性顺序列出):
✗ 支持某些旧浏览器使用 RC4 密码。密码是加密算法的数学核心。RC4 是一种用于加密 TLS 数据流的快速密码,已知这种密码存在一些严重缺点。除非您有充分理由支持旧版浏览器,否则,应禁用该密码。
✗ 支持旧 TLS 版本。该配置支持 TLS 1.0(已弃用)和 TLS 1.1(即将弃用)。从 2018 年开始,仅建议使用 TLS 1.2。
✗ 不完全支持向前保密性。向前保密性是一种算法功能,它使用从私有密钥派生的临时会话密钥进行加密。这意味着,在实践中,攻击者无法解密 HTTPS 数据,即使他们拥有 Web 服务器的长期私有密钥。
纠正 TLS 配置并供将来使用
-
在文本编辑器中打开
/etc/httpd/conf.d/ssl.conf
配置文件,并在以下行的开头输入“#”以注释掉该行。#SSLProtocol all -SSLv3
-
添加以下指令:
#SSLProtocol all -SSLv3 SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2
该指令显式禁用 SSL 版本 2 和 3 以及 TLS 版本 1.0 和 1.1。现在,服务器拒绝接受与使用 TLS 1.2 以外的任何协议的客户端之间的加密连接。指令中的冗长文字更清楚地向人类读者阐述为服务器配置的用途。
注意
以此方式禁用 TLS 1.0 和 1.1 版可阻止一小部分过时的 Web 浏览器访问您的网站。
修改允许的密码列表
-
在
/etc/httpd/conf.d/ssl.conf
配置文件中,找到包含SSLCipherSuite
指令的部分,并通过在现有行的开头输入“#”来注释掉该行。#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
-
指定显式的密码套件,并指定密码顺序以优先使用向前保密性并避免不安全的密码。此处使用的
SSLCipherSuite
指令基于 Mozilla SSL 配置生成器的输出,该生成器根据服务器上运行的特定软件定制 TLS 配置。(有关更多信息,请参阅 Mozilla 的有用资源安全性/服务器端 TLS。) 首先,通过使用以下命令的输出确定 Apache 和 OpenSSL 版本。[ec2-user ~]$ yum list installed | grep httpd [ec2-user ~]$ yum list installed | grep openssl [ec2-user ~]$ yum list installed | grep httpd [ec2-user ~]$ yum list installed | grep openssl
例如,如果返回的信息是 Apache 2.4.34 和 OpenSSL 1.0.2,我们将其输入到生成器中。如果您选择“现代”兼容性模型,这将创建一条
SSLCipherSuite
指令,虽然该指令积极实施安全性,但仍适用于大多数浏览器。如果您的软件不支持现代配置,则可以更新软件或改为选择“中间”配置。SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
选定的密码名称中包含 ECDHE,它是 Elliptic Curve Diffie-Hellman Ephemeral 的缩写。术语 ephemeral 表示向前保密性。副作用是,这些密码不支持 RC4。
建议您使用密码的明确列表,而不是依赖于内容不可见的默认值或简短指令。
将生成的指令复制到
/etc/httpd/conf.d/ssl.conf
中。注意
此处为方便阅读将指令显示为几行,但在复制到
/etc/httpd/conf.d/ssl.conf
时,该指令必须位于一行中,并且密码名称之间只有一个冒号(无空格)。 -
最后,通过删除以下行开头的“#”来取消对该行的注释。
#SSLHonorCipherOrder on
该指令强制服务器优先使用排名较高的密码,包括(在该示例中)支持向前保密性的密码。启用此指令后,服务器会在回滚到允许的安全性较低的密码之前尝试建立高度安全的连接。
在完成这两个过程后,将更改保存到 /etc/httpd/conf.d/ssl.conf
并重新启动 Apache。
如果在 Qualys SSL Labs 上再次测试域,将会看到已修复 RC4 漏洞和其他警告,并且摘要如下所示。
总评 | A |
证书 | 100% |
协议支持 | 100% |
密钥交换 | 90% |
密码强度 | 90% |
在每次更新 OpenSSL 时,将引入新的密码并删除对旧密码的支持。使 EC2 Amazon Linux 2 实例保持最新,关注来自 OpenSSL 的安全公告,并留意技术出版物中对新安全漏洞的报告。
问题排查
-
除非我输入密码,否则我的 Apache Web 服务器不会启动
如果您安装了受密码保护的加密的私有服务器密钥,这是预期行为。
您可以从密钥中删除加密和密码要求。假设在默认目录中具有一个称为
custom.key
的加密的私有 RSA 密钥,并且此密钥上的密码是abcde12345
,则对 EC2 实例运行以下命令可生成此密钥的未加密版本。[ec2-user ~]$ cd /etc/pki/tls/private/ [ec2-user private]$ sudo cp custom.key custom.key.bak [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt [ec2-user private]$ sudo mv custom.key.nocrypt custom.key [ec2-user private]$ sudo chown root:root custom.key [ec2-user private]$ sudo chmod 600 custom.key [ec2-user private]$ sudo systemctl restart httpd [ec2-user ~]$ cd /etc/pki/tls/private/ [ec2-user private]$ sudo cp custom.key custom.key.bak [ec2-user private]$ sudo openssl rsa -in custom.key -passin pass:abcde12345 -out custom.key.nocrypt [ec2-user private]$ sudo mv custom.key.nocrypt custom.key [ec2-user private]$ sudo chown root:root custom.key [ec2-user private]$ sudo chmod 600 custom.key [ec2-user private]$ sudo systemctl restart httpd
Apache 现在启动时应该不会提示您提供密码。
-
我在运行 sudo yum install -y mod_ssl 时收到了错误。
在为 SSL 安装所需的程序包时,您可能会看到与以下内容类似的错误。
Error: httpd24-tools conflicts with httpd-tools-2.2.34-1.16.amzn1.x86_64 Error: httpd24 conflicts with httpd-2.2.34-1.16.amzn1.x86_64
这通常意味着您的 EC2 实例没有运行 Amazon Linux 2。本教程仅支持从官方 Amazon Linux 2 AMI 新创建的实例。
证书自动化:在 Amazon Linux 2 上将 Let's Encrypt 与 Certbot 结合使用
警告
“Let's Encrypt”交叉签名 DST 根 CA X3 证书已在 2021 年 9 月 30 日过期。在 CentOS/RHEL7 和 Amazon Linux 上使用 OpenSSL 1.0.x 时,这会导致 Let's Encrypt 连接失败。补救步骤可以参见此处,或者您可以遵照 OpenSSL 博客页面上提供的人工解决方法之一。
重要
除非您拥有注册并托管的 DNS 域,否则,有关获取 Let's Encrypt 主机证书的这些说明不适用。这些说明不适用于 Amazon 分配的公有 DNS 主机名。
Let's Encrypt 证书颁发机构是电子前沿基金会 (EFF) 致力于对整个 Internet 进行加密的核心所在。按照该目标,Let's Encrypt 主机证书被设计为用最小的人工干预来进行创建、验证、安装和维护。证书管理的自动化方面由在 Web 服务器上运行的软件代理执行。在安装并配置代理后,它与 Let's Encrypt 安全地通信并在 Apache 和密钥管理系统上执行管理任务。本教程使用免费的 Certbot 代理,因为它允许您提供自定义的加密密钥作为您证书的基础,或允许代理自身根据其默认值创建密钥。您也可以将 Certbot 配置为定期续订您的证书,无需人工交互,如自动化 Certbot中所述。有关更多信息,请参阅 Certbot 用户指南和手册页。
虽然 Certbot 不受 Amazon Linux 2 官方支持,但可供下载并在安装时正常工作。建议您执行以下备份来保护数据并避免造成不便:
-
在开始之前,请为您的 Amazon EBS 根卷制作快照。这使您能够还原 EC2 实例的原始状态。有关创建 EBS 快照的信息,请参阅创建 Amazon EBS 快照。
-
以下过程要求您编辑您的
httpd.conf
文件,该文件控制 Apache 的操作。Certbot 对此配置文件和其他配置文件进行其自动化更改。创建整个/etc/httpd
目录的备份副本,以便您在需要时还原该目录。
准备安装
在安装 Certbot 之前,请执行以下操作。
-
编辑主要 Apache 配置文件
/etc/httpd/conf/httpd.conf
。找到“Listen 80
”指令并在后面添加以下行,将示例域名替换为实际公用名和主题替代名称 (SAN)。<VirtualHost *:80> DocumentRoot "/var/www/html" ServerName "example.com" ServerAlias "www.example.com" </VirtualHost> example.com www.example.com
-
保存并关闭 文件。
-
重启 Apache。
[ec2-user ~]$ sudo systemctl restart httpd [ec2-user ~]$ sudo systemctl restart httpd
安装并运行 Certbot
此过程基于有关在 Fedora 和 RHEL 7 上安装 Certbot 的 EFF 文档。其中介绍 Certbot 的默认使用,即根据 2048 位 RSA 密钥生成证书。
-
安装 Amazon Extras repo for epel。
[ec2-user ~]$ sudo amazon-linux-extras install epel -y [ec2-user ~]$ sudo amazon-linux-extras install epel -y
-
使用以下命令安装 Certbot 包和依赖项。
[ec2-user ~]$ sudo yum install -y certbot python2-certbot-apache [ec2-user ~]$ sudo yum install -y certbot python2-certbot-apache
-
运行 Certbot。
[ec2-user ~]$ sudo certbot [ec2-user ~]$ sudo certbot
-
在提示符“Enter email address (used for urgent renewal and security notices)”处,输入联系人地址并按 Enter。
-
在提示符处,同意 Let's Encrypt 服务条款。输入“A”并按 Enter 以继续。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A A A
-
完成授权以使 EFF 将您加入发送名单中,输入“Y”或“N”并按 Enter。
-
Certbot 显示您在 VirtualHost 数据块中提供的公用名和主题替代名称 (SAN)。
Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: example.com 2: www.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): example.com www.example.com
将输入保留空白并按 Enter。
-
Certbot 在创建证书和配置 Apache 时将显示以下输出。然后,它提示您有关将 HTTP 查询重定向到 HTTPS 的事项。
Obtaining a new certificate Performing the following challenges: http-01 challenge for example.com http-01 challenge for www.example.com Waiting for verification... Cleaning up challenges Created an SSL vhost at /etc/httpd/conf/httpd-le-ssl.conf Deploying Certificate for example.com to VirtualHost /etc/httpd/conf/httpd-le-ssl.conf Enabling site /etc/httpd/conf/httpd-le-ssl.conf by adding Include to root configuration Deploying Certificate for www.example.com to VirtualHost /etc/httpd/conf/httpd-le-ssl.conf Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): example.com www.example.com example.com www.example.com
要允许访客通过未加密的 HTTP 连接到服务器,请输入“1”。若要仅接受通过 HTTPS 的加密连接,请输入“2”。按 Enter 提交您的选择。
-
Certbot 完成 Apache 的配置并报告成功和其他信息。
Congratulations! You have successfully enabled https://example.com and https://www.example.com You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=example.com https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/certbot.oneeyedman.net/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/certbot.oneeyedman.net/privkey.pem Your cert will expire on 2019-08-01. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.
-
在完成安装后,测试并优化您服务器的安全性,如步骤 3:测试和强化安全配置中所述。
配置自动证书续订
Certbot 被设计成服务器系统的一个不可见的防错部分。默认情况下,它会生成具有短暂的 90 天到期时间的主机证书。如果您还未将系统配置为自动调用命令,则必须在到期之前手动重新运行 certbot 命令。此过程介绍如何通过设置 cron 作业来实现 Certbot 自动化。
自动化 Certbot
-
使用 sudo,在文本编辑器(例如 vim 或 nano)中打开
/etc/crontab
文件。或者,请使用 sudo crontab -e。 -
添加类似于下文的行并保存文件。
39 1,13 * * * root certbot renew --no-self-upgrade
这是每个组件的说明:
39 1,13 * * *
-
排定一个在每天 01:39 和 13:39 运行的命令。所选的值是随机的,但 Certbot 开发人员建议每天运行该命令至少两次。这将确保立即撤销并替换任何发现已损坏的证书。
root
-
该命令使用根权限运行。
certbot renew --no-self-upgrade
-
将要运行的命令。renew 子命令会使 Certbot 检查任何先前获取的证书并续订即将到期的证书。
--no-self-upgrade
标记可防止 Certbot 在没有您干预的情况下自行升级。
-
重启 cron 守护程序。
[ec2-user ~]$ sudo systemctl restart crond [ec2-user ~]$ sudo systemctl restart crond
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)