TLS/SSL是用于将正常流量包装在受保护的加密包装中的Web协议。得益于此技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截。证书系统还可以帮助用户验证他们正在连接的站点的身份。
在本教程中,我们将向您展示如何在Ubuntu 18.04上设置用于Apache Web服务器的自签名SSL证书。
注意:自签名证书将加密服务器与任何客户端之间的通信。但是,由于Web浏览器不包含任何受信任的证书颁发机构的签名,因此用户无法使用该证书自动验证服务器的身份。 如果您没有与服务器关联的域名以及加密Web界面不向用户开放的实例,则可能需要使用自签名证书。如果你有一个域名,最好使用CA签名的证书。您可以在此处了解如何使用腾讯云免费的可信证书。
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
您将会被询问许多问题。在我们讨论之前,让我们看看我们发出的命令到底是什么意思:
rsa:2048
部分告诉它制作一个2048位长的RSA密钥。综上所述,这些选项将创建密钥文件和证书。我们将询问有关我们服务器的一些问题,以便将信息正确地嵌入到证书中。
适当填写提示。最重要的一行是请求Common Name (e.g. server FQDN or YOURname)的这行。您需要输入与服务器关联的域名,或者更可能是您服务器的公共IP地址。
整个提示将如下所示:
Country 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
目录下。
我们在/etc/ssl
目录下创建了密钥和证书文件。现在我们只需要修改我们的Apache配置就可以使用它们。
我们将对配置进行一些调整:
完成后,我们应该有一个安全的SSL配置。
首先,我们将创建一个Apache配置代码段来定义一些SSL设置。这将为Apache配置SSL安全设置,并启用一些有助于保证我们的服务器安全的高级功能。我们将设置的参数可由启用SSL的任何虚拟主机使用。
在/etc/apache2/conf-available
目录中创建一个新代码段。我们将文件命名为ssl-params.conf
:
sudo nano /etc/apache2/conf-available/ssl-params.conf
配置中,我们将禁用Strict-Transport-Security
头文件。加载HSTS
可提高安全性,但如果意外启用或启用错误,可能会产生严重的影响。在本教程中,我们不会启用设置,但如果您确定了解其含义,则可以对其进行修改。在您打算修改前,请花点时间阅读HTTP安全性相关内容,特别是有关“预加载”功能的部分。
将配置粘贴到我们打开的文件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
。如果您使用的是其他服务器块文件,请在下面的命令中替换其名称。
在继续之前,让我们备份原始的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。如果您不想要或不需要此功能,请跳过本节。
要将未加密的虚拟主机文件以将所有流量重定向为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>
完成后保存并关闭文件。
如果启用了ufw
防火墙,则必须按照准备教程的建议,调整设置以允许SSL流量。ufw在安装时注册了一些配置文件Apache。
我们可以通过输入来查看可用的配置文件
sudo ufw app list
您应该看到如下列表:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
您可以输入以下内容来查看当前设置:
sudo ufw status
如果您之前只允许常规HTTP流量,则输出可能如下所示:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
为了进一步允许HTTPS流量,我们可以允许“ApacheFull”配置文件,然后删除多余的“Apache”配置文件限额:
sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'
现在应该如下所示:
sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
现在我们已经进行了更改并调整了防火墙,我们可以在Apache中启用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
如果一切正确,您将得到如下结果:
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 message
Syntax OK
第一行只是一条消息,告诉您该ServerName
指令未全局设置。如果要删除该消息,可以在/etc/apache2/apache2.conf
中设置ServerName
服务器的域名或IP地址。
如果输出中包含输出Syntax OK
,则配置文件没有语法错误。我们可以重启Apache以实现我们的更改:
sudo systemctl restart apache2
现在,我们已准备好测试我们的SSL服务器。
打开Web浏览器,然后在服务器的域名或IP中输入地址栏:
https://server_domain_or_IP
由于我们创建的证书未由您的某个浏览器的受信任证书颁发机构签名,因此您可能会看到一个警告,如下所示:
这是正常的。我们只对证书的加密感兴趣,而不是对主机真实性的第三方验证感兴趣。单击“高级”,然后以继续进入您的网站:
你应该进入网站了。如果你在浏览器地址栏中查看,你会看到一个带有“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服务器配置为对客户端连接使用SSL加密。这样您就可以安全地处理请求,并阻止黑客阅读您的流量。但是自签名证书无法获取浏览器的信任,因此,我们还是建议您最好使用CA签名的证书。您可以在此处了解如何使用腾讯云免费的可信证书。
参考文献:《How To Create a Self-Signed SSL Certificate for Apache in Ubuntu 18.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。