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

介绍

TLS或“传输层安全”——及其前身SSL——是用于将正常流量包装在受保护的加密包装器中的协议。使用这项技术,服务器可以安全地向其客户端发送信息,而不会被外界拦截或读取其消息。

在本指南中,我们将向您展示如何在 Ubuntu 20.04 上通过 Apache Web 服务器创建和使用自签名 SSL 证书。

注意:自签名证书将加密您的服务器和任何客户端之间的通信。但是,由于它不是由 Web 浏览器和操作系统中包含的任何受信任的证书颁发机构签署的,因此用户无法使用该证书来自动验证您的服务器的身份。因此,您的用户在访问您的网站时会看到安全错误。

由于此限制,自签名证书不适用于为公众服务的生产环境。它们通常用于测试或保护单个用户或一小群用户使用的非关键服务,这些用户可以通过备用通信渠道建立对证书有效性的信任。

如需更适合生产的证书解决方案,请查看Let’s Encrypt,一个免费的证书颁发机构。您可以在我们的如何在 Ubuntu 20.04 上使用 Let’s Encrypt 保护 Apache教程中了解如何下载和配置 Let’s Encrypt 证书

先决条件

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

  • 使用非root 用户、启用 sudo 的用户访问 Ubuntu 20.04 服务器我们的Ubuntu 20.04 初始服务器设置指南可以向您展示如何创建此帐户。
  • 您还需要安装 Apache。您可以使用apt. 首先,更新本地包索引以反映最新的上游更改:

    • sudo apt update

    然后,安装apache2软件包:

    • sudo apt install apache2

    最后,如果您ufw设置了防火墙,请打开httphttps端口:

    • sudo ufw allow "Apache Full"

完成这些步骤后,请确保您以非root用户身份登录并继续本教程。

步骤 1 — 启用 mod_ssl

在我们可以使用任何SSL 证书之前,我们首先必须启用mod_sslApache 模块,它提供对 SSL 加密的支持。

mod_ssl使用以下a2enmod命令启用

  • sudo a2enmod ssl

重启Apache激活模块:

  • sudo systemctl restart apache2

mod_ssl模块现已启用并可以使用。

步骤 2 – 创建 SSL 证书

现在 Apache 已准备好使用加密,我们可以继续生成新的 SSL 证书。该证书将存储有关您站点的一些基本信息,并附带一个允许服务器安全处理加密数据的密钥文件。

我们可以使用以下openssl命令创建 SSL 密钥和证书文件

  • 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 -x509:这指定我们要使用 X.509 证书签名请求 (CSR) 管理。X.509 是 SSL 和 TLS 遵守的用于密钥和证书管理的公钥基础结构标准。
  • -nodes:这告诉 OpenSSL 跳过使用密码保护我们的证书的选项。当服务器启动时,我们需要 Apache 能够在没有用户干预的情况下读取文件。密码可以防止这种情况发生,因为我们必须在每次重新启动后输入它。
  • -days 365:此选项设置证书被视为有效的时间长度。我们在这里设置了一年。许多现代浏览器会拒绝任何有效期超过一年的证书。
  • -newkey rsa:2048:这指定我们要同时生成新证书和新密钥。我们没有在上一步中创建签署证书所需的密钥,因此我们需要将其与证书一起创建。rsa:2048部分告诉它制作一个 2048 位长的 RSA 密钥。
  • -keyout:这一行告诉 OpenSSL 在哪里放置我们正在创建的生成的私钥文件。
  • -out:这告诉 OpenSSL 在哪里放置我们正在创建的证书。

适当填写提示。最重要的一行是请求Common Name. 您需要输入用于访问服务器的主机名或服务器的公共 IP。重要的是,此字段与您将放入浏览器地址栏中以访问该站点的任何内容相匹配,因为不匹配会导致更多的安全错误。

完整的提示列表如下所示:

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:[email protected]

您创建的两个文件都将放置在/etc/ssl.

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

步骤 3 – 配置 Apache 以使用 SSL

现在我们有了自签名证书和密钥,我们需要更新我们的 Apache 配置以使用它们。在 Ubuntu 上,您可以将新的 Apache 配置文件(它们必须以 结尾.conf)放入/etc/apache2/sites-available/,它们将在下次重新加载或重新启动 Apache 进程时加载。

