如何在Ubuntu18.04中为Apache创建自签名SSL证书
介绍
TLS 或 传输层安全 及其前身 SSL 代表 安全套接字层 ,是用于包装正常的 Web 协议受保护的加密包装器中的流量。
使用这项技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外界截获消息。 证书系统还帮助用户验证他们正在连接的站点的身份。
在本指南中,您将了解如何设置自签名 SSL 证书以在 Ubuntu 18.04 上与 Apache Web 服务器一起使用。
注意: 自签名证书将加密您的服务器和任何客户端之间的通信。 但是,由于它没有由 Web 浏览器中包含的任何受信任的证书颁发机构 (CA) 签名,因此用户无法使用该证书自动验证您的服务器的身份。
如果您没有与您的服务器关联的域名以及加密的 Web 界面不是面向用户的情况,则自签名证书可能是合适的。 如果你 do 有一个域名,在很多情况下最好使用 CA 签名的证书。 阅读我们关于 如何在 Ubuntu 18.04 上使用 Let's Encrypt 保护 Apache 的指南,了解有关如何设置免费可信证书的更多信息。
先决条件
要完成本教程,您需要:
- 一台 Ubuntu 18.04 服务器,非 root 用户配置了
sudo
权限并启用了防火墙。 您可以按照我们的 Initial Server Setup with Ubuntu 18.04 来设置这样的用户帐户 - 已安装 Apache Web 服务器。 如果您想在您的服务器上安装整个 LAMP(Linux、Apache、MySQL、PHP)堆栈,您可以按照我们关于 在 Ubuntu 18.04 上设置 LAMP 的指南进行操作。 如果您只想要 Apache Web 服务器,请跳过与 PHP 和 MySQL 有关的步骤。
完成先决条件后,继续下一步。
第 1 步 — 创建 SSL 证书
TLS/SSL 通过使用公共证书和私钥的组合来工作。 SSL 密钥在服务器上是保密的。 它用于加密发送给客户端的内容。 SSL 证书与任何请求内容的人公开共享。 它可用于解密由相关 SSL 密钥签名的内容。
您可以使用单个 OpenSSL 命令创建自签名密钥和证书对:
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
: This is the basic command line tool for creating and managing OpenSSL certificates, keys, and other files.req
: This subcommand specifies to use X.509 certificate signing request (CSR) management. “X.509”是 SSL 和 TLS 遵循的公钥基础设施标准,用于其密钥和证书管理。 要创建新的 X.509 证书,请使用此子命令。-x509
: This further modifies the previous subcommand by telling the utility to make a self-signed certificate instead of generating a certificate signing request, as would normally happen.-nodes
: This tells OpenSSL to skip the option to secure the certificate with a passphrase. 当服务器启动时,Apache 需要能够读取文件,而无需用户干预。 密码可以防止这种情况发生,因为用户必须在每次重启后输入密码。-days 365
: This option sets the length of time that the certificate will be considered valid. 在这种情况下,它设置为一年。-newkey rsa:2048
: This specifies that you want to generate a new certificate and a new key at the same time. 签署证书所需的密钥不是在上一步中创建的,因此需要与证书一起创建。rsa:2048
部分告诉它生成一个 2048 位长的 RSA 密钥。-keyout
: This line tells OpenSSL where to place the generated private key file that’s being created.-out
: This tells OpenSSL where to place the certificate that’s being created.
如前所述,这些选项将创建密钥文件和证书。 为了将信息正确嵌入到证书中,系统会询问您一些有关服务器的问题。
适当地填写提示。 最重要的一行是请求通用名称的行(例如 服务器 FQDN 或您的姓名)。 您需要输入与您的服务器关联的域名,或者更有可能是您的服务器的公共 IP 地址。
整个提示列表将输出如下:
OutputCountry Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:server_IP_address Email Address []:admin@your_domain.com
您创建的两个文件都将放置在 /etc/ssl
下的相应子目录中。
第 2 步 — 将 Apache 配置为使用 SSL
您已在 /etc/ssl
目录下成功创建了密钥和证书文件。 现在,您需要修改 Apache 配置以利用这些优势。
您将通过对配置进行一些调整来做到这一点:
- 创建配置片段以指定强默认 SSL 设置。
- 修改包含的 SSL Apache 虚拟主机文件以指向您生成的 SSL 证书。
- (推荐)修改未加密的虚拟主机文件,自动将请求重定向到加密的虚拟主机。
完成后,您将拥有一个安全的 SSL 配置。
创建具有强加密设置的 Apache 配置片段
首先,创建一个 Apache 配置片段来定义一些 SSL 设置。 这将为 Apache 设置一个强大的 SSL 密码套件,并启用一些有助于保持服务器安全的高级功能。 任何启用 SSL 的虚拟主机都可以使用您设置的参数。
在 /etc/apache2/conf-available
目录中创建一个新片段。 在此示例中,我们将使用 nano
创建文件并将文件命名为 ssl-params.conf
以明确其用途。 随意使用您喜欢的文本编辑器:
sudo nano /etc/apache2/conf-available/ssl-params.conf
为了安全地设置 Apache SSL,我们将调整来自 Cipherlist.eu 的建议。 Cipherlist.eu 是一个有用且易于理解的资源,用于了解用于流行软件的加密设置。
注意:这些来自 Cipherlist.eu 的建议设置提供了强大的安全性。 有时,这是以更高的客户端兼容性为代价的。 如果您需要支持旧客户端,可以通过单击页面上标有 的链接访问替代列表“是的,给我一个适用于旧版/旧软件的密码套件。” 如果需要,您可以将该列表替换为下一个示例代码块的内容。
选择使用哪种配置很大程度上取决于您需要支持什么。 它们都将提供极大的安全性。
出于您的目的,请完整复制提供的设置。 不过,您可以通过禁用 Strict-Transport-Security
标头 (HSTS) 来做一点小改动。
预加载 HSTS 可提高安全性,但如果意外启用或启用不正确,可能会产生深远的影响。 在本指南中,我们不会启用这些设置,但如果您确定您理解其中的含义,您可以对其进行修改。
在决定之前,请花点时间阅读 HTTP Strict Transport Security 或 HSTS,特别是 “预加载”功能
现在将配置粘贴到 ssl-params.conf
文件中:
/etc/apache2/conf-available/ssl-params.conf
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM # Requires Apache 2.4.36 & OpenSSL 1.1.1 SSLProtocol -all +TLSv1.3 +TLSv1.2 SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1 # Older versions # SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLHonorCipherOrder On # Disable preloading HSTS for now. You can use the commented out header line that includes # the "preload" directive if you understand the implications. # Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off SSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)" # Requires Apache >= 2.4.11 SSLSessionTickets Off
完成后保存并关闭文件。 如果您正在使用 nano
,您可以按 CTRL + X
,然后按 Y
和 ENTER
来执行此操作。
修改默认 Apache SSL 虚拟主机文件
接下来,您将修改默认的 Apache SSL 虚拟主机文件 /etc/apache2/sites-available/default-ssl.conf
。 如果您使用不同的服务器块文件,请在以下命令中替换其名称。
在开始之前,请备份原始 SSL 虚拟主机文件:
sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
现在,打开 SSL 虚拟主机文件进行调整:
sudo nano /etc/apache2/sites-available/default-ssl.conf
在内部,删除了大部分注释后,虚拟主机文件将默认包含以下内容:
/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule>
您将对文件进行一些小的调整。 首先在虚拟主机文件中设置您想要调整的正常内容(例如 ServerAdmin
电子邮件地址、ServerName
等,并调整 SSL
指令指向到您的证书和密钥文件)。
进行这些更改后,您的服务器块应导致以下结果:
/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin your_email@example.com ServerName server_domain_or_IP DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule>
完成后保存并关闭文件。
(推荐)修改HTTP Host文件重定向到HTTPS
就目前而言,服务器将提供未加密的 HTTP 和加密的 HTTPS 流量。 为了更好的安全性,建议在大多数情况下自动将 HTTP 重定向到 HTTPS。 如果您不想要或不需要此功能,您可以安全地跳过本节。
要调整未加密的虚拟主机文件以将所有流量重定向到 SSL 加密,请打开 /etc/apache2/sites-available/000-default.conf
文件:
sudo nano /etc/apache2/sites-available/000-default.conf
在 VirtualHost
配置块中,添加一个 Redirect
指令,将所有流量指向站点的 SSL 版本:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> . . . Redirect "/" "https://your_domain_or_IP/" . . . </VirtualHost>
完成后保存并关闭文件。
第 3 步 — 调整防火墙
如果您按照先决条件指南的建议启用了 ufw
防火墙,您可能需要调整设置以允许 SSL 流量。 幸运的是,Apache 在安装时使用 ufw
注册了一些配置文件。
通过运行以下命令查看可用配置文件列表:
sudo ufw app list
输出应如下所示:
OutputAvailable applications: Apache Apache Full Apache Secure OpenSSH
您可以通过检查状态来查看当前设置:
sudo ufw status
如果您之前只允许常规 HTTP 流量,您的输出结果将如下所示:
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)
要允许额外的 HTTPS 流量,您可以允许“Apache Full”配置文件,然后删除多余的“Apache”配置文件允许:
sudo ufw allow 'Apache Full' sudo ufw delete allow 'Apache'
通过检查状态确认更改:
sudo ufw status
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)
您现在已成功允许 Apache 流量进入您的防火墙。
第 4 步 — 启用 Apache 中的更改
现在您已经进行了更改并调整了防火墙,您可以在 Apache 中启用 SSL 和标头模块,启用 SSL-ready Virtual Host,然后重新启动 Apache。
使用 a2enmod
命令启用 mod_ssl
、Apache SSL 模块和 mod_headers
,这是 SSL 片段中的一些设置所需的:
sudo a2enmod ssl sudo a2enmod headers
接下来,使用 a2ensite
命令启用 SSL 虚拟主机:
sudo a2ensite default-ssl
您还需要启用 ssl-params.conf
文件,以读取您设置的值:
sudo a2enconf ssl-params
此时,您的站点和必要的模块已启用。 通过测试检查以确保文件中没有语法错误:
sudo apache2ctl configtest
如果一切顺利,您将得到以下结果:
OutputAH00558: 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
指令未全局设置。 如果您想摆脱该消息,您可以在 /etc/apache2/apache2.conf
中将 ServerName
设置为您服务器的域名或 IP 地址。 这是可选的,因为该消息不会造成任何伤害。
如果您的输出中有 Syntax OK
,则说明您的配置文件没有语法错误。 您现在可以安全地重新启动 Apache 以实施您的更改:
sudo systemctl restart apache2
您已经进行了更改,接下来您将测试您的 SSL 服务器。
第 5 步 — 测试加密
现在是时候测试您的 SSL 服务器了。 首先打开您的网络浏览器,然后在地址栏中输入 https://
,然后是您的服务器的域名或 IP:
https://server_domain_or_IP
由于您创建的证书未由浏览器的受信任证书颁发机构之一签名,因此您可能会收到如下警告:
这是预期和正常的。 我们只对我们证书的加密方面感兴趣,而不是对我们主机真实性的第三方验证。 单击 ADVANCED,然后单击提供的链接以继续访问您的主机:
您应该被带到您的网站。 在浏览器地址栏中,您将有一个带有“x”的锁。 这意味着无法验证证书。 它仍在加密您的连接。
如果您将 Apache 配置为将 HTTP 重定向到 HTTPS,您还可以检查重定向功能是否正确:
http://server_domain_or_IP
如果这导致相同的图标,这意味着您的重定向工作正常。
第 6 步 — 更改为永久重定向
如果您的重定向工作正常并且您确定只允许加密流量,您应该再次修改未加密的 Apache 虚拟主机以使重定向永久化。
再次打开您的服务器块配置文件:
sudo nano /etc/apache2/sites-available/000-default.conf
找到您之前添加的 Redirect
行。 将 permanent
添加到该行,这会将重定向从 302 临时重定向更改为 301 永久重定向:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80> . . . Redirect permanent "/" "https://your_domain_or_IP/" . . . </VirtualHost>
保存并关闭文件。
检查您的配置是否有语法错误:
sudo apache2ctl configtest
准备就绪后,重新启动 Apache 以使重定向永久化:
sudo systemctl restart apache2
您已成功将重定向永久设置为仅允许加密流量。
结论
您已将 Apache 服务器配置为对客户端连接使用强加密。 这将使您能够安全地处理请求,并防止外部各方读取您的流量。