如何在Ubuntu18.04中为Apache创建自签名SSL证书

来自菜鸟教程
跳转至:导航、​搜索

介绍

TLS传输层安全 及其前身 SSL 代表 安全套接字层 ,是用于包装正常的 Web 协议受保护的加密包装器中的流量。

使用这项技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外界截获消息。 证书系统还帮助用户验证他们正在连接的站点的身份。

在本指南中,您将了解如何设置自签名 SSL 证书以在 Ubuntu 18.04 上与 Apache Web 服务器一起使用。

注意: 自签名证书将加密您的服务器和任何客户端之间的通信。 但是,由于它没有由 Web 浏览器中包含的任何受信任的证书颁发机构 (CA) 签名,因此用户无法使用该证书自动验证您的服务器的身份。

如果您没有与您的服务器关联的域名以及加密的 Web 界面不是面向用户的情况,则自签名证书可能是合适的。 如果你 do 有一个域名,在很多情况下最好使用 CA 签名的证书。 阅读我们关于 如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护 Apache 的指南,了解有关如何设置免费可信证书的更多信息。


先决条件

要完成本教程,您需要:

  • 一台 Ubuntu 18.04 服务器,非 root 用户配置了 sudo 权限并启用了防火墙。 您可以按照我们的 Initial Server Setup with Ubuntu 18.04 来设置这样的用户帐户
  • 已安装 Apache Web 服务器。 如果您想在您的服务器上安装整个 LAMP(Linux、Apache、MySQL、PHP)堆栈,您可以按照我们关于 在 Ubuntu 18.04 上设置 LAMP 的指南进行操作。 如果您只想要 Apache Web 服务器,请跳过与 PHP 和 MySQL 有关的步骤。

完成先决条件后,继续下一步。

第 1 步 — 创建 SSL 证书

TLS/SSL 通过使用公共证书和私钥的组合来工作。 SSL 密钥在服务器上是保密的。 它用于加密发送给客户端的内容。 SSL 证书与任何请求内容的人公开共享。 它可用于解密由相关 SSL 密钥签名的内容。

您可以使用单个 OpenSSL 命令创建自签名密钥和证书对:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

这将引发一系列问题。 在讨论这些之前,先回顾一下您发出的命令中发生的情况:

  • openssl: This is the basic command line tool for creating and managing OpenSSL certificates, keys, and other files.
  • req: This subcommand specifies to use X.509 certificate signing request (CSR) management. “X.509”是 SSL 和 TLS 遵循的公钥基础设施标准,用于其密钥和证书管理。 要创建新的 X.509 证书,请使用此子命令。
  • -x509: This further modifies the previous subcommand by telling the utility to make a self-signed certificate instead of generating a certificate signing request, as would normally happen.
  • -nodes: This tells OpenSSL to skip the option to secure the certificate with a passphrase. 当服务器启动时,Apache 需要能够读取文件,而无需用户干预。 密码可以防止这种情况发生,因为用户必须在每次重启后输入密码。
  • -days 365: This option sets the length of time that the certificate will be considered valid. 在这种情况下,它设置为一年。
  • -newkey rsa:2048: This specifies that you want to generate a new certificate and a new key at the same time. 签署证书所需的密钥不是在上一步中创建的,因此需要与证书一起创建。 rsa:2048 部分告诉它生成一个 2048 位长的 RSA 密钥。
  • -keyout: This line tells OpenSSL where to place the generated private key file that’s being created.
  • -out: This tells OpenSSL where to place the certificate that’s being created.

如前所述,这些选项将创建密钥文件和证书。 为了将信息正确嵌入到证书中,系统会询问您一些有关服务器的问题。

适当地填写提示。 最重要的一行是请求通用名称的行(例如 服务器 FQDN 或您的姓名)。 您需要输入与您的服务器关联的域名,或者更有可能是您的服务器的公共 IP 地址。

整个提示列表将输出如下:

OutputCountry Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

您创建的两个文件都将放置在 /etc/ssl 下的相应子目录中。

