Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

教程:将 Amazon Linux 上的 Apache Web 服务器配置为使用 SSL/TLS

安全套接字层/传输层安全性 (SSL/TLS) 可在 Web 服务器和 Web 客户端之间创建一个加密通道,以防止数据在传输过程中被窃听。本教程介绍如何在运行 Apache Web 服务器的单个 Amazon Linux 实例上手动添加对 SSL/TLS 的支持。如果您计划提供商业级服务,AWS Certificate Manager (此处未作介绍) 是一个不错的选择。

注意

由于历史原因,Web 加密通常简称为 SSL。虽然 Web 浏览器仍支持 SSL,但其后继者协议 TLS 被视为不易受攻击。Amazon Linux 默认禁用所有版本的 SSL,并且建议禁用 TLS 1.0 版,如下所述。只能安全启用 TLS 1.1 和 1.2。有关更新后的加密标准的更多信息,请参阅 RFC 7568

重要

这些过程适用于 Amazon Linux。如果您尝试在其他分配的实例上设置 LAMP Web 服务器,则本教程不适合您。有关 Ubuntu 上的 LAMP Web 服务器的信息,请转到 Ubuntu 社区文档 ApacheMySQLPHP 主题。有关 Red Hat Enterprise Linux 的信息,请转至客户门户网站主题 Web 服务器

先决条件

在开始本教程之前,请完成以下步骤:

  • 启动 EBS 支持的 Amazon Linux 实例。有关更多信息,请参阅 步骤 1:启动实例

  • 配置安全组以允许您的实例接受以下 TCP 端口上的连接:

    • SSH (端口 22)

    • HTTP (端口 80)

    • HTTPS (端口 443)

    有关更多信息,请参阅 Amazon EC2 的设置

  • 安装 Apache Web 服务器。有关分步说明,请参阅教程:在 Amazon Linux 上安装 LAMP Web 服务器。仅需要 http24 包及其依赖项;可以忽略涉及 PHP 和 MySQL 的说明。

  • 为识别和验证网站,SSL/TLS 公有密钥基础设施 (PKI) 依赖于域名系统 (DNS)。如果您计划使用 EC2 实例来托管公共网站,您需要为 Web 服务器注册域名或将现有域名传输给您的 Amazon EC2 主机。可通过许多第三方域注册和 DNS 托管服务来执行此操作,也可以使用 Amazon Route 53 执行此操作。

步骤 1:在服务器上启用 SSL/TLS

此过程将指导您完成在 Amazon Linux 上使用自签名的数字证书设置 SSL/TLS 的流程。

注意

自签名证书对于测试是可接受的,但对于生产不是。如果您将自签名证书公开到 Internet,您网站的访客将会被安全警告问候。

