如何在DigitalOcean负载平衡器上配置SSL终止

DigitalOcean负载平衡器允许您轻松地在一组后端Droplet之间分配流量。虽然HTTP转发可能是处理客户端请求的最直接的方法,但是许多情况需要额外的安全性。在本指南中,我们将演示如何...

介绍

DigitalOcean负载平衡器允许您轻松地在一组后端Droplet之间分配流量。 虽然HTTP转发可能是处理客户端请求的最直接的方法,但是许多情况需要额外的安全性。

在本指南中,我们将演示如何使用SSL终止配置DigitalOcean负载平衡器。 客户端使用HTTPS安全地连接到负载平衡器。 负载平衡器解密流量并将纯HTTP数据流转发到后端Web服务器。 这为您提供了负载均衡器和客户端之间的SSL加密的优点,同时通过在单个位置维护证书文件来简化SSL要求。

我们将使用两个后端Droplets演示此过程。 我们将在本指南的过程中创建一个DigitalOcean负载平衡器,所以你不需要一个开始。

注意:具有SSL终止的负载平衡器在客户端和负载平衡器之间提供加密流量。 但是,负载平衡器和后端之间的流量仍然使用HTTP。 我们建议您始终在后端Droplets使用专用网络,因为负载均衡器将在可用时与此接口通信。

先决条件

在开始之前,您需要创建两个在同一区域启用专用网络的 Ubuntu 16.04 Droplet。 在每个这些服务器上,使用sudo权限配置非root用户,并按照我们的Ubuntu 16.04初始服务器设置指南设置防火墙。

本教程将使用Let's Encrypt获取负载均衡器的SSL证书。 为了请求证书,您需要一个域名,以在负载均衡器可用时分配给它。

一旦配置了这些服务器,请按照下面的步骤。

在后端安装Web服务器软件

在我们创建负载均衡器之前,我们将配置我们的后端Droplet,以便他们能够响应他们将收到的请求。

在每个Droplets上,刷新apt软件包索引,然后键入以下命令安装Nginx Web服务器:

sudo apt-get update
sudo apt-get install nginx

安装完成后,通过输入以下命令允许HTTP流量通过UFW防火墙:

sudo ufw allow 'Nginx HTTP'
Rule added
Rule added (v6)

您可以键入以下内容来确认是否成功添加了规则:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

在大多数情况下,您将希望后端提供的服务彼此相同。 但是,对于本指南,我们将在每个后端放置一些独特的内容,以更好地演示分布式请求处理。

在每个 index.html ,在服务器的文档根目录中创建一个index.html文件:

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

第一个Droplet上 ,输入以下内容:

/var/www/html/index.html在第一个后端
<h1 style="color:blue">First Backend</h1>

在第二个Droplet上 ,输入此内容:

/var/www/html/index.html第二个后端
<h1 style="color:orange">Second Backend</h1>

完成后保存并关闭文件。

您应该能够通过访问您的Web浏览器中的Droplet的IP地址访问这些页面:

http://droplet_IP_address

检查您的所有后端是否都能正确投放其内容。

创建负载平衡器

现在后端服务器已配置,我们已经准备好创建负载均衡器来处理流量分配。

在DigitalOcean控制面板中,单击顶部导航栏中的“ 网络”项,然后在随后的页面中选择“ 负载平衡器 ”选项卡:

在DigitalOcean控制面板中选择负载平衡器

接下来,单击创建负载均衡器按钮。 如果您目前没有任何负载平衡器,则在页面中间,否则在右上角:

创建新的DigitalOcean负载均衡器按钮

在以下的负载平衡器创建页面上,从为新的负载平衡器选择一个名称开始。

当我们使用Let's Encrypt请求证书时,我们的服务器需要能够响应域验证问题。 添加单个后端最初确保负载均衡器只能选择正确的后端以响应该挑战。

仅将您的第一个后端Droplet添加到“ 添加Droplet”部分下的负载平衡器,方法是按名称选择:

将第一个后端Droplet添加到负载平衡器

转发规则部分,默认规则指定负载均衡器上的HTTP端口80转发到后端的HTTP端口80是正确的我们的目的。 高级设置现在也可以单独使用。

准备就绪后,单击底部的“ 创建负载均衡器 ”按钮:

创建DigitalOcean负载均衡器

您的负载平衡器将在几分钟内创建。

为负载均衡器分配域名