第 2 步 — 将 Apache 配置为使用 SSL

您已在 /etc/ssl 目录下成功创建了密钥和证书文件。 现在,您需要修改 Apache 配置以利用这些优势。

您将通过对配置进行一些调整来做到这一点:

  1. 创建配置片段以指定强默认 SSL 设置。
  2. 修改包含的 SSL Apache 虚拟主机文件以指向您生成的 SSL 证书。
  3. (推荐)修改未加密的虚拟主机文件,自动将请求重定向到加密的虚拟主机。

完成后,您将拥有一个安全的 SSL 配置。

创建具有强加密设置的 Apache 配置片段

首先,创建一个 Apache 配置片段来定义一些 SSL 设置。 这将为 Apache 设置一个强大的 SSL 密码套件,并启用一些有助于保持服务器安全的高级功能。 任何启用 SSL 的虚拟主机都可以使用您设置的参数。

/etc/apache2/conf-available 目录中创建一个新片段。 在此示例中,我们将使用 nano 创建文件并将文件命名为 ssl-params.conf 以明确其用途。 随意使用您喜欢的文本编辑器:

sudo nano /etc/apache2/conf-available/ssl-params.conf

为了安全地设置 Apache SSL,我们将调整来自 Cipherlist.eu 的建议。 Cipherlist.eu 是一个有用且易于理解的资源,用于了解用于流行软件的加密设置。

注意:这些来自 Cipherlist.eu 的建议设置提供了强大的安全性。 有时,这是以更高的客户端兼容性为代价的。 如果您需要支持旧客户端,可以通过单击页面上标有 的链接访问替代列表“是的,给我一个适用于旧版/旧软件的密码套件。” 如果需要,您可以将该列表替换为下一个示例代码块的内容。

选择使用哪种配置很大程度上取决于您需要支持什么。 它们都将提供极大的安全性。


出于您的目的,请完整复制提供的设置。 不过,您可以通过禁用 Strict-Transport-Security 标头 (HSTS) 来做一点小改动。

预加载 HSTS 可提高安全性,但如果意外启用或启用不正确,可能会产生深远的影响。 在本指南中,我们不会启用这些设置,但如果您确定您理解其中的含义,您可以对其进行修改。

在决定之前,请花点时间阅读 HTTP Strict Transport Security 或 HSTS,特别是 “预加载”功能

现在将配置粘贴到 ssl-params.conf 文件中:

/etc/apache2/conf-available/ssl-params.conf

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes 
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

完成后保存并关闭文件。 如果您正在使用 nano,您可以按 CTRL + X,然后按 YENTER 来执行此操作。

修改默认 Apache SSL 虚拟主机文件

接下来,您将修改默认的 Apache SSL 虚拟主机文件 /etc/apache2/sites-available/default-ssl.conf。 如果您使用不同的服务器块文件,请在以下命令中替换其名称。

在开始之前,请备份原始 SSL 虚拟主机文件:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

现在,打开 SSL 虚拟主机文件进行调整:

sudo nano /etc/apache2/sites-available/default-ssl.conf

在内部,删除了大部分注释后,虚拟主机文件将默认包含以下内容:

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

您将对文件进行一些小的调整。 首先在虚拟主机文件中设置您想要调整的正常内容(例如 ServerAdmin 电子邮件地址、ServerName 等,并调整 SSL 指令指向到您的证书和密钥文件)。

进行这些更改后,您的服务器块应导致以下结果:

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

完成后保存并关闭文件。

(推荐)修改HTTP Host文件重定向到HTTPS

就目前而言,服务器将提供未加密的 HTTP 和加密的 HTTPS 流量。 为了更好的安全性,建议在大多数情况下自动将 HTTP 重定向到 HTTPS。 如果您不想要或不需要此功能,您可以安全地跳过本节。

要调整未加密的虚拟主机文件以将所有流量重定向到 SSL 加密,请打开 /etc/apache2/sites-available/000-default.conf 文件:

sudo nano /etc/apache2/sites-available/000-default.conf

