介绍
TLS,或 transport layer security,及其前身 SSL,即安全接口层,是用于在受保护的加密包装中包装正常流量的Web协议。
使用该技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性。
在本指南中,您将学习如何设置一个自签名的SSL证书,用于Ubuntu 18.04上的Apache Web 服务器。
注意:自签证证书将加密服务器和任何客户端之间的通信,但是,由于它不是由包含在 Web 浏览器中的任何一个受信任的证书授权机构(CA)签署的,用户无法使用该证书自动验证您的服务器的身份。
如果您没有与您的服务器相关联的域名,并且加密的 Web 接口不适合用户,则自签名证书可能是合适的。 如果您 do 拥有域名,在许多情况下最好使用 CA 签名的证书。
前提条件
要完成本教程,您将需要:
- 一个 Ubuntu 18.04 服务器具有非root 用户配置的
sudo
权限和启用防火墙. 您可以通过遵循我们的 初始服务器设置与 Ubuntu 18.04 * 安装了 Apache 网页服务器来设置此类用户帐户. 如果您想在您的服务器上安装一个完整的 LAMP (Linux, Apache, MySQL, PHP) 堆栈,您可以遵循我们的指南在 设置 LAMP 在 Ubuntu 18.04)。
完成前提条件后,继续到下一步。
第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 ' 号: 此选项将设定证书被视为有效的时间长度 。 在这种情况下,设定为一年.
-新rsa:2048': 在此指定您想要同时生成新证书和新密钥 。 签名证书所需的密钥不是在前一步创建的,所以需要与证书一起创建.
rsa:2048'部分要求它制作长为2048比特的RSA密钥。- " 钥匙 " : 此行告诉 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
目录中创建一个新的片段. 在这个例子中,我们将使用nano
创建文件,并命名文件ssl-params.conf
,以明确其目的。
1sudo nano /etc/apache2/conf-available/ssl-params.conf
为了安全地设置 Apache SSL,我们将调整来自 Cipherlist.eu的建议)。
<$>[注] 注 :从Cipherlist.eu提供的这些建议的设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表可以通过点击标签页面上的链接访问 ** `是的,给我一个与传统 / 旧软件一起工作的加密套件。
使用哪种配置的选择将很大程度上取决于您需要支持的内容,这两者都将提供极好的安全性。
为了您的目的,复制提供的设置全部. 但是,您将通过禁用严格运输安全
标题(HSTS)来进行一个小小的更改。
提前加载 HSTS 提供了增强的安全性,但如果意外启用或不正确启用,可能会产生深远的后果。
在决定之前,请花一会儿时间阅读 HTTP 严格运输安全,或 HSTS,特别是关于 重新加载
功能
现在将配置粘贴到 ssl-params.conf
文件中:
1[label /etc/apache2/conf-available/ssl-params.conf]
2
3SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
4# Requires Apache 2.4.36 & OpenSSL 1.1.1
5SSLProtocol -all +TLSv1.3 +TLSv1.2
6SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
7# Older versions
8# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
9SSLHonorCipherOrder On
10# Disable preloading HSTS for now. You can use the commented out header line that includes
11# the "preload" directive if you understand the implications.
12# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
13Header always set X-Frame-Options DENY
14Header always set X-Content-Type-Options nosniff
15# Requires Apache >= 2.4
16SSLCompression off
17SSLUseStapling on
18SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
19# Requires Apache >= 2.4.11
20SSLSessionTickets Off
如果您正在使用nano
,您可以通过按CTRL + X
,然后按Y
和ENTER
来做到这一点。
更改默认 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>
保存并关闭文件,当你完成。
第3步:调整防火墙
如果您已启用ufw
防火墙,根据前提指南的建议,您可能需要调整设置以允许SSL流量。
通过运行以下方式查看可用的配置文件列表:
1sudo ufw app list
产量应如下:
1[secondary_label Output]
2Available applications:
3 Apache
4 Apache Full
5 Apache Secure
6 OpenSSH
您可以通过检查状态来查看当前设置:
1sudo ufw status
如果您之前只允许正常的 HTTP 流量,您的输出结果将如下:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7Apache ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
9Apache (v6) ALLOW Anywhere (v6)
若要允许额外的 HTTPS 流量,您可以允许Apache Full
配置文件,然后删除余额的Apache
配置文件许可:
1sudo ufw allow 'Apache Full'
2sudo ufw delete allow 'Apache'
通过检查状态来确认更改:
1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7Apache Full ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
9Apache Full (v6) ALLOW Anywhere (v6)
您现在已经成功允许Apache流量到您的防火墙。
第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]
2AH00558: 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
3Syntax OK
第一行是一个消息告诉你‘ServerName’指令不是全球设置的。如果你想摆脱这个消息,你可以将‘ServerName’设置为你的服务器的域名或IP地址在‘/etc/apache2/apache2.conf’。
如果你的输出中有Syntax OK
,你的配置文件没有语法错误,现在你可以安全地重新启动Apache来实现你的更改:
1sudo systemctl restart apache2
您已做出更改,接下来您将测试您的SSL服务器。
步骤5:测试加密
现在是测试您的SSL服务器的时候了,开始打开您的Web浏览器,然后在地址栏中输入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
您已成功地使重定向永久,只允许加密的流量。
结论
您已配置您的 Apache 服务器以使用强大的加密为客户端连接,这将允许您安全地服务请求,并防止外部人员阅读您的流量。