正确地在Apache上启用HTTPS,让我们在Ubuntu上加密

  • 技术文档
  • 2022.03.23
  • 浏览:487

本教程将向您展示如何在Apache上使用Let's Encrypt on Ubuntu正确启用HTTPS。Google Chrome和Firefox已经开始将带有密码输入框的未加密网页标记为不安全。最终,所有HTTP网页都将被标记为不安全。HTTPS将成为任何网站的默认设置。如果你想利用HTTP/2协议来加速你的网站,这也是一个要求。

您可能知道,Let's Encrypt是一个免费、自动且开放的证书颁发机构。官方文档描述了使用Let’s Encrypt启用HTTPS时可以遵循的简单步骤,但还有更多。如果你遵循官方文件,你将在SSL实验室测试中得分。如果你按照我的步骤做,你会得到A+分。如果您之前已经部署了Let's Encrypt证书,您仍然可以按照本教程更新和替换现有证书。

在我向您展示使用Let’s Encrypt启用HTTPS的步骤之前,我想先谈谈CAA记录、安全头和OCSP绑定。这些东西可以帮助你获得A+。在本教程的最后,我还将向您展示如何处理CloudFlare CDN服务。

注意:本教程适用于所有当前版本的Apache和Ubuntu(包括16.04、18.04和20.04)。

为你的域名创建CAA记录

证书颁发机构授权(CAA)是一种DNS资源记录,用于指定允许哪些证书颁发机构(CA)为特定域名颁发证书。从2017年9月开始,所有CA都必须在为特定域名颁发证书之前检查CAA记录。如果没有找到某个域名的CAA记录,那么任何CA都可以为该域名颁发证书。如果CA未列在您的CAA记录中,则该CA无法为您的域名颁发证书。

要创建允许我们加密为您的域名颁发证书的CAA记录,请在DNS服务器或DNS管理器中添加以下条目。

example.com. IN CAA 0 issue "letsencrypt.org"

您还可以使用iodef让CA向您的电子邮件地址报告恶意证书颁发请求。

example.com. IN CAA 0 iodef "mailto:your-email-address"

上述记录的格式适用于区域文件。下面是给你的一些建议。

  • 您可以使用SSLMate CAA Record Helper为您的域名生成CCA记录。
  • 如果你使用的是GoDaddy DNS,那么请按照本文添加CAA记录。

您可以使用以下dig命令检查CAA记录。

dig example.com CAA

请注意,网络浏览器不会检查CAA记录。

安全标头

安全头和HTTPS一样重要,但只有一小部分启用HTTPS的站点关注安全头。虽然关于安全头的完整讨论超出了本教程的范围,但我想谈谈升级不安全请求和HSTS头,因为您可以使用Let’s Encrypt轻松启用它们,以提高站点的安全性。

升级不安全的请求

有时,一个站点启用了HTTPS,但一些CSS、图像或Java脚本仍然通过HTTP提供服务。在这种情况下,浏览器地址栏开头的绿色挂锁将消失。在谷歌浏览器中,它被一个信息图标取代;在Firefox中,它被一个带有黄色三角形的灰色挂锁所取代。您将希望尽可能多地向网站访问者显示一个绿色挂锁,解决此问题的简单方法是启用升级不安全请求头,这将迫使web浏览器对每个http://资源使用https://。

要启用此标头,只需在发出certbot命令时添加--uir标志。请注意,此标题适用于托管在您自己域上的资源和支持HTTPS的第三方域上的资源。如果您的网页包含第三方服务器上无法通过HTTPS访问的资源,则这些资源将被web浏览器阻止,但使用此标题可确保您的网页始终获得绿色挂锁。

HSTS(HTTP严格传输安全)

HSTS标题告诉网络浏览器,与网站的所有通信都应该通过HTTPS完成。它可以防御SSL条带化,这是一种将HTTPS降级为HTTP的攻击。要启用此标头,只需在发出certbot命令时添加--hsts标志。

OCSP吻合器

当web浏览器连接到HTTPS网站时,它会向证书颁发机构(CA)发送OCSP(联机证书状态协议)请求,以查询网站SSL证书的吊销状态。Firefox遥测数据显示,这会将页面加载延迟1-3秒。

为了提高性能,网站所有者可以启用OCSP绑定,在这种情况下,web服务器本身会定期获取CA签署的OCSP响应,并将其发送到web浏览器,从而消除web浏览器联系OCSP服务器的需要。

要启用OCSP绑定,只需在发出certbot命令时添加--stype OCSP标志。

OCSP必须装订

