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

介绍

TLS,或 transport layer security,及其前身 SSL,即安全接口层,是用于在受保护的加密包装中包装正常流量的Web协议。

使用该技术,服务器可以安全地在服务器和客户端之间发送流量,而无需外部人员拦截消息的可能性。

在本指南中,您将学习如何设置一个自签名的SSL证书,用于Ubuntu 18.04上的Apache Web 服务器。

注意:自签证证书将加密服务器和任何客户端之间的通信,但是,由于它不是由包含在 Web 浏览器中的任何一个受信任的证书授权机构(CA)签署的,用户无法使用该证书自动验证您的服务器的身份。

如果您没有与您的服务器相关联的域名,并且加密的 Web 接口不适合用户,则自签名证书可能是合适的。 如果您 do 拥有域名,在许多情况下最好使用 CA 签名的证书。

前提条件

要完成本教程,您将需要:

  • 一个 Ubuntu 18.04 服务器具有非root 用户配置的sudo权限和启用防火墙. 您可以通过遵循我们的 初始服务器设置与 Ubuntu 18.04 * 安装了 Apache 网页服务器来设置此类用户帐户. 如果您想在您的服务器上安装一个完整的 LAMP (Linux, Apache, MySQL, PHP) 堆栈,您可以遵循我们的指南在 设置 LAMP 在 Ubuntu 18.04)。

完成前提条件后,继续到下一步。

第1步:创建SSL证书

TLS/SSL通过使用公共证书和私钥的组合工作 SSL 密钥在服务器上保密,用于加密发送给客户端的内容 SSL 证书被公开与任何要求内容的人共享,可用于解密由相关 SSL 密钥签名的内容。

您可以使用单个 OpenSSL 命令创建一个自签名的密钥和证书对:

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 ' 号: 此选项将设定证书被视为有效的时间长度 。 在这种情况下,设定为一年.
  • -新rsa:2048': 在此指定您想要同时生成新证书和新密钥 。 签名证书所需的密钥不是在前一步创建的,所以需要与证书一起创建. rsa:2048'部分要求它制作长为2048比特的RSA密钥。
  • " 钥匙 " : 此行告诉 OpenSSL 将正在创建的生成的私钥文件放在哪里 。
  • `出': 这告诉OpenSSL将正在创建的证书放在哪里. .

如前所述,这些选项将创建一个密钥文件和一个证书,您将被问到一些关于您的服务器的问题,以便正确嵌入证书中的信息。

正确地填写提示。 ** 最重要的行是请求常用名称(例如服务器FQDN或您的名称)的行。

整个提示列表将以如下方式输出:

1[secondary_label Output]
2Country Name (2 letter code) [AU]:US
3State or Province Name (full name) [Some-State]:New York
4Locality Name (eg, city) []:New York City
5Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
6Organizational Unit Name (eg, section) []:Ministry of Water Slides
7Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
8Email Address []:admin@your_domain.com

您创建的两个文件都将放置在适当的子目录中,在 /etc/ssl 下。

步骤 2 — 配置Apache使用SSL

您已成功地在 /etc/ssl 目录中创建了您的密钥和证书文件,现在您需要修改您的 Apache 配置以利用这些功能。

您将通过对配置进行一些调整来做到这一点:

  1. 创建配置片段以指定强大的默认 SSL 设置 2. 更改包含的 SSL Apache 虚拟主机文件以指向您生成的 SSL 证书 3. (推荐) 更改未加密的虚拟主机文件以自动重定向请求到加密的虚拟主机。

当你完成时,你将有一个安全的SSL配置。

创建具有强大的加密设置的 Apache 配置片段

首先,创建一个Apache配置片段来定义一些SSL设置,这将为Apache设置一个强大的SSL加密套件,并启用一些高级功能,以帮助保持您的服务器安全。

/etc/apache2/conf-available目录中创建一个新的片段. 在这个例子中,我们将使用nano创建文件,并命名文件ssl-params.conf,以明确其目的。

1sudo nano /etc/apache2/conf-available/ssl-params.conf

为了安全地设置 Apache SSL,我们将调整来自 Cipherlist.eu的建议)。

<$>[注] :从Cipherlist.eu提供的这些建议的设置提供强大的安全性。有时,这会以更大的客户端兼容性为代价。如果您需要支持较旧的客户端,有一个替代列表可以通过点击标签页面上的链接访问 ** `是的,给我一个与传统 / 旧软件一起工作的加密套件。

