简介
TLS,即传输层安全,及其前身SSL,即安全套接字层,是用于将普通流量包装在受保护的加密包装中的网络协议。
使用这项技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部方拦截。证书系统还帮助用户验证他们正在连接的站点的身份。
在本指南中,您将学习如何为 Ubuntu 18.04 上的 Apache Web 服务器设置自签名 SSL 证书。
先决条件
要完成本教程,您需要:
一个已配置有sudo
权限和已启用防火墙的非root用户的 Ubuntu 18.04 服务器。您可以按照我们的《在 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
:这是用于创建和管理 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 地址。
所有提示的完整列表将输出如下:
Country Name (2 letter code) [AU]:USState or Province Name (full name) [Some-State]:New YorkLocality Name (eg, city) []:New York CityOrganization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.Organizational Unit Name (eg, section) []:Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) []:server_IP_addressEmail Address []:admin@your_domain.com
您创建的两个文件将放置在/etc/ssl
目录下的适当子目录中。
步骤 2 — 配置 Apache 使用 SSL
您已成功在/etc/ssl
目录下创建了密钥和证书文件。现在,您需要修改 Apache 配置以利用这些文件。
您将通过对配置进行一些调整来完成此操作:
创建配置片段以指定强大的默认 SSL 设置。修改包含的 SSL Apache 虚拟主机文件以指向您生成的 SSL 证书。(推荐)修改未加密的虚拟主机文件以自动将请求重定向到加密的虚拟主机。完成后,您将拥有一个安全的 SSL 配置。
创建具有强加密设置的 Apache 配置片段
首先,创建一个 Apache 配置片段来定义一些 SSL 设置。这将使用强大的 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 是一个有用且易于理解的资源,用于了解流行软件使用的加密设置。
为了您的目的,请完整复制提供的设置。不过,您需要做一个小小的修改,即禁用 Strict-Transport-Security
头部(HSTS)。
预加载 HSTS 可以提供增强的安全性,但如果意外启用或错误启用,可能会产生深远的后果。在本指南中,我们不会启用这些设置,但如果您确信理解了其影响,可以进行修改。
在决定之前,花点时间了解 HTTP 严格传输安全性(HSTS),特别是关于“预加载”功能。
现在将配置粘贴到 ssl-params.conf
文件中:
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM# 需要 Apache 2.4.36 和 OpenSSL 1.1.1SSLProtocol -all +TLSv1.3 +TLSv1.2SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1# 旧版本# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1SSLHonorCipherOrder On# 暂时禁用预加载 HSTS。如果您理解其影响,可以使用包含“preload”指令的已注释的头部行。# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"Header always set X-Frame-Options DENYHeader always set X-Content-Type-Options nosniff# 需要 Apache >= 2.4SSLCompression offSSLUseStapling onSSLStaplingCache "shmcb:logs/stapling-cache(150000)"# 需要 Apache >= 2.4.11SSLSessionTickets Off
完成后保存并关闭文件。如果您使用的是 nano
,可以按 CTRL + X
,然后输入 Y
和 ENTER
来完成。
修改默认的 Apache SSL 虚拟主机文件
接下来,您将修改 /etc/apache2/sites-available/default-ssl.conf
,默认的 Apache SSL 虚拟主机文件。如果您使用不同的服务器块文件,请在以下命令中替换其名称。
在开始之前,请备份原始的 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
在其中,大部分注释已被移除,虚拟主机文件默认包含以下内容:
<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
指令以指向您的证书和密钥文件。
进行这些更改后,您的服务器块应该如下所示:
<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 主机文件以重定向到 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 版本:
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . .</VirtualHost>
完成后保存并关闭文件。
步骤 3 — 调整防火墙
如果您已经启用了 ufw
防火墙,如先决条件指南中建议的那样,您可能需要调整设置以允许 SSL 流量。幸运的是,Apache 在安装时会向 ufw
注册一些配置文件。
通过运行以下命令查看可用配置文件的列表:
sudo ufw app list
输出应如下所示:
Available applications: Apache Apache Full Apache Secure OpenSSH
您可以通过检查状态来查看当前设置:
sudo ufw status
如果之前只允许了常规的 HTTP 流量,您的输出结果将如下所示:
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (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
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)
您现在已成功允许 Apache 流量通过防火墙。
步骤 4 — 在 Apache 中启用更改
现在您已经进行了更改并调整了防火墙,您可以在 Apache 中启用 SSL 和 headers 模块,启用准备好 SSL 的虚拟主机,并重新启动 Apache。
使用 a2enmod
命令启用 mod_ssl
,即 Apache SSL 模块,以及一些 SSL 片段中所需的 mod_headers
:
sudo a2enmod sslsudo a2enmod headers
接下来,使用 a2ensite
命令启用您的 SSL 虚拟主机:
sudo a2ensite default-ssl
您还需要启用您的 ssl-params.conf
文件,以读取您设置的值:
sudo a2enconf ssl-params
此时,您的站点和必要的模块已经启用。使用测试命令检查文件中是否有语法错误:
sudo apache2ctl configtest
如果一切顺利,您将得到以下结果:
AH00558: 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 messageSyntax OK
第一行是一条消息,告诉您未能可靠地确定服务器的完全合格域名,使用 127.0.1.1。要消除此消息,您可以在 /etc/apache2/apache2.conf
中将 ServerName
设置为服务器的域名或 IP 地址。这是可选的,因为该消息不会造成任何损害。
如果输出中包含 Syntax OK
,则您的配置文件没有语法错误。现在可以安全地重新启动 Apache 以实施更改:
sudo systemctl restart apache2
您已经进行了更改,接下来将测试您的 SSL 服务器。
步骤 5 — 测试加密
现在是时候测试您的 SSL 服务器了。首先打开您的网络浏览器,然后在地址栏中输入 https://
,后跟您服务器的域名或 IP:
https://server_domain_or_IP
由于您创建的证书未由浏览器信任的证书颁发机构签名,您可能会收到以下警告:
!Apache self-signed cert warning
这是预期的和正常的。我们只关心证书的加密方面,而不是主机真实性的第三方验证。点击 高级,然后点击提供的链接以继续访问您的主机:
!Apache self-signed override
您应该能够访问您的站点。在浏览器地址栏中,您将看到一个带有 “x” 的锁。这意味着无法验证证书。但它仍然加密您的连接。
如果您配置了 Apache 将 HTTP 重定向到 HTTPS,您还可以检查重定向是否正常工作:
http://server_domain_or_IP
如果结果显示相同的图标,这意味着您的重定向已经正确工作。
第六步 — 更改为永久重定向
如果你的重定向工作正常,并且确定只允许加密流量,你应该再次修改未加密的 Apache 虚拟主机配置,使重定向变为永久性的。
再次打开服务器块配置文件:
sudo nano /etc/apache2/sites-available/000-default.conf
找到之前添加的 Redirect
行。在该行中添加 permanent
,将重定向从 302 临时重定向更改为 301 永久重定向:
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . .</VirtualHost>
保存并关闭文件。
检查配置是否存在语法错误:
sudo apache2ctl configtest
当准备就绪时,重新启动 Apache 以使重定向变为永久性:
sudo systemctl restart apache2
你已成功将重定向设置为永久,以仅允许加密流量。
结论
你已经配置了 Apache 服务器以使用强加密来处理客户端连接。这将允许你安全地提供请求,并防止外部方读取你的流量。