介绍
TLS或传输层安全,它的前身SSL,它代表安全套接字层,是Web协议用来包裹在一个受保护,加密封装正常通行。
使用此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会有外部各方拦截消息的可能性。 证书系统还帮助用户验证他们正在连接的站点的身份。
在本指南中,我们将向您展示如何设置自签名SSL证书,以便在Ubuntu 16.04服务器上与Apache Web服务器配合使用。
注:自签名证书将在您的服务器和所有客户端之间的通信进行加密。 但是,由于它未由Web浏览器中包含的任何受信任的证书颁发机构签名,因此用户无法使用该证书自动验证服务器的身份。
如果您没有与服务器关联的域名,并且对于加密的Web界面不是面向用户的情况,自签名证书可能是适当的。 如果您有一个域名,在很多情况下,最好使用CA签发的证书。 你可以了解如何建立与咱们加密项目的自由受信任的证书这里 。
先决条件
在开始之前,你应该有一个配置非root用户sudo
权限。 你可以学习如何按照我们建立这样一个用户帐户为Ubuntu 16.04的初始服务器设置 。
您还需要安装Apache Web服务器。 如果你想安装一个完整的LAMP(Linux操作系统,Apache,MySQL和PHP)的服务器上,你可以按照我们的指南在Ubuntu 16.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
部分告诉它做的RSA密钥是2048位。 - -keyout:这行告诉OpenSSL的在什么地方,我们正在创建的生成私钥文件。
- 退房手续 :这告诉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
目录。
当我们使用OpenSSL,我们也应该建立一个强大的Diffie-Hellman组,这是在谈判中使用完全正向保密与客户。
我们可以通过键入:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这可能需要几分钟,但是当它这样做,你将有一个强大的DH组/etc/ssl/certs/dhparam.pem
,我们可以在我们的配置中使用。
第2步:配置Apache以使用SSL
我们已经创建了我们的下密钥和证书文件/etc/ssl
目录。 现在我们只需要修改我们的Apache配置以利用这些。
我们将对我们的配置进行一些调整:
- 我们将创建一个配置代码段,以指定强大的默认SSL设置。
- 我们将修改包括的SSL Apache虚拟主机文件以指向我们生成的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安全,我们将利用这些建议雷米面包车埃尔斯特的Cipherli.st网站。 此网站旨在为流行软件提供易于使用的加密设置。 你可以阅读更多关于他的关于Apache的抉择决定在这里 。
与上述链接的网站上的建议设置提供了强大的安全性。 有时,这是以增加客户端兼容性为代价的。 如果您需要支持较旧的客户端,还有一个备用列表,可以通过单击页面上标记为“是,给我一个与旧版软件一起使用的密码组”的链接来访问。 该列表可以替代以下复制的项目。
选择使用哪个配置很大程度上取决于您需要支持哪些配置。 他们都将提供很大的安全性。
为了我们的目的,我们可以全部复制提供的设置。 我们只做两个小的改动。
设置SSLOpenSSLConfCmd DHParameters
指令指向我们先前所产生的的Diffie-Hellman文件。 另外,花点时间读上了HTTP严格传输安全,或HSTS ,特别是有关“预紧力”的功能 。 预加载HSTS提供了更高的安全性,但如果意外启用或启用不正确,可能会产生深远的影响。 在本指南中,我们不会预加载设置,但如果您确定您了解其含义,则可以修改此设置:
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
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 Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLSessionTickets Off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"
保存并在完成后关闭文件。
修改默认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>
# BrowserMatch "MSIE [2-6]" \
# nokeepalive ssl-unclean-shutdown \
# downgrade-1.0 force-response-1.0
</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>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
保存并在完成后关闭文件。
(推荐)修改未加密的虚拟主机文件以重定向到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
你应该看到这样的列表:
OutputAvailable applications:
Apache
Apache Full
Apache Secure
OpenSSH
您可以通过键入以下内容查看当前设置:
sudo ufw status
如果您之前仅允许常规HTTP流量,您的输出可能如下所示:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (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
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
第4步:启用Apache中的更改
现在我们已经进行了更改并调整了防火墙,我们可以启用Apache中的SSL和标头模块,启用SSL就绪的虚拟主机,然后重新启动Apache。
我们可以启用mod_ssl
,Apache的SSL模块和mod_headers
,通过一些在我们的SSL片断的设置,与所需的a2enmod
命令:
sudo a2enmod ssl
sudo a2enmod headers
接下来,我们可以使我们的SSL虚拟主机a2ensite
命令:
sudo a2ensite default-ssl
我们还需要使我们的ssl-params.conf
文件中,我们设置的值改为:
sudo a2enconf ssl-params
此时,我们的网站和必要的模块已启用。 我们应该检查以确保我们的文件中没有语法错误。 我们可以通过键入:
sudo apache2ctl configtest
如果一切都成功,你会得到一个如下所示的结果:
OutputAH00558: 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
Syntax OK
第一行就是告诉您一个消息ServerName
指令不是全局设置。 如果你想摆脱那个消息时,你可以设置ServerName
在您的服务器的域名或IP地址/etc/apache2/apache2.conf
。 这是可选的,因为消息不会有害。
如果您的输出有Syntax OK
在里面,你的配置文件没有语法错误。 我们可以安全地重新启动Apache来实现我们的更改:
sudo systemctl restart apache2
第5步:测试加密
现在,我们准备测试我们的SSL服务器。
打开Web浏览器并输入https://
,后跟服务器的域名或IP到地址栏:
https://server_domain_or_IP
因为我们创建的证书不是由您的浏览器的可信证书颁发机构签名的,因此您可能会看到类似下面的警告:
这是预期和正常的。 我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。 点击“ADVANCED”,然后提供的链接继续到你的主机:
您应该被带到您的网站。 如果你在浏览器的地址栏,你会看到一个锁有一个“x”。 在这种情况下,这只是意味着无法验证证书。 它仍在加密您的连接。
如果您配置Apache将HTTP重定向到HTTPS,您还可以检查重定向是否正确:
http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正常。
第6步:更改为永久重定向
如果重定向工作正常,并且您确定要仅允许加密流量,则应该再次修改未加密的Apache Virtual Host,使重定向永久生效。
再次打开服务器块配置文件:
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服务器配置为对客户端连接使用强加密。 这将允许您安全地提供请求,并防止外部各方读取您的流量。