如何在 Ubuntu 22.04 中为 Apache 创建自签名 SSL 证书

介绍

TLS ,或运输层安全 - 以及其前身 ** SSL** - 是用于将正常流量包装到受保护的加密包装中使用的协议. 使用这种技术,服务器可以安全地将信息发送给客户端,而不会被外部人拦截或阅读。

在本指南中,您将创建并使用自签名的TLS证书与Ubuntu 22.04上的Apache网络服务器。

注意:** 一个自签证书将加密您的服务器和任何客户端之间的通信,但是,由于它没有被包含在 Web 浏览器和操作系统中的任何一个受信任的证书机构签署,用户无法使用该证书自动验证您的服务器的身份。

由于这种限制,自签证证书不适合为公众服务的生产环境,通常用于测试,或者用于确保单个用户或小组用户使用的非关键服务,这些服务可以通过替代通信渠道建立信任证书的有效性。

要了解更多生产准备的证书解决方案,请参阅 Let's Encrypt,一个免费的证书授权机构. 您可以在我们的 How To Secure Apache with Let's Encrypt on Ubuntu 22.04 教程中学习如何下载和配置 Let's Encrypt 证书。

前提条件

在开始本教程之前,您将需要以下内容:

  • 访问Ubuntu 22.04服务器,使用非root ,sudo启用的用户。 我们的[Initial Server setup with Ubuntu 22.04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-22-04)指南可以教你如何创建这个账户.
  • 联合国 您还需要安装 Apache 。 您可以使用 apt 安装 Apache 。 首先,更新本地包索引,以反映最新的上游变化: QQ 命令 sudo 适切更新 然后,安装 apache2 软件包:\\ 命令 sudo apt 安装 apache2 ``` 最后,如果你有一个"ufw" 设置防火墙,打开http'和https' 端口 :\\ 命令 Sudo ufw 允许“ Apache Full ” ``. ,

完成这些步骤后,请确保您已登录为非root用户,并继续使用教程。

第1步:启用“mod_ssl”

在使用任何 TLS 证书之前,您需要先启用“mod_ssl”,这是一种支持 SSL 加密的 Apache 模块。

使用“a2enmod”命令启用“mod_ssl”:

1sudo a2enmod ssl

重启 Apache 以激活模块:

1sudo systemctl restart apache2

“mod_ssl”模块现在已启用并准备使用。

第2步:创建TLS证书

现在Apache已经准备好使用加密,我们可以继续生成一个新的TLS证书,该证书将存储一些关于您的网站的基本信息,并将伴随着一个关键文件,允许服务器安全地处理加密数据。

我们可以使用“openssl”命令创建 TLS 密钥和证书文件:

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 ' 语句 -x509 ' : 它指定我们要使用 X.509 证书签名请求(CSR)管理. X.509是TLS为密钥和证书管理所遵循的公钥基础设施标准.
  • " 节点 " : 这告诉 OpenSSL 跳过选项, 用密码句保护我们的证书 。 我们需要Apache在服务器启动时能够读取文件,而无需用户干预. 密码句可以防止这种情况发生,因为每次重启后我们都必须输入。
  • " 天数 " 365 ' 号: 此选项将设定证书被视为有效的时间长度 。 我们在这里定了一年 许多现代浏览器会拒绝任何有效期超过一年的证书.
  • -新rsa:2048': 它指定我们要同时生成新的证书和新的密钥 。 我们没有在前一个步骤中创建签名证书所需的密钥,所以我们需要与证书一起创建证书. rsa:2048'部分要求它制作长为2048比特的RSA密钥。
  • " 钥匙 " : 此行告诉 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 下。

接下来,我们将更新我们的Apache配置以使用新的证书和密钥。

步骤 3 – 配置Apache使用TLS

在Ubuntu上,您可以将新的Apache配置文件(它们必须以 .conf结束)放入 /etc/apache2/sites-available/,并在下一次重新加载或重新启动Apache过程时将其加载。

对于本教程,我们将创建一个新的最小配置文件(如果您已经设置了Apache,只需要添加TLS,您可能需要复制以“SSL”开头的配置行,并将“VirtualHost”端口从“80”切换到“443”。

在 /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 新创建的证书和密钥所需的 TLS 选项。

现在,让我们创建我们的“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

接下来,让我们测试配置错误:

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地址。 然后,使用“重定向”来匹配任何请求,并将其发送到TLS“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 来使用自签名的 TLS 证书服务加密请求,并将未加密的 HTTP 请求重定向到 HTTPS。

如果您计划在公共网站上使用 TLS,您应该考虑购买域名并使用广泛支持的证书授权机构,例如 Let's Encrypt

有关使用Let's Encrypt with Apache的更多信息,请阅读我们的教程(How To Secure Apache with Let's Encrypt on Ubuntu 22.04)。

Published At
Categories with 技术
comments powered by Disqus