使用哪种配置的选择将很大程度上取决于您需要支持的内容,这两者都将提供极好的安全性。

为了您的目的,复制提供的设置全部. 但是,您将通过禁用严格运输安全标题(HSTS)来进行一个小小的更改。

提前加载 HSTS 提供了增强的安全性,但如果意外启用或不正确启用,可能会产生深远的后果。

在决定之前,请花一会儿时间阅读 HTTP 严格运输安全,或 HSTS,特别是关于 重新加载功能

现在将配置粘贴到 ssl-params.conf 文件中:

 1[label /etc/apache2/conf-available/ssl-params.conf]
 2
 3SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
 4# Requires Apache 2.4.36 & OpenSSL 1.1.1
 5SSLProtocol -all +TLSv1.3 +TLSv1.2
 6SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
 7# Older versions
 8# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
 9SSLHonorCipherOrder On
10# Disable preloading HSTS for now. You can use the commented out header line that includes 
11# the "preload" directive if you understand the implications.
12# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
13Header always set X-Frame-Options DENY
14Header always set X-Content-Type-Options nosniff
15# Requires Apache >= 2.4
16SSLCompression off
17SSLUseStapling on
18SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
19# Requires Apache >= 2.4.11
20SSLSessionTickets Off

如果您正在使用nano,您可以通过按CTRL + X,然后按YENTER来做到这一点。

更改默认 Apache SSL 虚拟主机文件

接下来,您将更改 /etc/apache2/sites-available/default-ssl.conf,默认的 Apache SSL 虚拟主机文件. 如果您正在使用不同的服务器封锁文件,请在以下命令中替换其名称。

在您开始之前,备份原始 SSL 虚拟主机文件:

1sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

现在,打开 SSL 虚拟主机文件以进行调整:

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

内部,随着大多数评论被删除,虚拟主机文件默认情况下将包含以下内容:

 1[label /etc/apache2/sites-available/default-ssl.conf]
 2<IfModule mod_ssl.c>
 3        <VirtualHost _default_:443>
 4                ServerAdmin webmaster@localhost
 5
 6                DocumentRoot /var/www/html
 7
 8                ErrorLog ${APACHE_LOG_DIR}/error.log
 9                CustomLog ${APACHE_LOG_DIR}/access.log combined
10
11                SSLEngine on
12
13                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
14                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
15
16                <FilesMatch "\.(cgi|shtml|phtml|php)$">
17                                SSLOptions +StdEnvVars
18                </FilesMatch>
19                <Directory /usr/lib/cgi-bin>
20                                SSLOptions +StdEnvVars
21                </Directory>
22
23        </VirtualHost>
24</IfModule>

首先,设置您希望在虚拟主机文件中调整的正常内容(如ServerAdmin电子邮件地址、ServerName等),并调整SSL指令以指向您的证书和关键文件)。

进行这些更改后,您的服务器封锁应导致如下:

 1[label /etc/apache2/sites-available/default-ssl.conf]
 2<IfModule mod_ssl.c>
 3        <VirtualHost _default_:443>
 4                ServerAdmin your_email@example.com
 5                ServerName server_domain_or_IP
 6
 7                DocumentRoot /var/www/html
 8
 9                ErrorLog ${APACHE_LOG_DIR}/error.log
10                CustomLog ${APACHE_LOG_DIR}/access.log combined
11
12                SSLEngine on
13
14                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
15                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
16
17                <FilesMatch "\.(cgi|shtml|phtml|php)$">
18                                SSLOptions +StdEnvVars
19                </FilesMatch>
20                <Directory /usr/lib/cgi-bin>
21                                SSLOptions +StdEnvVars
22                </Directory>
23
24        </VirtualHost>
25</IfModule>

保存并关闭文件,当你完成。

(推荐)修改HTTP主机文件重定向到HTTPS

目前,服务器将提供未加密的 HTTP 和加密的 HTTPS 流量. 为了更好的安全性,建议在大多数情况下自动将 HTTP 重定向到 HTTPS. 如果您不想要或需要此功能,您可以安全地跳过本节。