VirtualHost 配置块中,添加一个 Redirect 指令,将所有流量指向站点的 SSL 版本:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

完成后保存并关闭文件。

第 3 步 — 调整防火墙

如果您按照先决条件指南的建议启用了 ufw 防火墙,您可能需要调整设置以允许 SSL 流量。 幸运的是,Apache 在安装时使用 ufw 注册了一些配置文件。

通过运行以下命令查看可用配置文件列表:

sudo ufw app list

输出应如下所示:

OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

您可以通过检查状态来查看当前设置:

sudo ufw status

如果您之前只允许常规 HTTP 流量,您的输出结果将如下所示:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

要允许额外的 HTTPS 流量,您可以允许“Apache Full”配置文件,然后删除多余的“Apache”配置文件允许:

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

通过检查状态确认更改:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

您现在已成功允许 Apache 流量进入您的防火墙。

第 4 步 — 启用 Apache 中的更改

现在您已经进行了更改并调整了防火墙,您可以在 Apache 中启用 SSL 和标头模块,启用 SSL-ready Virtual Host,然后重新启动 Apache。

使用 a2enmod 命令启用 mod_ssl、Apache SSL 模块和 mod_headers,这是 SSL 片段中的一些设置所需的:

sudo a2enmod ssl
sudo a2enmod headers

接下来,使用 a2ensite 命令启用 SSL 虚拟主机:

sudo a2ensite default-ssl

您还需要启用 ssl-params.conf 文件,以读取您设置的值:

sudo a2enconf ssl-params

此时,您的站点和必要的模块已启用。 通过测试检查以确保文件中没有语法错误:

sudo apache2ctl configtest

如果一切顺利,您将得到以下结果:

OutputAH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

第一行是一条消息,告诉您 ServerName 指令未全局设置。 如果您想摆脱该消息,您可以在 /etc/apache2/apache2.conf 中将 ServerName 设置为您服务器的域名或 IP 地址。 这是可选的,因为该消息不会造成任何伤害。

如果您的输出中有 Syntax OK,则说明您的配置文件没有语法错误。 您现在可以安全地重新启动 Apache 以实施您的更改:

sudo systemctl restart apache2

您已经进行了更改,接下来您将测试您的 SSL 服务器。

第 5 步 — 测试加密

现在是时候测试您的 SSL 服务器了。 首先打开您的网络浏览器,然后在地址栏中输入 https://,然后是您的服务器的域名或 IP:

https://server_domain_or_IP

由于您创建的证书未由浏览器的受信任证书颁发机构之一签名,因此您可能会收到如下警告:

这是预期和正常的。 我们只对我们证书的加密方面感兴趣,而不是对我们主机真实性的第三方验证。 单击 ADVANCED,然后单击提供的链接以继续访问您的主机:

您应该被带到您的网站。 在浏览器地址栏中,您将有一个带有“x”的锁。 这意味着无法验证证书。 它仍在加密您的连接。

如果您将 Apache 配置为将 HTTP 重定向到 HTTPS,您还可以检查重定向功能是否正确:

http://server_domain_or_IP

如果这导致相同的图标,这意味着您的重定向工作正常。

第 6 步 — 更改为永久重定向

如果您的重定向工作正常并且您确定只允许加密流量,您应该再次修改未加密的 Apache 虚拟主机以使重定向永久化。

再次打开您的服务器块配置文件:

sudo nano /etc/apache2/sites-available/000-default.conf

找到您之前添加的 Redirect 行。 将 permanent 添加到该行,这会将重定向从 302 临时重定向更改为 301 永久重定向:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

保存并关闭文件。

检查您的配置是否有语法错误:

sudo apache2ctl configtest

准备就绪后,重新启动 Apache 以使重定向永久化:

sudo systemctl restart apache2

您已成功将重定向永久设置为仅允许加密流量。

结论

您已将 Apache 服务器配置为对客户端连接使用强加密。 这将使您能够安全地处理请求,并防止外部各方读取您的流量。