在 Ubuntu 20.04 上使用自签名 TLS/SSL 证书保护 Apache

介绍

传输层安全 (TLS) 和安全套接字层 (SSL) 都是基于 Internet 的安全协议,它们通过网络对数据进行加密。 例如,当客户端连接到您的网络服务器以请求网页时,您应该在收到他们的敏感数据(例如密码和信用卡信息)时使用 TLS/SSL 证书对连接进行加密。

当您在客户端(例如,Web 浏览器、移动应用程序或桌面软件)和服务器系统(例如 Apache)之间以纯文本形式交换机密信息时,Internet 上始终存在严重的网络威胁。 因此,您需要在系统之间实施安全层。 这就是 SSL/TLS 证书发挥作用的地方。

要生成 SSL/TLS 证书,您首先要在您的服务器上创建一个证书签名请求 (CSR),它会生成一个公钥/私钥对和一个标识您网站名称的主题。 然后,您只需将 CSR 发送到受信任的证书颁发机构 (CA) 进行签名即可。

有时,无需将用于签名的证书发送给公共信任的第三方 CA。 您可以使用 OpenSSL 轻松部署和自定义自签名证书,而不会产生任何成本。 但是,只有您可以信任该证书,任何尝试连接到您的 Web 服务器的人都会在其浏览器中收到警告。 尽管如此,在执行初始配置时,这些类型的证书非常适合内部网络和测试环境。

在本指南中,您将使用 Ubuntu 20.04 服务器上的自签名证书保护 Apache 网络服务器。

先决条件

要完成本指南,请确保您具备以下条件:

一个 Ubuntu 20.04 服务器。 一个 sudo 用户。 一个 Apache 网络服务器。

1.生成私钥和证书文件

使用 SSL/TLS 协议保护您的网络流量时,您只需与任何人共享您的公钥并将您的私钥保存在您的服务器上。 要创建这些密钥,请运行以下命令 openssl 命令。

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache.key -out /etc/ssl/certs/apache.crt

openssl 命令解释:

请求 -x509: 您正在使用此选项创建自签名证书,而不是生成 CSR。

-节点: 通过指定这个选项,你告诉 openssl 以避免使用密码短语加密私钥。 这是因为您不希望每次服务器重新启动时都手动输入密码。 Apache 应该在没有您干预的情况下读取此文件。

-天数: 这是您希望证书保持有效的天数。 例如 365 天。

-newkey rsa:2048: 您可以使用此选项声明显式密钥大小。 可接受的最小文件是 512 位,但更大的值 2048 提供更多安全性。

-keyout 文件名: 这是您保存新创建的私钥的文件名。

– 输出文件名: 在这里,您指定一个输出 *.crt 文件来存储您的签名证书。

一旦你执行 openssl 命令,系统会提示您提供以下信息以生成证书。 输入适当的值并在每次响应后按 ENTER。

Country Name (2 letter code) [AU]: Keyin a two-letter code of your country. For instance KE, or USA.
State or Province Name (full name) [Some-State]: Enter a full name for your state, for instance, CALIFORNIA.
Locality Name (eg, city) []: Enter your city e.g. LOS ANGELES.
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Enter the name of your organization. For instance, SAMPLE COMPANY
Organizational Unit Name (eg, section) []: Key in your organization department e.g. IT.
Common Name (e.g. server FQDN or YOUR name) []: Enter the fully qualified domain name or IP address for your server. For instance example.com or 192.0.2.1.
Email Address []: Enter your email address e.g. [email protected]

完成信息提供后, openssl 命令应在以下位置生成私钥和证书文件。

/etc/ssl/private/apache.key
/etc/ssl/certs/apache.crt

您现在已经为您的 SSL/TLS 证书生成了必要的文件。 在下一步中,您将在 Apache 虚拟主机文件上配置 SSL/TLS 设置。

2. 在虚拟主机文件上启用 SSL

Apache 维护一个默认的虚拟主机文件来处理 SSL 下的流量 /etc/apache2/sites-available 目录命名 default-ssl.conf. 为了让网络服务器使用您的证书加密数据,您将在此文件中进行一些配置更改。

nano 文本编辑器打开 /etc/apache2/sites-available/default-ssl.conf 文件。

$ sudo nano /etc/apache2/sites-available/default-ssl.conf

在此文件中,找到该行 ServerAdmin [email protected] 如下所示。

...

ServerAdmin [email protected]

DocumentRoot /var/www/html
...

在上面的行下,添加 ServerName name 指令后跟您的域名或服务器的公共 IP 地址,如下所示。

...

ServerAdmin [email protected]
ServerName 192.0.2.1
DocumentRoot /var/www/html
...

