介绍
TLS或传输层安全性及其前身SSL (代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。
使用此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。 证书系统还可以帮助用户验证他们正在连接的站点的身份。
在本指南中,我们将向您展示如何设置自签名SSL证书,以便在Debian 9上与Apache Web服务器一起使用。
注意:自签名证书将加密服务器与任何客户端之间的通信。 但是,由于Web浏览器不包含任何受信任的证书颁发机构的签名,因此用户无法使用该证书自动验证服务器的身份。
如果您没有与服务器关联的域名以及加密Web界面不面向用户的实例,则可能需要使用自签名证书。 如果您有域名,在许多情况下最好使用CA签名的证书。 您可以在此处了解如何使用Let's Encrypt项目设置免费的可信证书。
先决条件
在开始之前,您应该有一个配置了sudo
权限的非root用户。 您可以通过使用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在哪里放置我们正在创建的证书。
如上所述,这些选项将创建密钥文件和证书。 我们将询问有关我们服务器的一些问题,以便将信息正确地嵌入到证书中。
适当填写提示。 最重要的一行是请求Common Name (eg server FQDN or YOUR name)
。 您需要输入与服务器关联的域名,或者更可能是您服务器的公共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配置就可以利用它们。
我们将对配置进行一些调整:
- 我们将创建一个配置代码段来指定强大的默认SSL设置。
- 我们将修改包含的SSL Apache Virtual Host文件以指向我们生成的SSL证书。
- (推荐)我们将修改未加密的虚拟主机文件,以自动将请求重定向到加密的虚拟主机。
完成后,我们应该有一个安全的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,我们将使用Remy van Elst在Cipherli.st站点上的建议 。 此站点旨在为流行软件提供易于使用的加密设置。
链接到上述网站的建议设置提供了强大的安全性。 有时,这是以更高的客户端兼容性为代价的。 如果您需要支持较旧的客户端,可以通过单击标记为“是的,给我一个与旧版/旧版软件一起使用的密码套件”的页面上的链接来访问该列表。 该列表可以替换下面复制的项目。
您使用哪种配置的选择在很大程度上取决于您需要支持的内容。 它们都将提供很大的安全性。
出于我们的目的,我们可以完整地复制提供的设置。 我们将对此进行一个小的更改并禁用Strict-Transport-Security
标头(HSTS)。
预加载HSTS可提高安全性,但如果意外启用或启用错误,可能会产生深远的影响。 在本指南中,我们不会启用设置,但如果您确定了解其含义,则可以对其进行修改。
在决定之前,请花点时间阅读HTTP严格传输安全性或HSTS ,特别是有关“预加载”功能的信息 。
将以下配置粘贴到我们打开的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虚拟主机文件
接下来,让我们修改/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指令以指向我们的证书和密钥文件。 同样,如果您使用的是其他文档根目录,请务必更新DocumentRoot
指令。
进行这些更改后,您的服务器块应类似于:
<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>
完成后保存并关闭文件。
这是您需要对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和头模块,启用我们的SSL就绪虚拟主机,然后重新启动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服务器。
打开Web浏览器,在地址栏中输入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永久重定向:
<VirtualHost *:80>
. . .
Redirect permanent "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
保存并关闭文件。
检查配置是否存在语法错误:
sudo apache2ctl configtest
如果此命令未报告任何语法错误,请重新启动Apache:
sudo systemctl restart apache2
这会使重定向成为永久性的,您的网站将仅通过HTTPS提供流量。
结论
您已将Apache服务器配置为对客户端连接使用强加密。 这样您就可以安全地处理请求,并阻止外部人员阅读您的流量。