在本教程中,我们将创建一个新的最小配置文件。(如果您已经<Virtualhost>设置了Apache并且只需要向其中添加 SSL,您可能需要复制以 开头的配置行SSL,并将VirtualHost端口从切换80443。我们将80在下一步中处理端口。 )

在 /etc/apache2/sites-available 目录中打开一个新文件:

  • sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

粘贴以下最小的 VirtualHost 配置:

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:443>
   ServerName your_domain_or_ip
   DocumentRoot /var/www/your_domain_or_ip

   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
   SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

请务必将ServerName更新为您打算寻址服务器的任何方式。这可以是主机名、完整域名或 IP 地址。确保您选择的任何内容与Common Name您在制作证书时选择的内容相匹配

剩下的几行指定一个DocumentRoot目录来提供文件,以及将 Apache 指向我们新创建的证书和密钥所需的 SSL 选项。

现在让我们创建我们DocumentRoot的 HTML 文件并将其放入其中,仅用于测试目的:

  • sudo mkdir /var/www/your_domain_or_ip

index.html使用文本编辑器打开一个新文件:

  • sudo nano /var/www/your_domain_or_ip/index.html

将以下内容粘贴到空白文件中:

/var/www/your_domain_or_ip/index.html
<h1>it worked!</h1>

当然,这不是一个完整的 HTML 文件,但浏览器是宽容的,足以验证我们的配置。

保存并关闭文件

接下来,我们需要使用
a2ensite工具启用配置文件

  • sudo a2ensite your_domain_or_ip.conf

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

  • sudo apache2ctl configtest

如果一切顺利,您将得到如下所示的结果:

Output
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指令未全局设置。如果您想删除该消息,您可以在 .conf 中设置ServerName为您服务器的域名或 IP 地址/etc/apache2/apache2.conf这是可选的,因为该消息不会造成伤害。

如果您的输出包含Syntax OK在其中,则您的配置文件没有语法错误。我们可以安全地重新加载 Apache 以实现我们的更改:

  • sudo systemctl reload apache2

现在在浏览器中加载您的站点,确保https://在开始时使用

您应该会看到一个错误。这对于自签名证书来说是正常的!浏览器警告您它无法验证服务器的身份,因为我们的证书没有由任何已知的证书颁发机构签署。对于测试目的和个人使用,这可以很好。您应该能够点击进入高级更多信息并选择继续。

执行此操作后,您的浏览器将加载该it worked!消息。

注意:如果您的浏览器根本没有连接到服务器,请确保您的连接没有被防火墙阻止。如果您使用的是ufw,以下命令将打开端口80443

  • sudo ufw allow "Apache Full"

接下来,我们将VirtualHost在我们的配置中添加另一个部分,以提供纯 HTTP 请求并将它们重定向到 HTTPS。

第 4 步 – 将 HTTP 重定向到 HTTPS

目前,我们的配置只会响应端口上的 HTTPS 请求44380即使您想强制加密所有流量,也最好在 port 上做出响应让我们设置一个VirtualHost来响应这些未加密的请求并将它们重定向到 HTTPS。

打开我们在前面的步骤中启动的同一个 Apache 配置文件:

  • sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

在底部,创建另一个VirtualHost块以匹配端口上的请求80使用该ServerName指令再次匹配您的域名或 IP 地址。然后,用于Redirect匹配任何请求并将它们发送到 SSL VirtualHost确保包含尾部斜杠:

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:80>
    ServerName your_domain_or_ip
    Redirect / https://your_domain_or_ip/
</VirtualHost>

完成后保存并关闭此文件,然后再次测试您的配置语法,并重新加载 Apache:

  • sudo apachectl configtest
  • sudo systemctl reload apache2

您可以通过http://在地址前面使用纯文本访问您的站点来测试新的重定向功能您应该会被https://自动重定向到

结论

您现在已将 Apache 配置为使用自签名 SSL 证书处理加密请求,并将未加密的 HTTP 请求重定向到 HTTPS。

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

有关使用 Let’s Encrypt with Apache 的更多信息,请阅读我们的如何在 Ubuntu 20.04上使用 Let’s Encrypt保护 Apache教程。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