如果黑客制作了一个伪造的、重复的网站,关闭了OCSP订书机,还阻止了网络浏览器对OCSP服务器的访问,那么网络浏览器会认为这是正常的,并继续访问恶意网站。为了解决这个问题,您可以在您的网站上启用OCSP必须装订,这会告诉web浏览器,在HTTPS连接期间,您的网站必须提供OCSP装订响应。因此,当网络浏览器连接到没有OCSP订书钉的假网站时,它会停止连接。

要启用OCSP必须装订,请在发出certbot命令时添加--must-stalke标志。

在Ubuntu上安装Let's Encrypt Client(Certbot)

现在是时候把手弄脏了。从Ubuntu 16.04开始,让我们加密客户端(Certbot)包含在Ubuntu存储库中,因此您可以使用以下命令安装它。Python3 certbot apache是certbot apache插件。

sudo apt install certbot python3-certbot-apache

要检查版本号,请运行

certbot --version

样本输出:

certbot 0.31.0

如果要使用最新版本,可以从Snap store安装Certbot。

sudo apt install snapd  sudo snap install --classic certbot

注意:如果要使用Snap版本,需要使用完整的二进制路径:/Snap/bin/certbot。

使用Apache插件启用HTTPS

如果您的网站不使用CDN服务,则建议使用Apache插件在Apache web服务器上启用HTTPS,因为它可以自动获取SSL/TLS证书并为您进行配置。在Ubuntu服务器上运行以下命令。

sudo certbot --apache --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email 

说明:

  • --apache:使用apache验证器和安装程序
  • --同意:同意让我们加密服务条款
  • --重定向:自动将所有HTTP流量重定向到HTTPS
  • --uir:在每个HTTP响应中添加“内容安全策略:升级不安全请求”标题。
  • --hsts:为每个HTTP响应添加严格的传输安全头。
  • --装订ocsp:启用ocsp装订。
  • --必须装订:将OCSP必须装订扩展添加到证书。
  • -d标志后面是域名列表,以逗号分隔。你最多可以添加100个域名。
  • --电子邮件:用于注册和恢复联系人的电子邮件。

你会被问到是否想收到来自EFF(电子前沿基金会)的电子邮件。选择Y或N后,将自动获取并为您配置SSL证书,如下消息所示。

ubuntu letsencrypt apache2

现在,如果您访问您的网站,您可以看到HTTP自动重定向到HTTPS连接。请注意,certbot客户端创建/etc/apache2/sites enabled/example。com le ssl。在为网站配置SSL时配置SSL虚拟主机。

测试SSL证书

去斯莱布。com来测试您的SSL证书和配置。正如我承诺的,你会得到A+。您还可以检查您的域名是否已启用CAA记录,您的服务器是否已启用HSTS、OCSP装订和OCSP必须装订。

ubuntu 16.04 certbot apache

将WWW重定向到非WWW(或反之亦然)

我们已经启用了将HTTP重定向到HTTPS,剩下要做的就是将www重定向到非www,或者反之亦然。如果你用的是WordPress,那就很简单了。只需进入WordPress Dashboard>;设置>;在WordPress地址和网站地址中设置您的首选版本(www或非www)。

letsencrypt apache redirect

如果你走这条路,你最终会被称为双301重定向。首先,Apache服务器将HTTP重定向到HTTPS,然后WordPress重定向到www或非www域。

有些人可能会说,当你做双301重定向时,你可能会失去SEO链接。如果您对此感到担忧,那么您可以使用下面的方法使所有域版本直接转到最终目的地。

编辑虚拟主机文件。(不是SSL虚拟主机)

sudo nano /etc/apache2/sites-enabled/example.com.conf

CertBot客户端在文件中添加了以下行以将HTTP重定向到HTTPS。

RewriteEngine on RewriteCond %{SERVER_NAME} =example.com [OR] RewriteCond %{SERVER_NAME} =www.example.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

要重定向到www或非www域,需要更改最后一行。用您喜欢的域版本替换%{SERVER_NAME},如下所示。(www.domain)

RewriteRule ^ https://www.example.com%{REQUEST_URI} [END,NE,R=permanent]

如果您更喜欢非www域,请将其更改为以下内容。

RewriteRule ^ https://example.com%{REQUEST_URI} [END,NE,R=permanent]

然后保存并关闭文件。我们还需要编辑SSL虚拟主机。

sudo nano /etc/apache2/sites-enabled/example.com-le-ssl.conf

在结尾上方添加以下行</VirtualHost>;标记将非www重定向到www域。