创建完成后,您将可以在负载平衡器索引页面上访问负载平衡器的IP地址:

负载均衡器索引页面

现在我们有我们需要的信息将我们的域名指向负载均衡器的IP地址。

按照我们的向DigitalOcean设置域名的指南为您的域创建A记录 将域指向您的负载均衡器的IP地址,而不是单个Droplet。

完成后,您应该能够通过在网络浏览器中请求您的域名来访问您的第一个后端服务器:

http://example.com

第一个后端页面

当您可以通过请求您的域名访问第一个Droplet后端时,我们可以安装Let's Encrypt客户端并请求证书。

准备让我们在第一个后端加密客户端

现在第一个后端可以通过域访问,我们可以请求我们的SSL证书。 使用您的sudo用户登录您的第一个后端Droplet(当前连接到负载均衡器的一个)。

Ubuntu 16.04在其默认存储库中提供了Let's Encrypt客户端,因此我们可以使用apt通过键入以下内容来安装它:

sudo apt-get install letsencrypt

客户端安装后,打开默认的Nginx服务器块配置文件。 我们将添加让加密客户端正确响应证书挑战所需的位置块:

sudo nano /etc/nginx/sites-enabled/default

server块内部,添加一个正则表达式location块,显式地允许访问包含.well .well-known

/ etc / nginx / sites-enabled / default在第一个后端
server {
    . . .

    location ~ /.well-known {
        allow all;
    }

    . . .
}

保存并在完成后关闭文件。

键入以下命令来测试语法错误的配置:

sudo nginx -t

如果没有发现问题,您应该看到如下输出:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果语法检查成功,请重新启动Nginx以包含您的更改:

sudo systemctl restart nginx

Nginx现在配置正确,以响应Let's Encrypt域验证挑战。

请求加密证书

现在,我们可以使用以下命令为我们的域请求证书。 将您的域替换为第一个-d后的参数,以及附加-d标志后的任何其他名称:

sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.com -d www.example.com

系统将提示您输入辅助电子邮件地址,并接受Let's Encrypt条款及细则。 如果一切顺利,您应该看到类似于以下内容的消息:

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to sammy@digitalocean.com.
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2017-05-04. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

我们现在拥有在负载平​​衡器上配置SSL终止所需的证书文件。

检查Let's Encrypt用来保存证书文件的目录,以找到我们需要的特定子目录。 它应该以您的域名命名:

sudo ls /etc/letsencrypt/live
example.com

通过键入以下内容列出该目录中的文件:

sudo ls /etc/letsencrypt/live/example.com
cert.pem  chain.pem  fullchain.pem  privkey.pem

我们将需要cert.pemprivkey.pemfullchain.pem文件的内容来在负载平衡器上设置SSL终止。

在负载均衡器上配置SSL终止

我们现在可以修改负载均衡器的设置,以接受HTTPS流量,并通过HTTP将其转发到我们的后端。

为SSL流量添加负载平衡规则

在负载平衡器索引页面上,使用DigitalOcean控制面板(通过选择网络 ,然后选择负载平衡器),单击负载平衡器的名称以查看详细信息页面:

在DigitalOcean控制面板中选择负载平衡器

在详细信息页面上,单击设置以转到设置页面:

DigitalOcean负载均衡器设置页面

单击与转发规则行相关编辑按钮。 您应该会看到当前规则,然后是一个添加其他规则的选项:

DigitalOcean负载均衡器编辑规则

从“ 新建规则”下拉菜单中,选择HTTPS 默认填充的选项,将端口443上的HTTPS流量转发到后端的HTTP端口80,对于我们的配置是正确的。 我们唯一需要做的是添加我们的SSL配置的细节。

证书字段下拉菜单中,选择+新证书选项:

DigitalOcean负载均衡器新认证按钮

将出现模态,询问您要使用的证书的详细信息。 您需要填写以下详细信息:

名称:

  • 它是什么? 将在DigitalOcean界面中标识证书的名称。
  • 如何得到它? 你自己选择这个名字。 你可以叫它任何东西,只要名字只包含字母,数字,句点或破折号。

公钥:

  • 它是什么? 这是实际的SSL公钥或证书文件。
  • 如何得到它? 在本指南中,这是/etc/letsencrypt/live/ example.com目录中的cert.pem文件确保在以下命令的输出中包含BEGIN CERTIFICATEEND CERTIFICATE行:

    sudo cat /etc/letsencrypt/live/example.com/cert.pem
    