要调整未加密的虚拟主机文件,将所有流量重定向到 SSL 加密,请打开 /etc/apache2/sites-available/000-default.conf 文件:

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

VirtualHost配置块中,添加一个重定向指令,将所有流量指向网站的SSL版本:

1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3        . . .
4
5        Redirect "/" "https://your_domain_or_IP/"
6
7        . . .
8</VirtualHost>

保存并关闭文件,当你完成。

第3步:调整防火墙

如果您已启用ufw防火墙,根据前提指南的建议,您可能需要调整设置以允许SSL流量。

通过运行以下方式查看可用的配置文件列表:

1sudo ufw app list

产量应如下:

1[secondary_label Output]
2Available applications:
3  Apache
4  Apache Full
5  Apache Secure
6  OpenSSH

您可以通过检查状态来查看当前设置:

1sudo ufw status

如果您之前只允许正常的 HTTP 流量,您的输出结果将如下:

1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere
7Apache ALLOW Anywhere
8OpenSSH (v6)               ALLOW Anywhere (v6)
9Apache (v6)                ALLOW Anywhere (v6)

若要允许额外的 HTTPS 流量,您可以允许Apache Full配置文件,然后删除余额的Apache配置文件许可:

1sudo ufw allow 'Apache Full'
2sudo ufw delete allow 'Apache'

通过检查状态来确认更改:

1sudo ufw status
1[secondary_label Output]
2Status: active
3
4To Action From
5--                         ------      ----
6OpenSSH ALLOW Anywhere
7Apache Full ALLOW Anywhere
8OpenSSH (v6)               ALLOW Anywhere (v6)
9Apache Full (v6)           ALLOW Anywhere (v6)

您现在已经成功允许Apache流量到您的防火墙。

第4步:在Apache中启用更改

现在你已经做出更改并调整了防火墙,你可以在Apache中启用SSL和标题模块,启用SSL准备的虚拟主机,并重新启动Apache。

使用a2enmod命令,启用mod_ssl,Apache SSL 模块和mod_headers,这是 SSL 片段中的某些设置所需要的:

1sudo a2enmod ssl
2sudo a2enmod headers

接下来,使用a2ensite命令启用您的 SSL 虚拟主机:

1sudo a2ensite default-ssl

您还需要启用您的 ssl-params.conf 文件,以读取您设置的值:

1sudo a2enconf ssl-params

在此时,您的网站和所需的模块已启用. 检查以确保您的文件中没有语法错误:

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 restart apache2

您已做出更改,接下来您将测试您的SSL服务器。

步骤5:测试加密

现在是测试您的SSL服务器的时候了,开始打开您的Web浏览器,然后在地址栏中输入https://,然后输入您的服务器的域名或IP:

1https://server_domain_or_IP

由于您创建的证书不是由您的浏览器的可信证书机构之一签署的,您可能会收到以下警告:

Apache self-signed cert warning

我们只对我们的证书的加密方面感兴趣,而不是第三方验证我们的主机的真实性。

Apache self-signed override

你应该被带到你的网站. 在浏览器地址栏中,你将有一个锁,上面有一个x。这意味着证书无法验证。

如果您将 Apache 配置为将 HTTP 重定向到 HTTPS,您还可以检查重定向是否正常工作:

1http://server_domain_or_IP

如果这导致相同的图标,这意味着您的重定向工作正确。

步骤 6 — 更改到永久重定向

如果您的重定向工作正确,并且您确信只希望允许加密流量,您应该再次修改未加密的 Apache Virtual Host,以使重定向永久。

再次打开服务器封锁配置文件:

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

添加永久到该行,这将重定向从302临时重定向更改为301永久重定向:

1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:80>
3        . . .
4
5        Redirect permanent "/" "https://your_domain_or_IP/"
6
7        . . .
8</VirtualHost>

保存并关闭文件。

检查您的配置语法错误:

1sudo apache2ctl configtest

当你准备好时,重新启动Apache以使重定向永久:

1sudo systemctl restart apache2

您已成功地使重定向永久,只允许加密的流量。

结论

您已配置您的 Apache 服务器以使用强大的加密为客户端连接,这将允许您安全地服务请求,并防止外部人员阅读您的流量。

Published At
Categories with 技术
comments powered by Disqus