如何在Debian9中为Apache创建自签名SSL证书

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

介绍

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

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

在本指南中,我们将向您展示如何设置自签名 SSL 证书以用于 Debian 9 上的 Apache Web 服务器。

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

如果您没有与您的服务器关联的域名以及加密的 Web 界面不是面向用户的情况,则自签名证书可能是合适的。 如果你 do 有一个域名,在很多情况下最好使用 CA 签名的证书。 您可以在此处 的 Let's Encrypt 项目 中了解如何设置免费的可信证书。


先决条件

在开始之前,您应该有一个配置有 sudo 权限的非 root 用户。 您可以按照我们的 Initial Server Setup with Debian 9 学习如何设置这样的用户帐户。

您还需要安装 Apache Web 服务器。 如果您想在您的服务器上安装整个 LAMP(Linux、Apache、MariaDB、PHP)堆栈,您可以按照我们关于 在 Debian 9 上设置 LAMP 的指南进行操作。 如果您只想要 Apache Web 服务器,请跳过与 PHP 和 MariaDB 有关的步骤。

完成这些先决条件后,请继续以下操作。

第 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:这是用于创建和管理 OpenSSL 证书、密钥和其他文件的基本命令行工具。
  • req:此子命令指定我们要使用 X.509 证书签名请求 (CSR) 管理。 “X.509”是 SSL 和 TLS 遵循的公钥基础设施标准,用于其密钥和证书管理。 我们想创建一个新的 X.509 证书,所以我们使用这个子命令。
  • -x509:这进一步修改了前面的子命令,告诉实用程序我们要制作自签名证书,而不是像通常发生的那样生成证书签名请求。
  • -nodes:这告诉 OpenSSL 跳过使用密码保护我们的证书的选项。 当服务器启动时,我们需要 Apache 能够读取文件,而无需用户干预。 密码可以防止这种情况发生,因为我们必须在每次重启后输入它。
  • -days 365:此选项设置证书将被视为有效的时间长度。 我们在这里设置了一年。
  • -newkey rsa:2048:这指定我们要同时生成一个新证书和一个新密钥。 我们没有在上一步中创建签署证书所需的密钥,因此我们需要将其与证书一起创建。 rsa:2048 部分告诉它生成一个 2048 位长的 RSA 密钥。
  • -keyout:这一行告诉 OpenSSL 将我们正在创建的生成的私钥文件放在哪里。
  • -out:这告诉 OpenSSL 在哪里放置我们正在创建的证书。

如上所述,这些选项将创建密钥文件和证书。 我们将被问到一些关于我们服务器的问题,以便将信息正确地嵌入到证书中。

适当地填写提示。 最重要的一行是请求通用名称的行(例如 服务器 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 目录中创建一个新片段。 我们将文件命名为 ssl-params.conf 以明确其用途:

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

为了安全地设置 Apache SSL,我们将使用 Cipherli.st 站点上 Remy van Elst 的建议。 该站点旨在为流行软件提供易于使用的加密设置。

上面链接的网站上的建议设置提供了强大的安全性。 有时,这是以更高的客户端兼容性为代价的。 如果您需要支持旧客户端,可以通过单击页面上标有“是的,给我一个适用于旧版/旧版软件的密码套件”的链接访问一个替代列表。 该列表可以代替下面复制的项目。

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


出于我们的目的,我们可以完整地复制提供的设置。 我们将对此进行一点小改动并禁用 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:AES256+EECDH:AES256+EDH
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

完成后保存并关闭文件。

修改默认 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 指令以指向我们的证书和密钥文件。 同样,如果您使用不同的文档根目录,请务必更新 DocumentRoot 指令。

进行这些更改后,您的服务器块应如下所示:

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

完成后保存并关闭文件。

这就是您需要对 Apache 进行的所有配置更改。 接下来,我们将讨论如何使用 ufw 更新防火墙规则,以允许加密的 HTTPS 流量到您的服务器。

第 3 步 — 调整防火墙

如果您按照先决条件指南的建议启用了 ufw 防火墙,您可能需要调整设置以允许 SSL 流量。 幸运的是,当安装在 Debian 9 上时,ufw 加载了应用配置文件,您可以使用这些配置文件来调整防火墙设置

我们可以通过键入以下内容查看可用的配置文件:

sudo ufw app list

您应该会看到这样的列表,在输出底部附近有以下四个配置文件:

OutputAvailable applications:
. . .
  WWW
  WWW Cache
  WWW Full
  WWW Secure
. . .

您可以通过键入以下内容查看当前设置:

sudo ufw status

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

OutputStatus: active

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

要另外允许 HTTPS 流量,请允许“WWW Full”配置文件,然后删除多余的“WWW”配置文件允许:

sudo ufw allow 'WWW Full'
sudo ufw delete allow 'WWW'

您的状态现在应该如下所示:

sudo ufw status
OutputStatus: active

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

将防火墙配置为允许 HTTPS 流量后,您可以继续下一步,我们将介绍如何启用一些模块和配置文件以允许 SSL 正常运行。

第 4 步 — 启用 Apache 中的更改

现在我们已经进行了更改并调整了防火墙,我们可以在 Apache 中启用 SSL 和 headers 模块,启用我们的 SSL-ready 虚拟主机,然后重新启动 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

如果一切顺利,您将得到如下所示的结果:

OutputSyntax OK

只要您的输出中有 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

如果这导致相同的图标,这意味着您的重定向工作正常。 但是,您之前创建的重定向只是临时重定向。 如果您希望永久重定向到 HTTPS,请继续执行最后一步。

第 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

这将使重定向永久化,并且您的站点将仅通过 HTTPS 提供流量。

结论

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