然后,仍然在同一个文件中,找到下面的 SSL 设置。

SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

指定证书的完整文件路径 (/etc/ssl/certs/apache.crt) 和私钥 (/etc/ssl/private/apache.key)。 两行编辑后应如下所示。

SSLCertificateFile    /etc/ssl/certs/apache.crt
SSLCertificateKeyFile /etc/ssl/private/apache.key

完成编辑后保存并关闭文件。 接下来,使用Apache a2enmod 命令启用 ssl 模块。

$ sudo a2enmod ssl

然后,使用 a2ensite 启用 default-ssl.conf 虚拟主机文件。

$ sudo a2ensite default-ssl.conf

重新启动 Apache 网络服务器以加载新更改。

$ sudo systemctl restart apache2

您的 apache Web 服务器现在已准备好提供加密内容。 但是,在测试新设置之前,您需要配置防火墙以允许通过端口的安全连接 443.

3. 在防火墙上启用 SSL 端口

在 Apache 中,您应该允许通过端口交换安全流量 443 与默认端口相反 80 它以纯文本形式发送数据。 您可以启用 HTTPS 端口使用 ufw 公用事业。 首先,通过执行以下命令启用防火墙。

$ sudo ufw enable

出现提示时,按 Y 和 ENTER。 确保您得到以下回复。

Firewall is active and enabled on system startup

接下来,让 Apache 监听两个端口 80443 通过执行下面的命令。

$ sudo ufw allow 'Apache Full'

输出。

Rule added
Rule added (v6)

为避免将自己锁定在服务器之外,请允许 ssh 通过连接 OpenSSH 端口通过运行以下命令。

$ sudo ufw allow 'OpenSSH'

输出。

Rule added
Rule added (v6)

确保根据您正在运行的应用程序打开了任何其他端口。 然后,执行 ufw status 命令来检查您是否已成功添加新的防火墙规则。

$ sudo ufw status

您应该会收到以下输出。

To                         Action      From
--                         ------      ----
Apache Full                ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
Apache Full (v6)           ALLOW       Anywhere (v6)
OpenSSH (v6)               ALLOW       Anywhere (v6)
...

您现在已将防火墙配置为允许到您的网络服务器的加密流量。 在下一步中,您将访问您的安全站点并查看是否一切正常。

4. 测试新配置

在网络浏览器中访问下面的 URL 并替换 192.0.2.1 使用正确的公共 IP 地址或域名。 确保您使用的是 https:// 协议。

https://192.0.2.1

您的 Apache 服务器现在应该加密您可能尝试使用 SSL/TLS 证书交换的任何数据。 请注意,当您访问该页面时,您的浏览器可能会发出警告(Your connection is not private) 因为此证书不是由受信任的 CA 签署的。 但是,只需取消警告并访问该页面,因为您只对证书的加密部分感兴趣。 在下一步中,您将引导任何尝试通过不安全端口连接到服务器的人 80 到加密端口 443.

5. 将 HTTP 流量重定向到 HTTPS(可选)

生成、设置和测试 SSL/TLS 证书后,您可以选择重定向任何 HTTP 交通到 HTTPS 通过编辑 /etc/apache2/sites-available/000-default.conf 文件。 用 nano 打开文件。

$ sudo nano /etc/apache2/sites-available/000-default.conf

然后,输入行 Redirect "https://www.vultr.com/" "https://192.0.2.1/" 就在下面 <VirtualHost *:80> 打开标签。 再次更换 192.0.2.1 使用您的域名或服务器的公共 IP 地址。

<VirtualHost *:80>
...

Redirect "https://www.vultr.com/" "https://192.0.2.1/"

ServerAdmin [email protected]
DocumentRoot /var/www/html


...
</VirtualHost>

保存并关闭文件。 接下来重新启动 Apache 网络服务器以加载新的配置设置。

$ sudo systemctl restart apache2

参观 HTTP Web 浏览器上的以下 URL。 您现在应该被重定向到 HTTPS 网页的版本。

http://192.0.2.1

您的 SSL/TLS 证书和重定向设置现在按预期工作。 网络服务器和客户端之间的任何进一步通信现在都将通过安全通道进行交换。

结论

在本指南中,您已使用 SSL/TLS 证书保护 Apache 网络服务器上的流量。 您现在可以将 API、移动应用程序和桌面应用程序连接到安全端口,并在敏感数据流经网络时对其进行加密。

要在使用自签名证书时绕过 SSL/TLS 证书警告,请参阅以下资源:

如何绕过自签名 SSL/TLS 证书的 HTTPS 警告

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com