在服务器上启用 SSL/TLS

  1. 连接到您的实例并确认 Apache 正在运行。

    [ec2-user ~]$ sudo service httpd status

    如有必要,启动 Apache。

    [ec2-user ~]$ sudo service httpd start
  2. 为确保您的所有软件包都处于最新状态,请对您的实例执行快速软件更新。此过程可能需要几分钟的时间,但必须确保您拥有最新的安全更新和缺陷修复。

    注意

    -y 选项安装更新时不提示确认。如果您希望在安装前检查更新,则可以忽略该选项。

    [ec2-user ~]$ sudo yum update -y
  3. 既然您的实例处于最新状态,请通过安装 Apache 模块 mod_ssl 来添加 SSL/TLS 支持:

    [ec2-user ~]$ sudo yum install -y mod24_ssl

    在本教程的后面,您将使用已安装的三个重要文件:

    • /etc/httpd/conf.d/ssl.conf

      mod_ssl 的配置文件。它包含告知 Apache 以下信息的“指令”:在何处查找加密密钥和证书、允许哪些 SSL/TLS 协议版本、接受哪种加密密码。

    • /etc/pki/tls/private/localhost.key

      针对 Amazon EC2 主机的自动生成的 2048 位 RSA 私有密钥。在安装期间,OpenSSL 已使用此密钥生成自签名主机证书,您也可使用此密钥生成证书签名请求 (CSR) 以提交给证书颁发机构 (CA)。

    • /etc/pki/tls/certs/localhost.crt

      针对服务器主机的自动生成的自签名 X.509 证书。此证书对于测试是否已将 Apache 正确设置为使用 SSL/TLS 来说很有用。

    .key.crt 文件均为 PEM 格式,其中包含采用 Base64 编码的 ASCII 字符,并用“BEGIN”和“END”行框起来,如下面的简短证书示例所示:

    -----BEGIN CERTIFICATE----- MIIEazCCA1OgAwIBAgICWxQwDQYJKoZIhvcNAQELBQAwgbExCzAJBgNVBAYTAi0t MRIwEAYDVQQIDAlTb21lU3RhdGUxETAPBgNVBAcMCFNvbWVDaXR5MRkwFwYDVQQK DBBTb21lT3JnYW5pemF0aW9uMR8wHQYDVQQLDBZTb21lT3JnYW5pemF0aW9uYWxV bml0MRkwFwYDVQQDDBBpcC0xNzItMzEtMjAtMjM2MSQwIgYJKoZIhvcNAQkBFhVy ... z5rRUE/XzxRLBZOoWZpNWTXJkQ3uFYH6s/sBwtHpKKZMzOvDedREjNKAvk4ws6F0 WanXWehT6FiSZvB4sTEXXJN2jdw8g+sHGnZ8zCOsclknYhHrCVD2vnBlZJKSZvak 3ZazhBxtQSukFMOnWPP2a0DMMFGYUHOd0BQE8sBJxg== -----END CERTIFICATE-----

    文件名和扩展名只是为了提供便利,对功能没有影响;只要 ssl.conf 文件中的相关指令使用相同的名称,您可以将证书命名为 cert.crtcert.pem 或 任何其他文件名。

    注意

    使用自定义文件替换默认的 SSL/TLS 文件时,请确保它们采用 PEM 格式。

  4. 重启 Apache。

    [ec2-user ~]$ sudo service httpd restart

    注意

    确保 TCP 端口 443 在您的 EC2 实例上是可访问的,如上所述。

  5. 现在,您的 Apache Web 服务器应通过端口 443 支持 HTTPS (安全 HTTP)。通过将您的 EC2 实例的 IP 地址或完全限定域名与前缀 https:// 一起键入浏览器 URL 栏中来对其进行测试。由于您正在使用自签名的不可信主机证书连接到站点,因此您的浏览器可能会显示一系列安全警告。

    忽视这些警告并继续连接站点。如果默认 Apache 测试页面打开,则意味着您已在服务器上成功配置 SSL/TLS。在浏览器和服务器之间传输的所有数据现在都被安全地加密了。

    为了防止站点访问者遇到警告屏幕,您需要获取一个证书,该证书不仅用于加密,而且还用于公开验证您的站点所有者身份。

步骤 2:获取 CA 签名的证书

本部分介绍了以下流程:从私有密钥生成证书签名请求 (CSR)、将 CSR 提交给证书颁发机构 (CA)、获取签名主机证书并配置 Apache 以使用该证书。

自签名 SSL/TLS X.509 主机证书从加密上来说,与 CA 签名的证书相同。二者之间的区别在于社交层面,而非数学层面;CA 承诺,在向申请者颁发证书之前,至少验证域的所有权。每个 Web 浏览器均包含一个 CA 的列表,浏览器供应商信任这些 CA 来执行此操作。X.509 证书主要包含一个与您的私有服务器密钥对应的公有密钥和一个以加密方式与该公有密钥关联的 CA 的签名。当浏览器通过 HTTPS 连接到 Web 服务器时,服务器将提供证书以便浏览器检查其可信 CA 的列表。如果签署人位于列表上,或可通过由其他可信签署人组成的一系列信任访问,则浏览器将与服务器协商一个快速加密数据通道并加载页面。

由于验证请求需要投入人力,证书通常会产生费用,因此应货比三家。在 dmoztools.net 上可找到知名 CA 的列表。一些 CA 免费提供基础级别证书。其中最值得注意的是 Let's Encrypt 项目,该项目还支持证书创建和续订过程的自动化。有关将 Let's Encrypt 用作 CA 的更多信息,请参阅附录:在 Amazon Linux 上将 Let's Encrypt 与 Certbot 结合使用

主机证书的基础是密钥。自 2017 年起,政府行业群体建议对 RSA 密钥使用 2048 位的最小密钥 (模数) 大小,旨在保护文档直到 2030 年。OpenSSL 在 Amazon Linux 中生成的默认系数大小为 2048 位,意味着现有的自动生成的密钥适用于 CA 签名的证书。下面介绍了适合需要自定义密钥的人员的替代过程,例如,具有较大系数或使用不同加密方法的过程。