私钥:

  • 它是什么? 与证书关联的密钥。
  • 如何得到它? 在本指南中,这是/etc/letsencrypt/live/ example.com目录中的privkey.pem文件。 请确保在以下命令的输出中包含BEGIN PRIVATE KEYEND PRIVATE KEY行:

    sudo cat /etc/letsencrypt/live/example.com/privkey.pem
    

证书链:

  • 它是什么? 这是受信任的证书颁发机构的证书与您的域的证书之间的完全信任链。
  • 如何得到它? 在本指南中,这是/etc/letsencrypt/live/ example.com目录中的fullchain.pem文件。 请确保在以下命令的输出中包含第一个BEGIN CERTIFICATE和最后一个END CERTIFICATE行:

    sudo cat /etc/letsencrypt/live/example.com/fullchain.pem
    

当你完成后,它应该看起来像这样:

DigitalOcean负载均衡器添加证书

单击保存SSL证书按钮继续。

转发规则部分中,点击保存以实施新的转发规则。

注意:要管理已添加到DigitalOcean的SSL凭据,请单击控制面板右上角的用户图标,然后从显示的下拉菜单中选择设置

在显示的左侧菜单上,选择安全 每个已上传的证书的条目都可以在TLS / SSL证书部分下找到 要正确识别证书,请在Let's Encrypt目录中匹配显示的指纹与证书的指纹,可以通过键入以下内容找到它:

sudo openssl x509 -noout -sha1 -fingerprint -in /etc/letsencrypt/live/example.com/cert.pem

您可以删除此界面中上传的所有SSL证书。

(可选)强制SSL流量

如果您想强制访问者通过HTTPS进行连接,以确保数据完整性和安全性,您可以选择将HTTP流量重定向到HTTPS。 对负载平衡器执行的任何不安全连接将被重定向以使用您加载的证书。

为此,请在设置中单击与SSL行相关联的“编辑”按钮:

DigitalOcean负载均衡器重定向SSL部分

在内部,选择将HTTP重定向到HTTPS复选框:

DigitalOcean负载均衡器选择重定向

单击保存以实施更改。

向负载均衡器添加其他后端

当我们第一次设置负载均衡器时,我们只添加了一个后端,这样我们可以保证一个已知的服务器会收到Let's Encrypt域验证的挑战。 由于我们现在有我们的证书,我们可以添加我们的剩余后端。

单击负载均衡器详细信息页面中的Droplets项:

DigitalOcean负载平衡器滴

点击右上角的添加Droplet按钮。 在显示的模式中,按名称搜索以将您剩余的后端添加到负载平衡器。 准备好后,点击模态上的添加Droplet按钮:

DigitalOcean负载均衡器添加额外的Droplet

第二个Droplet将被添加到负载均衡器。 一旦它对所需数量的健康检查做出积极回应,它就会开始接收流量。

测试平衡

此时,您的负载平衡器后面应该有两个Droplet。 HTTPS应该可用于加载负载平衡器和客户端之间的流量。 如果您选择将HTTP重定向到HTTPS,则此加密将是必需的。

要测试配置是否有效,请在网络浏览器中访问您的域名,前面加上https:// 如果启用了SSL重定向,则不必指定协议:

https://example.com

您应该会从其中一个后端看到index.html网页:

第一后端索引

应该在地址栏中将连接标记为安全,但安全状态的显示方式将因浏览器而异。

如果您刷新页面,您应该会看到来自其他后端的index.html页面:

第二后端索引

同样,这应该被标记为安全。 由于第二个后端没有参与证书请求过程,这就告诉我们负载均衡器本身正在处理SSL负载。

更新证书

重要的是跟踪您的证书的到期,以避免服务中断。

要转换到更新的证书,请通过访问帐户级设置页面并单击安全将新证书上传到DigitalOcean界面。 TLS / SSL证书部分中,上传新的证书文件。

当您准备切换到新证书时,通过单击顶部菜单中的网络,然后选择负载平衡器访问您的负载平衡器页面。 按名称选择负载均衡器,然后单击设置页面。

单击与转发规则部分相关编辑按钮。 在您的HTTPS规则中,选择新证书,然后在准备切换时单击保存

结论

您现在应该有一个配置了SSL终止的DigitalOcean负载均衡器。 负载平衡器将负责使用证书加密传出的流量并解密传入的流量。