RewriteEngine on RewriteCond %{SERVER_NAME} =example.com RewriteRule ^ https://www.example.com%{REQUEST_URI} [END,NE,R=permanent]

如果要将www重定向到非www域,请添加以下行。

RewriteEngine on RewriteCond %{SERVER_NAME} =www.example.com RewriteRule ^ https://example.com%{REQUEST_URI} [END,NE,R=permanent]

保存并关闭文件。重新加载Apache服务以使更改生效。

sudo systemctl reload apache2

更清楚地说,下面是我的Apache虚拟主机文件和SSL虚拟主机文件的截图,用于将非www重定向到www域。

certbot apache virtual host

Apache虚拟主机文件

letsencrypt apache virtual host

Apache SSL虚拟主机文件

如果您使用的是WordPress,请确保在编辑Apache虚拟主机文件之前,在WoredPress地址和站点地址中设置了首选域版本。如果WordPress设置与Apache配置相矛盾,您的站点将处于重定向循环中。

如何禁用TLSv1和TLSv1。1.

TLSv1和TLSv1。1不再被认为是安全的。要禁用它们,请编辑Let's Encrypt SSL options配置文件。

sudo nano /etc/letsencrypt/options-ssl-apache.conf

找到以下行,默认情况下禁用SSLv2和SSLv3。

SSLProtocol             all -SSLv2 -SSLv3

将其更改为以下内容,以同时禁用TLSv1。0和TLSv1。1.

SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

保存并关闭文件。然后重启Apache。

sudo systemctl restart apache2

证书自动更新

要自动续订Let's Encrypt certificate,只需编辑root用户的crontab文件。

sudo crontab -e

然后在底部添加以下行。

@daily certbot renew --quiet && systemctl reload apache2

--安静标志将抑制正常消息。如果希望接收错误消息,请在crontab文件的开头添加以下行。

MAILTO=your-email-address

需要重新加载Apache才能将新证书呈现给客户端。

CloudFlare CDN

您需要知道的第一件事是,如果您想在服务器上安装Let’s Encrypt certificate,同时使用CloudFlare的CDN服务,那么您需要在您的站点上启用CloudFlare的通用SSL,这意味着

  • 站点访问者和CloudFlare edge server之间的连接使用CloudFlare Universal SSL证书进行加密。
  • 原始服务器和CloudFlare edge服务器之间的通信使用Let’s Encrypt Issuited certificate进行加密。

如果在源服务器上安装Let's Encrypt certificate,将HTTP重定向到HTTPS并关闭CloudFlare Universal SSL,web浏览器将抱怨您的网站处于无限重定向循环中,因为CloudFlare将HTTPS重定向到HTTP。

您需要知道的第二件事是,如果希望在使用CloudFlare Universal SSL时启用CAA记录,则还需要创建以下CAA记录。

example.com. IN CAA 0 issue "comodoca.com"  example.com. IN CAA 0 issue "digicert.com"  example.com. IN CAA 0 issue "globalsign.com

按照本文添加CloudFlare Universal SSL证书的CAA记录。

那么,如何使用CloudFlare安装Let's Encrypt certificate呢?有两种情况。

  1. 您已经使用上述步骤安装了Let's Encrypt certificate,现在您想启用CloudFlare CDN服务。
  2. 您的网站正在使用CloudFlare CDN服务,现在您想在源服务器上安装Let's Encrypt certificate。

第一种情况

如果您在第一个场景中,则可以继续启用CloudFlare CDN服务,还可以通过转到Crypto>;在CloudFlare Dashboard中启用CloudFlare Universal SSL;SSL和选择完整(严格)。你的网站将运行良好,没有问题。

第二种情况

如果您使用CloudFlare CDN,并且现在希望在源服务器上安装Let's Encrypt,请运行以下命令以获取并安装Let's Encrypt TLS证书。

sudo certbot --apache --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email 

获取证书并将其安装到服务器上后,转到Cloudflare dashboard并启用Cloudflare Universal SSL。

下一步

我希望本教程能帮助您在Apache虚拟主机上启用HTTPS,让我们在Ubuntu上加密。您可能还想设置ModSecurity web应用程序防火墙,以保护您的网站免受黑客攻击。

  • 如何在Debian/Ubuntu上使用Apache设置ModSecurity

为了提高网站速度,可以使用Apache启用HTTP/2协议。

  • 如何在Ubuntu上使用Apache启用HTTP/2协议

和往常一样,如果你觉得这篇文章有用,那么订阅我们的免费时事通讯以获得更多教程。