介绍
TLS(Transport Layer Security)和其前身 SSL(Secure Sockets Layer)是用于将正常流量包装到受保护的加密包装中使用的网络协议。
使用这种技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性,证书系统还帮助用户验证他们正在连接的网站的身份。
在本指南中,您将学习如何在Ubuntu 16.04服务器上与Apache Web 服务器一起使用自签名的 SSL 证书。
注意:** 一个自签证书将加密您的服务器和任何客户端之间的通信,但是,由于它没有被包含在 Web 浏览器和操作系统中的任何一个受信任的证书机构签署,用户无法使用该证书自动验证您的服务器的身份。
由于这种限制,自签证证书不适合为公众服务的生产环境,通常用于测试,或者用于确保单个用户或小组用户使用的非关键服务,这些服务可以通过替代通信渠道建立信任证书的有效性。
要了解更多生产准备的证书解决方案,请参阅 Let’s Encrypt,这是一个免费的证书权威,您可以在我们的 How To Secure Apache with Let’s Encrypt on Ubuntu 16.04 教程中学习如何下载和配置 Let’s Encrypt 证书。
前提条件
在开始本教程之前,您将需要以下内容:
- 访问Ubuntu 16.04服务器,使用非root ,sudo启用的用户。 我们的[Initial Server setup with Ubuntu 16.04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-16-04) 指南可以教你如何创建这个账户.
- 联合国 您还需要安装 Apache 。 您可以使用
apt
安装 Apache 。 首先,更新本地包索引,以反映最新的上游变化: QQ 命令 sudo 适切更新 然后,安装apache2
软件包:\\ 命令 sudo apt 安装 apache2 ``` 最后,如果你有一个"ufw" 设置防火墙,打开http'和
https' 端口 :\\ 命令 Sudo ufw 允许“ Apache Full ” ``.,
完成这些步骤后,请确保您已登录为非root用户,并继续使用教程。
第1步:启用“mod_ssl”
在我们可以使用任何 SSL 证书之前,我们首先必须启用“mod_ssl”,这是一种支持 SSL 加密的 Apache 模块。
使用“a2enmod”命令启用“mod_ssl”:
1sudo a2enmod ssl
重启 Apache 以激活模块:
1sudo systemctl restart apache2
“mod_ssl”模块现在已启用并准备使用。
第2步:创建SSL证书
现在Apache已经准备好使用加密,我们可以继续生成一个新的SSL证书,该证书将存储一些关于您的网站的基本信息,并将伴随着一个关键文件,允许服务器安全地处理加密数据。
我们可以使用“openssl”命令创建SSL密钥和证书文件:
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 将我们创建的证书放在哪里 。 .
如上所述,这些选项将创建一个密钥文件和一个证书,我们将被问到关于我们的服务器的几个问题,以便正确嵌入证书中的信息。
正确地填写提示。最重要的行是请求“共同名称”的行。您需要输入您将使用的主机名称来访问服务器或服务器的公共IP。重要的是,这个字段与您在浏览器的地址栏中输入的任何内容相匹配,以便访问该网站,因为错误会导致更多的安全错误。
整个提示将看起来像这样的东西:
1Country Name (2 letter code) [XX]:US
2State or Province Name (full name) []:Example
3Locality Name (eg, city) [Default City]:Example
4Organization Name (eg, company) [Default Company Ltd]:Example Inc
5Organizational Unit Name (eg, section) []:Example Dept
6Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
7Email Address []:[email protected]
您创建的两个文件都将放置在 /etc/ssl
目录的相应子目录中。
步骤 3 – 配置 Apache 使用 SSL
在Ubuntu上,您可以将新的Apache配置文件(它们必须以 .conf
结束)放入 /etc/apache2/sites-available/
,并在下一次重新加载或重新启动Apache过程时将其加载。
对于本教程,我们将创建一个新的最小配置文件(如果您已经安装了Apache“
在 /etc/apache2/sites-available 目录中打开新文件:
1sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
插入以下最小 VirtualHost 配置:
1[label /etc/apache2/sites-available/your_domain_or_ip.conf]
2<VirtualHost *:443>
3 ServerName your_domain_or_ip
4 DocumentRoot /var/www/your_domain_or_ip
5
6 SSLEngine on
7 SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
8 SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
9</VirtualHost>
请确保更新“服务器名称”行,以便您打算地址您的服务器. 它可以是主机名称,全域名称或IP地址. 确保您选择的任何东西都匹配您在制作证书时选择的“通用名称”。
剩余的行指定一个“DocumentRoot”目录来服务文件,以及指向Apache新创建的证书和密钥所需的SSL选项。
现在,让我们创建我们的“DocumentRoot”,并将一个HTML文件放入其中,仅供测试:
1sudo mkdir /var/www/your_domain_or_ip
使用您的文本编辑器打开新的 index.html 文件:
1sudo nano /var/www/your_domain_or_ip/index.html
将以下内容放入空白文件中:
1[label /var/www/your_domain_or_ip/index.html]
2<h1>it worked!</h1>
当然,这不是一个完整的HTML文件,但浏览器很宽松,足以验证我们的配置。
保存和关闭文件 下一步,我们需要使用“a2ensite”工具启用配置文件:
1sudo a2ensite your_domain_or_ip.conf
它会提示您重新启动Apache以激活配置,但首先,让我们测试配置错误:
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 reload apache2
现在,在浏览器中加载您的网站,确保在开始时使用“https://”。
您应该看到一个错误. 对于自签证书来说,这是正常的! 浏览器正在警告您,它无法验证服务器的身份,因为我们的证书不是由任何已知的证书机构签署的。 对于测试和个人用途,这可能很好。
在您这样做之后,您的浏览器将加载“它工作了!”消息。
注意:如果您的浏览器根本不连接到服务器,请确保您的连接不会被防火墙阻止。
1sudo ufw allow "Apache Full"
“美元”
接下来,我们将为我们的配置添加另一个“VirtualHost”部分,以服务于简单的HTTP请求,并将其重定向到HTTPS。
第4步:将 HTTP 重定向到 HTTPS
目前,我们的配置只会响应“443”端口上的HTTPS请求。在“80”端口上也应该响应,即使你想强迫所有流量进行加密,也是很好的做法。
打开我们在之前步骤中开始的相同的 Apache 配置文件:
1sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf
在底部,创建另一个“VirtualHost”块来匹配端口“80”上的请求。 使用“ServerName”指令再次匹配您的域名或IP地址。 然后,使用“Redirect”来匹配任何请求,并将其发送到SSL“VirtualHost”。 请确保包含下面的缩略:
1[label /etc/apache2/sites-available/your_domain_or_ip.conf]
2<VirtualHost *:80>
3 ServerName your_domain_or_ip
4 Redirect / https://your_domain_or_ip/
5</VirtualHost>
完成后保存并关闭此文件,然后再测试配置语法,然后重新加载Apache:
1sudo apachectl configtest
2sudo systemctl reload apache2
你可以测试新的重定向功能,通过访问你的网站与简单的“http://”在地址前面. 你应该被重定向到“https://”自动。
结论
您现在已配置 Apache 以使用自签名的 SSL 证书来服务加密请求,并将未加密的 HTTP 请求重定向到 HTTPS。
如果您计划在公共网站上使用 SSL,您应该考虑购买域名并使用广泛支持的证书授权机构,例如 Let's Encrypt。
有关使用Let's Encrypt with Apache的更多信息,请阅读我们的教程(How To Secure Apache with Let's Encrypt on Ubuntu 16.04)。