介绍
TLS,或运输层安全,及其前身 SSL,即安全接口层,是用于在受保护的加密包装中包装正常流量的Web协议。
使用该技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性。
在本指南中,我们将向您展示如何在 Debian 9 上与 Apache Web 服务器一起使用自签名的 SSL 证书。
注: 一个自签证书将加密服务器和任何客户端之间的通信,但是,由于它不是由包含在 Web 浏览器中的任何一个受信任的证书机构签署的,用户无法使用该证书自动验证您的服务器的身份。
如果您没有与服务器相关联的域名,并且加密网页接口不针对用户,则可以使用自签名的证书。如果您有域名,在许多情况下最好使用CA签名的证书。
前提条件
在你开始之前,你应该有一个非根用户配置了sudo
权限,你可以通过遵循我们的 Debian 9 初始服务器设置来学习如何设置这样的用户帐户。
如果你想在你的服务器上安装一个完整的LAMP(Linux,Apache,MariaDB,PHP)堆栈,你可以遵循我们的指南在 设置LAMP在Debian 9。
当您完成这些前提条件后,继续下方。
第1步:创建SSL证书
TLS/SSL通过使用公共证书和私钥的组合工作 SSL 密钥在服务器上保密,用于加密发送给客户端的内容 SSL 证书被公开与任何要求内容的人共享,可用于解密由相关 SSL 密钥签名的内容。
我们可以用OpenSSL在一个命令中创建一个自签名的密钥和证书对:
1sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt
在我们谈论这一点之前,让我们看看我们发出的命令中发生了什么:
开放 : 这是创建和管理OpenSSL证书,密钥等文件的基本命令行工具. *** req* : 此子命令指定我们要使用 X. 509 证书签名请求( CSR) 管理 。 "X.509"是SSL和TLS为其密钥和证书管理所遵循的公钥基础设施标准. 我们希望创建一个新的 X. 509 证书, 所以我们正在使用这个子命令 。
- 联合国 -x509 :这进一步修改了上一个子命令,告诉了我们想要做一个自签名的证书而不是像通常那样生成证书签名请求的效用.
- -节点 :这告诉 OpenSSL 跳过选项,以密码口令我们的证书安全. 在服务器启动时,我们需要Apache能够在没有用户干预的情况下读取文件. 密码句可以防止这种情况发生,因为我们必须在每次重启后输入。
- ** 天数 365** :此选项设定证书被视为有效的时间长度。 我们在这里定了一年 *-新ersa:2048 : 它指定我们要同时生成新的证书和新的密钥 。 我们没有在前一个步骤中创建签名证书所需的密钥,所以我们需要与证书一起创建证书. `rsa:2048'部分要求它制作长为2048比特的RSA密钥。
- **- keyout ** :此行告诉 OpenSSL 将生成的私有密钥文件放置在哪里 。
- 联合国 ** 退出** : 这告诉 OpenSSL 将我们创建的证书放在哪里 。 .
如上所述,这些选项将创建一个密钥文件和一个证书,我们将被问到关于我们的服务器的几个问题,以便正确嵌入证书中的信息。
正确地填写提示。 ** 最重要的行是请求常用名称(例如服务器FQDN或您的名称)
的行。
整个提示将看起来像这样的东西:
1[secondary_label Output]
2Country Name (2 letter code) [AU]:US
3State or Province Name (full name) [Some-State]:New York
4Locality Name (eg, city) []:New York City
5Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
6Organizational Unit Name (eg, section) []:Ministry of Water Slides
7Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
8Email Address []:admin@your_domain.com
您创建的两个文件都将放置在适当的子目录中,在 /etc/ssl
下。
步骤 2 — 配置Apache使用SSL
我们在/etc/ssl
目录下创建了我们的密钥和证书文件,现在我们只需要修改我们的Apache配置以利用这些功能。
我们将对我们的配置做一些调整:
我们将创建一个配置片段,以指定强大的默认SSL设置。2.我们将更改包含的SSL Apache虚拟主机文件,以指向我们生成的SSL证书。3.(推荐)我们将更改未加密的虚拟主机文件,以自动重定向请求到加密的虚拟主机。
当我们完成时,我们应该有一个安全的SSL配置。
创建具有强大的加密设置的 Apache 配置片段
首先,我们将创建一个Apache配置片段来定义一些SSL设置,这将为Apache设置一个强大的SSL加密套件,并启用一些先进的功能,这将有助于保持我们的服务器安全。
在 /etc/apache2/conf-available
目录中创建一个新片段. 我们将命名该文件 `ssl-params.conf' 以明确其目的:
1sudo nano /etc/apache2/conf-available/ssl-params.conf
为了安全地设置Apache SSL,我们将使用Remy van Elst在Cipherli.st(https://cipherli.st)网站上的建议,该网站旨在为流行的软件提供易于使用的加密设置。
<$>[注意]上面的网站上的建议设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表可以通过点击页面上的链接来访问,标签为`是的,给我一个与传统 / 旧软件工作的加密套件。
您使用的配置选项将很大程度上取决于您需要支持的内容,这两者都将提供极好的安全性。
为了我们的目的,我们可以复制提供的设置全部. 我们只会对此进行一个小小的更改,并禁用严格运输安全
标题(HSTS)。
提前加载 HSTS 提供了增强的安全性,但如果意外启用或不正确启用,可能会产生深远的后果。
在做出决定之前,请花一会儿时间阅读 HTTP 严格运输安全,或 HSTS,特别是关于 重新加载
功能。
将以下配置粘贴到我们打开的 ssl-params.conf
文件中:
1[label /etc/apache2/conf-available/ssl-params.conf]
2SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
3SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
4SSLHonorCipherOrder On
5# Disable preloading HSTS for now. You can use the commented out header line that includes
6# the "preload" directive if you understand the implications.
7# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
8Header always set X-Frame-Options DENY
9Header always set X-Content-Type-Options nosniff
10# Requires Apache >= 2.4
11SSLCompression off
12SSLUseStapling on
13SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
14# Requires Apache >= 2.4.11
15SSLSessionTickets Off
保存并关闭文件,当你完成。
更改默认 Apache SSL 虚拟主机文件
接下来,让我们修改 /etc/apache2/sites-available/default-ssl.conf
,默认的 Apache SSL 虚拟主机文件. 如果您正在使用不同的服务器封锁文件,请在下面的命令中替换其名称。
在我们进一步前,让我们备份原始的 SSL 虚拟主机文件:
1sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
现在,打开 SSL 虚拟主机文件以进行调整:
1sudo nano /etc/apache2/sites-available/default-ssl.conf
内部,随着大多数评论被删除,虚拟主机块默认情况下应该看起来像这样:
1[label /etc/apache2/sites-available/default-ssl.conf]
2<IfModule mod_ssl.c>
3 <VirtualHost _default_:443>
4 ServerAdmin webmaster@localhost
5
6 DocumentRoot /var/www/html
7
8 ErrorLog ${APACHE_LOG_DIR}/error.log
9 CustomLog ${APACHE_LOG_DIR}/access.log combined
10
11 SSLEngine on
12
13 SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
14 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
15
16 <FilesMatch "\.(cgi|shtml|phtml|php)$">
17 SSLOptions +StdEnvVars
18 </FilesMatch>
19 <Directory /usr/lib/cgi-bin>
20 SSLOptions +StdEnvVars
21 </Directory>
22
23 </VirtualHost>
24</IfModule>
我们会对文件做一些小小的调整,我们会设置我们希望在虚拟主机文件(ServerAdmin电子邮件地址,ServerName等)中调整的正常内容,并调整SSL指令,以指向我们的证书和关键文件。
执行这些更改后,您的服务器块应该看起来像这样:
1[label /etc/apache2/sites-available/default-ssl.conf]
2<IfModule mod_ssl.c>
3 <VirtualHost _default_:443>
4 ServerAdmin your_email@example.com
5 ServerName server_domain_or_IP
6
7 DocumentRoot /var/www/html
8
9 ErrorLog ${APACHE_LOG_DIR}/error.log
10 CustomLog ${APACHE_LOG_DIR}/access.log combined
11
12 SSLEngine on
13
14 SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
15 SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
16
17 <FilesMatch "\.(cgi|shtml|phtml|php)$">
18 SSLOptions +StdEnvVars
19 </FilesMatch>
20 <Directory /usr/lib/cgi-bin>
21 SSLOptions +StdEnvVars
22 </Directory>
23
24 </VirtualHost>
25</IfModule>
保存并关闭文件,当你完成。
(推荐)修改HTTP主机文件重定向到HTTPS
目前,服务器将提供未加密的 HTTP 和加密的 HTTPS 流量. 为了更好的安全性,建议在大多数情况下自动将 HTTP 重定向到 HTTPS. 如果您不想要或需要此功能,您可以安全地跳过本节。
要调整未加密的虚拟主机文件,将所有流量重定向到 SSL 加密,请打开 /etc/apache2/sites-available/000-default.conf
文件:
1sudo nano /etc/apache2/sites-available/000-default.conf
在内部,在VirtualHost
配置块中,添加一个重定向
指令,将所有流量指向网站的SSL版本:
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3 . . .
4
5 Redirect "/" "https://your_domain_or_IP/"
6
7 . . .
8</VirtualHost>
保存并关闭文件,当你完成。
接下来,我们将讨论如何用ufw
更新防火墙规则,以允许加密的HTTPS流量到您的服务器。
第3步:调整防火墙
如果您已启用了ufw
防火墙,根据前提指南的建议,您可能需要调整设置以允许SSL流量。
我们可以通过键入查看可用的配置文件:
1sudo ufw app list
您应该看到这样的列表,输出底部有以下四个配置文件:
1[secondary_label Output]
2Available applications:
3. . .
4 WWW
5 WWW Cache
6 WWW Full
7 WWW Secure
8. . .
您可以通过键入查看当前设置:
1sudo ufw status
如果您以前只允许正常的 HTTP 流量,您的输出可能会看起来像这样:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7WWW ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
9WWW (v6) ALLOW Anywhere (v6)
要进一步允许 HTTPS 流量,请允许WWW 完整
配置文件,然后删除多余的WWW
配置文件允许:
1sudo ufw allow 'WWW Full'
2sudo ufw delete allow 'WWW'
你的状态现在应该是这样的:
1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7WWW Full ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
9WWW Full (v6) ALLOW Anywhere (v6)
随着您的防火墙配置以允许 HTTPS 流量,您可以转到下一步,我们将讨论如何启用几个模块和配置文件,以允许 SSL 正常工作。
第4步:在Apache中启用更改
现在,我们已经进行了更改并调整了防火墙,我们可以在Apache中启用SSL和标题模块,启用SSL准备的虚拟主机,然后重新启动Apache来实施这些更改。
使用a2enmod
命令,启用mod_ssl
,Apache SSL模块和mod_headers
,这是我们SSL片段中的一些设置所需要的:
1sudo a2enmod ssl
2sudo a2enmod headers
接下来,使用a2ensite
命令启用您的 SSL 虚拟主机:
1sudo a2ensite default-ssl
您还需要启用您的 ssl-params.conf
文件,以读取您已设置的值:
1sudo a2enconf ssl-params
在此时,网站和必要的模块已启用,我们应该检查,以确保我们的文件中没有语法错误。
1sudo apache2ctl configtest
如果一切顺利,你会得到一个看起来像这样的结果:
1[secondary_label Output]
2Syntax OK
只要你的输出有Syntax OK
,那么你的配置文件没有语法错误,你可以安全地重新启动Apache来实现这些更改:
1sudo systemctl restart apache2
有了它,您的自签名的SSL证书已全部设置,您现在可以测试您的服务器是否正确地加密其流量。
步骤5:测试加密
现在你已经准备好测试你的SSL服务器了。
打开您的网页浏览器,然后输入https://
,然后输入您的服务器的域名或IP地址栏:
1https://server_domain_or_IP
由于您创建的证书不是由您的浏览器的可信证书机构之一签署的,您可能会看到一个可怕的警告,如下面的警告:
我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。
您应该被带到您的网站. 如果您查看浏览器地址栏,您将看到一个锁有x
或其他类似的不安全
通知。在这种情况下,这只是意味着证书无法验证。
如果您将 Apache 配置为将 HTTP 重定向到 HTTPS,您还可以检查重定向是否正常工作:
1http://server_domain_or_IP
如果结果是相同的图标,这意味着您的重定向工作正确。但是,您之前创建的重定向只是暂时的重定向。
步骤 6 — 更改到永久重定向
如果您的重定向工作正确,并且您确信只希望允许加密流量,您应该再次修改未加密的 Apache Virtual Host,以使重定向永久。
再次打开服务器封锁配置文件:
1sudo nano /etc/apache2/sites-available/000-default.conf
添加永久
到该行,将重定向从302临时重定向更改为301永久重定向:
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3 . . .
4
5 Redirect permanent "/" "https://your_domain_or_IP/"
6
7 . . .
8</VirtualHost>
保存并关闭文件。
检查您的配置语法错误:
1sudo apache2ctl configtest
如果此命令没有报告任何语法错误,请重新启动 Apache:
1sudo systemctl restart apache2
这将使重定向永久,您的网站只会通过HTTPS提供流量。
结论
您已经配置了 Apache 服务器,以便为客户端连接使用强大的加密,这将使您能够安全地处理请求,并防止外部人员阅读您的流量。