获取 CA 签名的证书

  1. 连接到您的实例并导航到 /etc/pki/tls/private/。这是存储适用于 SSL/TLS 的服务器私有密钥的目录。如果您希望使用现有主机密钥来生成 CSR,请跳至步骤 3。

  2. (可选) 生成新的私有密钥。下面是一些示例密钥配置。任何生成的密钥都将用于 Web 服务器,但它们实施安全的方式和程度有所不同。

    1. 以下命令可作为起点,用来创建与实例上默认主机密钥类似的 RSA 密钥:

      [ec2-user ~]$ sudo openssl genrsa -out custom.key 2048

      生成的文件 custom.key 是一个 2048 位 RSA 私有密钥。

    2. 要创建系数更大的更严格的 RSA 密钥,请使用以下命令:

      [ec2-user ~]$ sudo openssl genrsa -out custom.key 4096

      生成的文件 custom.key 是一个 4096 位 RSA 私有密钥。

    3. 要创建具有密码保护的 4096 位加密的 RSA 密钥,请使用以下命令:

      [ec2-user ~]$ sudo openssl genrsa -aes128 -passout pass:abcde12345 -out custom.key 4096

      这将生成一个已使用 AES-128 密码加密的 4096 位 RSA 私有密钥。

      重要

      加密可增强安全性,但由于加密的密钥需要密码,因此依赖于加密密钥的服务无法自动启动。每当您使用此密钥时,都需要通过 SSH 连接提供密码“abcde12345”。

    4. RSA 密码术可能相对较慢,因为其安全性依赖于对两个较大质数的乘积进行因子分解的难度。不过,可以为 SSL/TLS 创建使用非 RSA 密码的密钥。在交付同等级别的安全性时,基于椭圆曲线的数学运算的密钥更小,计算起来更快。示例如下:

      [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

    上述命令应生成以下结果:

    -rw------- root root custom.key

    在创建并配置满意的密钥后,可以创建 CSR。

  3. 使用您首选的密钥创建 CSR;下面的示例将使用 custom.key

    [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 包含您的公有密钥、您的公有密钥的数字签名以及您输入的元数据。

  4. 将 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

    检查上述指示行上的输出。请勿使用结尾为 .p7b.p7c 或类似扩展名的文件。

  5. /etc/pki/tls/certs 目录删除旧的自签名主机证书 localhost.crt 并将新的 CA 签署的证书 (以及任何中间证书) 放置到该目录中。

    注意

    有多种方法可以将新证书上传到 EC2 实例,但最直接、最有益的方法是在本地计算机及 EC2 实例上各打开一个文本编辑器 (如 vi、nano、记事本等),然后在这两者之间复制、粘贴文件内容。当在 EC2 实例上执行这些操作时,您需要根 [sudo] 权限。这样,一旦有任何权限或路径问题,您可以立即看到。但请小心操作,不要在复制内容时添加任何多余的行或以任何方式更改内容。

    /etc/pki/tls/certs 目录内部,检查文件所有权、组和权限设置是否与高度限制的 Amazon Linux 默认权限 (所有者=根权、组=根、仅面向所有者的读取/写入权限) 匹配。命令如下:

    [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

    上述命令应生成以下结果:

    -rw-r--r-- root root intermediate.crt
  6. 如果您使用自定义密钥创建您的 CSR 和由此生成的主机证书,请从 /etc/pki/tls/private/ 目录中删除或重命名旧密钥,然后在该目录中安装新密钥。

    注意

    有多种方法可以将自定义密钥上传到 EC2 实例,但最直接、最有益的方法是在本地计算机及 EC2 实例上各打开一个文本编辑器 (如 vi、nano、记事本等),然后在这两者之间复制、粘贴文件内容。当在 EC2 实例上执行这些操作时,您需要根 [sudo] 权限。这样,一旦有任何权限或路径问题,您可以立即看到。但请小心操作,不要在复制内容时添加任何多余的行或以任何方式更改内容。

    /etc/pki/tls/private 目录内部,检查文件所有权、组和权限设置是否与高度限制的 Amazon Linux 默认权限 (所有者=根权、组=根、仅面向所有者的读取/写入权限) 匹配。命令如下:

    [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
  7. 由于新的 CA 签名的主机证书的文件名 (在此示例中为 custom.crt) 可能与旧证书不同,请使用 Apache 的 SSLCertificateFile 指令编辑 /etc/httpd/conf.d/ssl.conf 并提供正确的路径和文件名:

    SSLCertificateFile /etc/pki/tls/certs/custom.crt

    如果您收到一个中间证书文件 (在此示例中为 intermediate.crt),请使用 Apache 的 SSLCACertificateFile 指令提供其路径和文件名:

    SSLCACertificateFile /etc/pki/tls/certs/intermediate.crt

    注意

    一些 CA 将主机证书和中间证书组合到一个文件中,便不再需要此指令了。请查询您的 CA 提供的说明。

    如果您安装了自定义私有密钥 (在此示例中为 custom.key),请使用 Apache 的 SSLCertificateKeyFile 指令提供其路径和文件名 :

    SSLCertificateKeyFile /etc/pki/tls/private/custom.key
  8. 保存 /etc/httpd/conf.d/ssl.conf 并重启 Apache。

    [ec2-user ~]$ sudo service httpd restart

步骤 3:测试和强化安全配置

在 SSL/TLS 可操作且公开发布后,应测试其实际安全性。使用在线服务 (例如 Qualys SSL Labs,该服务可对您的安全设置执行免费的全面分析) 可轻松执行此操作。根据结果,您可以决定通过控制接受的协议、首选的密码和排除的密码来强化默认安全配置。有关更多信息,请参阅 Qualys 如何用公式表示其分数

重要

实际测试对服务器的安全性非常重要。少量配置错误可能导致严重的安全漏洞和数据丢失。由于建议的安全实践会不断变化以响应调查和新兴威胁,因此定期安全审核对于良好的服务器管理来说是必不可少的。

Qualys SSL Labs 站点上,用 www.example.com 格式键入服务器的完全限定域名。约两分钟后,您将收到您站点的评级 (从 A 到 F) 和结果的详细信息。下表总结了具有与 Amazon Linux 上的默认 Apache 配置相同的设置以及默认 Certbot 证书的域的报告:

总评 B,
证书 100%
协议支持 95%
密钥交换 90%
密码强度 90%

该报告显示,配置通常是合理的,并且对证书、协议支持、密钥交换和密码强度问题的评级可接受。该配置还支持前向保密性,具有此功能的协议使用派生自私有密钥的临时 (暂时) 会话密钥进行加密。这意味着,在实践中,攻击者无法解密 HTTPS 数据,即使他们拥有 Web 服务器的长期私有密钥。但是,该报告还标志了一个会导致总体评级降低的严重漏洞,并指出一个额外的潜在问题:

  1. RC4 密码支持:密码是加密算法的数学核心。众所周知,用于加密 SSL/TLS 数据流的快速密码 RC4 具有多个重大弱点。修复方法是完全禁用 RC4 支持。我们还指定显式密码顺序和显式禁止密码列表。

    在配置文件 /etc/httpd/conf.d/ssl.conf 中,找到包含用于配置SSLCipherSuiteSSLProxyCipherSuite 且已注释掉的示例的部分。

    #SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5 #SSLProxyCipherSuite HIGH:MEDIUM:!aNULL:!MD5

    保留它们不变,并在它们下面添加以下指令:

    注意

    此处为方便阅读将指令显示为几行,但这两个指令必须各在一行上且密码名称之间不能有空格。

    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:AES:!aNULL:!eNULL:!EXPORT:!DES: !RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLProxyCipherSuite 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:AES:!aNULL:!eNULL:!EXPORT:!DES: !RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

    这些密码是 OpenSSL 中更长的受支持密码列表的子集。根据以下标准选择这些密码并对其进行排序:

    1. 对向前保密性的支持

    2. 强度

    3. 速度

    4. 具体密码位于密码系列之前

    5. 允许的密码位于拒绝的密码之前

    请注意,高级密码的名称中具有 ECDHE (表示 Elliptic Curve Diffie-Hellman Ephemeral);ephemeral 表示向前保密性。此外,RC4 现在位于禁止的密码中的结尾处。

    建议您使用密码的明确列表,而不依赖于内容不可见的默认值或简短指令。

    重要

    此处显示的密码列表只是许多可能的列表之一;例如,您可能希望优化列表以加快速度而不是向前保密性。

    如果您预计需要支持较旧的客户端,则可以允许 DES-CBC3-SHA 密码套件。

    最后,对 OpenSSL 的每次更新将引入新密码并弃用旧密码。使 EC2 Amazon Linux 实例保持最新,关注来自 OpenSSL 的安全公告,并留意技术出版物中对新安全漏洞的报告。有关更多信息,请参阅 Elastic Load Balancing 用户指南 中的 Elastic Load Balancing 的预定义 SSL 安全策略

    最后,通过删除“#”取消对以下行的注释:

    #SSLHonorCipherOrder on

    该命令强制服务器优先选择高级密码,包括 (在此示例中) 支持向前保密性的密码。启用此指令后,服务器会在回滚到允许的安全性较低的密码之前尝试建立高度安全的连接。

  2. 已淘汰协议支持:该配置支持 TLS 1.0 和 1.1 版,这两个版本都将要被淘汰,而对于 TLS 1.2 版,在 2018 年 6 月之后将会推荐使用。要使协议支持不过时,请用文本编辑器打开配置文件 /etc/httpd/conf.d/ssl.conf,通过在每行开头键入“#”注释掉以下行:

    #SSLProtocol all -SSLv3 #SSLProxyProtocol all -SSLv3

    然后,添加以下指令:

    SSLProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 SSLProxyProtocol -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2

    这些指令显式禁用 SSL 版本 2 和 3,以及 TLS 版本 1.0 和 1.1。服务器现在拒绝接受与任何不是使用非弃用 TLS 版本的客户端进行加密连接。指令中冗长的文字可更清楚地告知人类读者服务器的作用。

    注意

    以此方式禁用 TLS 1.0 和 1.1 版可阻止一小部分过时的 Web 浏览器访问您的网站。

保存对所编辑的配置文件进行的更改后,重启 Apache。

如果您在 Qualys SSL Labs 上再次测试域,应会发现 RC4 漏洞已修复,且摘要如下所示:

总评 A
证书 100%
协议支持 100%
密钥交换 90%
密码强度 90%

故障排除

  • 除非我提供密码,否则我的 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 service httpd restart

    Apache 现在启动时应该不会提示您提供密码。

附录:在 Amazon Linux 上将 Let's Encrypt 与 Certbot 结合使用

Let's Encrypt 证书颁发机构是电子前沿基金会 (EFF) 致力于加密整个 Internet 的核心所在。按照该目标,Let's Encrypt 主机证书被设计为用最小的人工干预来进行创建、验证、安装和维护。证书管理的自动化方面由在 Web 服务器上运行的代理执行。在安装并配置代理后,它与 Let's Encrypt 安全地通信并在 Apache 和密钥管理系统上执行管理任务。本教程使用免费的 Certbot 代理,因为它允许您提供自定义的加密密钥作为您证书的基础,或允许代理自身根据其默认值创建密钥。您也可以将 Certbot 配置为定期续订您的证书,无需人工交互,如下面的配置自动证书续订中所述。有关更多信息,请参阅 Certbot 用户指南手册页

重要

Certbot 开发人员提醒说,Amazon Linux 上的 Certbot 支持是试验性的。我们建议您在安装 Certbot 前拍摄您的 EBS 根卷快照,以便在出现错误时能轻松恢复。有关创建 EBS 快照的信息,请参阅创建 Amazon EBS 快照

安装并运行 Certbot

虽然 Amazon Linux 没有正式支持 Certbot,而且 Amazon Linux 程序包存储库中也不提供 Certbot,但它在安装后能正常运行。这些说明以有关在 RHEL 6 上安装 Certbot 的 EFF 文档为基础。

此过程介绍 Certbot 的默认使用,即根据 2048 位 RSA 密钥生成证书。如果您要试验自定义密钥,可以从将 ECDSA 证书与 Let's Encrypt 结合使用开始。

  1. 在您的实例上从 Fedora 项目启用 Extra Packages for Enterprise Linux (EPEL) 存储库。当您运行 Certbot 安装脚本时,EPEL 中的程序包作为依赖项是必需的。

    [ec2-user ~]$ sudo yum-config-manager --enable epel
  2. 使用以下命令,从 EFF 将最新版本的 Certbot 下载到您的 EC2 实例上。

    [ec2-user ~]$ wget https://dl.eff.org/certbot-auto
  3. 使下载的文件成为可执行文件。

    [ec2-user ~]$ chmod a+x certbot-auto
  4. 运行具有根权限和 --debug 标记的文件。

    [ec2-user ~]$ sudo ./certbot-auto --debug
  5. 在提示符“Is this ok [y/d/N]”处,键入“y”并按 Enter。

  6. 在提示符“Enter email address (used for urgent renewal and security notices)”处,键入联系人地址并按 Enter。

  7. 在提示符处,同意 Let's Encrypt 服务条款。键入“A”并按 Enter 以继续:

    ------------------------------------------------------------------------------- Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory ------------------------------------------------------------------------------- (A)gree/(C)ancel: A
  8. 通过连续单击完成授权以使 EFF 将您放入发送名单上,具体做法是键入“Y”或“N”并按 Enter。

  9. 在下面显示的提示符处,键入您的公用名 (您的域的名称,如上所述) 和您的主题替换名称 (SAN),两个名称之间用空格或逗号分隔。然后按 Enter。在此示例中,已经提供了这些名称:

    No names were found in your configuration files. Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):example.com www.example.com
  10. 在具有默认 Apache 配置的 Amazon Linux 系统上,您将看到类似以下示例的输出,询问您提供的第一个名称。键入“1”并按 Enter。

    Obtaining a new certificate Performing the following challenges: tls-sni-01 challenge for example.com tls-sni-01 challenge for www.example.com We were unable to find a vhost with a ServerName or Address of example.com. Which virtual host would you like to choose? (note: conf files with multiple vhosts are not yet supported) ------------------------------------------------------------------------------- 1: ssl.conf | | HTTPS | Enabled ------------------------------------------------------------------------------- Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
  11. 接下来,Certbot 询问第二个名称。键入“1”并按 Enter。

    We were unable to find a vhost with a ServerName or Address of www.example.com. Which virtual host would you like to choose? (note: conf files with multiple vhosts are not yet supported) ------------------------------------------------------------------------------- 1: ssl.conf | | HTTPS | Enabled ------------------------------------------------------------------------------- Press 1 [enter] to confirm the selection (press 'c' to cancel): 1

    此时,Certbot 创建密钥和 CSR:

    Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem
  12. 授权 Certbot 以创建所有必需的主机证书。在提示输入每个名称时,键入“1”并按 Enter,如示例所示:

    We were unable to find a vhost with a ServerName or Address of example.com. Which virtual host would you like to choose? (note: conf files with multiple vhosts are not yet supported) ------------------------------------------------------------------------------- 1: ssl.conf | | HTTPS | Enabled ------------------------------------------------------------------------------- Press 1 [enter] to confirm the selection (press 'c' to cancel): 1 Deploying Certificate for example.com to VirtualHost /etc/httpd/conf.d/ssl.conf We were unable to find a vhost with a ServerName or Address of www.example.com. Which virtual host would you like to choose? (note: conf files with multiple vhosts are not yet supported) ------------------------------------------------------------------------------- 1: ssl.conf | example.com | HTTPS | Enabled ------------------------------------------------------------------------------- Press 1 [enter] to confirm the selection (press 'c' to cancel): 1 Deploying Certificate for www.example.com to VirtualHost /etc/httpd/conf.d/ssl.conf
  13. 选择是否允许与您的 Web 服务器建立不安全的连接。如果您选择选项 2 (如示例所示),则所有与您服务器的连接都将被加密或拒绝。

    Please choose whether HTTPS access is required or optional. ------------------------------------------------------------------------------- 1: Easy - Allow both HTTP and HTTPS access to these sites 2: Secure - Make all requests redirect to secure HTTPS access ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

    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/example.com/fullchain.pem. Your cert will expire on 2017-07-19. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot-auto renew" ....
  14. 在完成安装后,测试并优化您服务器的安全性,如步骤 3:测试和强化安全配置中所述。

配置自动证书续订

Certbot 被设计成服务器系统的一个不可见的防错部分。默认情况下,它会生成具有短暂的 90 天到期时间的主机证书。在到期之前,如果您还未允许您的系统自动调用 certbot 命令,请手动重新运行该命令。此过程介绍如何通过设置 cron 作业来实现 Certbot 自动化。

  1. 首次成功运行 Certbot 后,用文本编辑器打开 /etc/crontab,并添加类似如下的行:

    39 1,13 * * * root /home/ec2-user/certbot-auto renew --no-self-upgrade --debug

    这是每个组件的说明:

    39 1,13 * * *

    排定一个在每天 01:39 和 13:39 运行的命令。所选的值是随机的,但 Certbot 开发人员建议每天运行该命令至少两次。

    root

    该命令使用根权限运行。

    /home/ec2-user/certbot-auto renew --no-self-upgrade --debug

    将要运行的命令。路径 /home/ec2-user/ 假定您已将 Certbot 安装到默认用户主目录中;可根据需要对此进行调整。renew 子命令会使 Certbot 检查任何先前获取的证书并续订即将到期的证书。--no-self-upgrade 标记可防止 Certbot 在没有您干预的情况下自行升级。--debug 标志可避免可能的兼容性问题。

    完成后保存文件。

  2. 重启 cron 守护程序:

    [ec2-user ~]$ sudo service crond restart