如何设置端到端的CloudFlare SSL加密

建立任何网站的SSL都是一个挑战。网站访问者、浏览器和搜索引擎都会奖励一个正确设置的安全套接字层(SSL)的网站。以前,这个过程涉及购买、安装和配置SSL证书。但是通过Cloudflare SSL,您只需点击几下即可完成SSL配置过程!

在本文中,您将学习如何通过Cloudflare为您的网站配置SSL加密。因此,逐步实现端到端的加密SSL连接!

先决条件

要按照本教程进行操作,需要一些以下的先决条件:

建立Cloudflare通用SSL:只是个开始

有几种方法可以使用Cloudflare配置SSL。通常,最快的方法是选择通用SSL。为什么?使用通用SSL,Cloudflare会提供一个证书,而不是您自己购买和配置SSL证书,然后所有通过Cloudflare发送的流量都将使用该证书。

启用通用SSL后,Cloudflare会向访问者和搜索引擎提供有效的SSL证书。Cloudflare也无需配置服务器或网站来使用该证书,非常方便!

1. 打开您的网络浏览器并登录Cloudflare仪表板

2. 从帐户域列表中导航到您的站点,如下所示。

Choose the site to change options for.

3. 现在,点击SSL/TLS以查看您站点的加密选项。

The SSL/TLS Encryption mode page

4. 选择Flexible选项以启用通用SSL。一旦选择,更改立即生效。您的站点现在在浏览器和Cloudflare之间加密!

Enabling Universal SSL on Cloudflare

配置完整的端到端SSL加密

虽然通用SSL是开始保护站点的好选择,但它使服务器与Cloudflare之间的流量不受保护。幸运的是,有两种加密模式可用于加密从Cloudflare到服务器的流量,分别是完全和完全(严格)加密,每种都有主要不同的证书安装要求。

  • 完全 – 需要服务器上的证书,但这可以是自签名证书。
  • 全(严格)- 安装的服务器端证书必须是有效的证书。

让我们来看看这些加密方法的区别以及如何设置它们。

使用自签名证书设置完整的SSL/TLS加密

与通用SSL不同,完整的SSL/TLS加密需要您的网络服务器正确地提供SSL证书,以加密从服务器到Cloudflare的流量。有许多实现这一目标的方法,但本教程演示了在带有NGINX的Linux服务器上执行的步骤。

生成自签名证书

为了加密Cloudflare与您源服务器之间的连接,您需要一个SSL证书。由于完整的SSL/TLS加密模式不要求证书被完全信任,因此您可以使用自签名证书快速运行。

1. Secure Shell (SSH) 进入您的Linux网络服务器。

2. 通过运行下面的命令,更改 (cd) 到标准的Ubuntu SSL目录 (/etc/ssl)。cd /etc/ssl

cd /etc/ssl
Navigating to the /etc/ssl directory

3. 现在,使用 openssl 命令生成您站点的公钥和私钥。为此,请运行下面的 openssl 命令。

这个命令完成了几件事:

  • 通过 -x509 参数请求一个X.509证书。
  • 当被NGINX引用时,允许NGINX使用 -nodes 参数在启动时读取证书。
  • 指定证书有效的天数。
  • 创建一个新的公钥和私钥,使用-newkey和2048位的RSA加密(rsa:2048)。
  • 将私钥保存到/etc/ssl/private/nginx-selfsigned.key,使用-keyout参数。
  • 将公钥保存到/etc/ssl/certs/nginx-selfsigned.crt,使用-out参数。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

如果openssl返回一个无害的错误Can't load /root/.rnd into RNG,您需要在/etc/ssl/openssl.cnf中注释掉#RANDFILE = $ENV::HOME/.rnd行。所有现代版本的openssl都会回退到使用系统/dev/urandom设备进行随机熵数据,不需要特定的文件进行种子生成。

4. 成功运行命令后,openssl将提示您提供一些信息。以下是本教程提供的所有值。

  • 国家名称: US
  • 州或省名称: 伊利诺伊
  • 地点名称: 布卢明顿
  • 组织名称: 测试公司,有限责任公司
  • 组织单位名称: <blank>
  • 通用名称: test.adamlistek.me
  • 邮箱地址: [email protected]
Generating a self-signed certificate

5. 最后,使用 test 命令验证证书是否存在。如果 test 命令返回 (echo $?) 0,那么文件如预期般存在。您可以在以下截图中看到每个命令返回了一个 0 值。

test -f /etc/ssl/private/nginx-selfsigned.key; echo $?
 test -f /etc/ssl/certs/nginx-selfsigned.crt; echo $?
Verifying that the certificate files exist

配置 NGINX

现在证书已经生成并存储在 /etc/ssl/certs/etc/ssl/private 关键位置,NGINX 必须配置以应用证书并提供站点内容。

NGINX 站点配置是在虚拟主机文件中定义的 server 块中,这些文件通常包含在虚拟主机文件中。在下面的示例中,基本站点配置存储在 test.adamlistek.me.conf 文件中,并包含在主 nginx.conf 文件中。

1. 首先,使用您选择的名称创建一个新的虚拟主机文件,但是对于这个示例,请将其命名为 test.adamlistek.me.conf 并放在 /etc/nginx/vhosts.d 目录下。然后将下面的内容复制到虚拟主机文件中并保存。

test.adamlistek.me 域名替换为您自己的域名,因为这只是演示目的。如果 /etc/nginx/vhosts.d 目录不存在,则通过运行 mkdir /etc/nginx/vhosts.d 创建该目录。

server {
   # 监听 IPv4 和 IPv6 上的端口 80
   listen 80;
   listen [::]:80;
 server_name test.adamlistek.me;
 # 对任何参数执行 301 重定向到下面的 SSL 服务器块
   return 301 https://test.adamlistek.me$request_uri;
 }
 server {
   # 监听启用了 HTTP2 的 IPv4 和 IPv6 上的端口 443(需要 SSL)
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
 server_name test.adamlistek.me;
 # 公共和私有证书的位置
   ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
   ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
 # 要加载的 Web 文件的位置,这是默认的 NGINX 位置
   root /usr/share/nginx/html;
 # 在根域请求时提供的默认文件
   index index.html;
 }

2. 验证您的主 NGINX 配置文件,/etc/nginx/nginx.conf,是否包含位于该文件末尾的 http 块中的必要 include 行。

# 服务器配置放在这里
 …
 http {
     # 额外的配置放在这里# 包含虚拟主机
     include /etc/nginx/vhosts.d/*.conf;
 }

3. 如果您使用的是 systemd(这是 Linux 的一种现代系统和服务管理器),请使用以下命令重新启动 NGINX。

service nginx restart

4. 返回到 Cloudflare,验证自签名证书是否正常工作。为此,请在下面显示的位置禁用 DNS 记录的 “orange-cloud” 选项。Proxy status。禁用 “orange-cloud” 选项将绕过 Cloudflare 并直接从 Web 服务器提供请求。

Disabling Cloudflare proxying via Proxy Status.

确保网站通过浏览器导航返回新创建的自签名证书。这样做将导致下面显示的警告页面。

Displaying the self-signed certificate error.

最后,在Cloudflare上启用完整的TLS/SSL加密。为此,重新启用先前禁用的DNS记录上的“橙色云”Cloudflare代理状态。然后导航到SSL/TLS选项卡,单击下面显示的Full单选按钮。

Enabling Full SSL/TLS encryption on Cloudflare.

生成用于全面(严格)SSL/TLS加密的起源证书

全面的加密模式不能保证Web服务器呈现的证书具有实际有效的证书链。因此,请选择非严格的加密,Cloudflare将接受服务器呈现的任何证书。

Cloudflare提供生成免费TLS证书以保护您的起源服务器连接的功能。但是使用Cloudflare提供的起源证书有两个缺点。一个是您需要手动生成和安装证书。第二个是证书看起来像是一个除Cloudflare之外任何浏览器都不信任的自签名证书。

可以使用Origin CA Create Certificate API端点自动执行证书生成,但这超出了本教程的范围。

1.通过转到SSL/TLS选项卡 —> 原始服务器,如下所示,然后单击创建证书按钮,导航到原始服务器。

Navigating to the Origin Server page.

2. 正如您下面所看到的, 默认选项已经设置为为具有 15 年有效期的域生成通配符证书 —— 很棒!所以保留默认选项,并点击页面右下角的创建按钮生成证书。

A wildcard certificate, shown as *.domain.com, means that any subdomain will also be covered by this certificate including www.

Creating a Cloudflare-provided origin server certificate.

3. 使用GNU nano文本编辑器首先保存私钥和公钥。由于有两个密钥要保存,您需要逐个保存密钥文件。

确保保存私钥,因为它只在生成原始证书时才可用。如果您意外丢失了此密钥,请撤销证书并重新发行新证书。

打开终端,然后通过运行下面的第一个命令创建并打开公钥文件(nginx-test.adamlistek.me.crt)以在 nano 中进行编辑。

接下来,返回 Cloudflare 并通过点击点击复制选项复制(公钥)源证书密钥,如下所示。然后将您复制的公钥粘贴(Ctrl+U)到在 nano 中打开的公钥文件中。保存更改(Ctrl+O)并从 nano 退出(Ctrl+X)。

保存公钥文件后,从创建密钥文件、从 Cloudfare 复制密钥并将其保存在密钥文件中的过程中重复相同的步骤。但是这次您正在创建私钥文件(nginx-test.adamlistek.me.key)。

# 在“原始证书”部分下面的公钥
 nano /etc/ssl/certs/nginx-test.adamlistek.me.crt
# 在同名部分下面的私钥
 nano /etc/ssl/private/nginx-test.adamlistek.me.key
Copying the public/private certificate key information.

4. 现在,您已经创建了公钥和私钥,请通过修改以下行来指向 NGINX 到证书的位置。在修改以支持您的域的情况下,修改 test.adamlistek.me.conf 配置文件。

 ssl_certificate /etc/ssl/certs/nginx-test.adamlistek.me.crt;
 ssl_certificate_key /etc/ssl/private/nginx-test.adamlistek.me.key;

5. 要应用新证书,请使用以下命令重新启动 NGINX。

service nginx restart

6. 现在回到 Cloudflare 的 SSL/TLS 选项卡,在下面的情况下通过单击 Full (strict) 更新 SSL/TLS 加密模式。

Setting the Encryption mode to Full (strict).

使用 LetsEncrypt 启用完整 (strict) SSL/TLS 加密

使用 Cloudflare 原始证书的最大缺点是它仅由 Cloudflare 信任。如果您需要一个完全由浏览器信任的证书,无论是作为备用还是为了更多控制,LetsEncrypt 都提供生成有效证书的功能。

尽管您可以使用任何有效的证书,但LetsEncrypt 是生成有效证书的常见选择。有多个 LetsEncrypt 客户端可用,但本教程演示了 acme.sh 客户端。

由于您已经在 Cloudflare 上,使用 LetsEncrypt 的 DNS 选项是进行 DNS 配置的最佳方法之一。

1. 首先,打开您的终端并通过 curl 命令安装 acme.sh

curl https://get.acme.sh | sh
Installing the acme.sh client.

2. 接下来是创建或修改位于安装目录中的account.conf文件,以添加保存的Cloudflare API密钥。这些密钥可以在Cloudflare仪表板的个人资料 —> API令牌部分找到。

虽然您可以创建一个特定的权限限制令牌,但为了本教程的目的,请改用全局API密钥,如下所示。

SAVED_CF_Key='cloudflareglobalapikey'
 SAVED_CF_Email='[email protected]'

3. 通过以下命令生成证书。注意下面的命令告诉acme.sh客户端使用Cloudflare(dns_cf)来验证(--dns)证书的所有权。然后设置等待时间(--dnsslep)为20秒,然后颁发(--issue)证书给域(test.adamlistek.me)。

当命令完成时,您将看到您可以找到证书、证书密钥、中间CA证书和完整链证书的路径。

acme.sh --issue --dns dns_cf --dnssleep 20 -d test.adamlistek.me
Generating the LetsEncrypt certificate.

4. 与之前一样,修改NGINX站点配置以更改ssl_certificatessl_certificate_key的位置。确保将/home/user替换为您的acme.sh安装位置。

ssl_certificate /home/user/.acme.sh/test.adamlistek.me/test.adamlistek.me.csr;
 ssl_certificate_key /home/user/.acme.sh/test.adamlistek.me/test.adamlistek.me.key;

5. 通过以下命令重新启动NGINX来应用新配置。

service nginx restart

6. 最后,通过转到SSL/TLS选项卡,然后单击完全(严格)来更新您的Cloudflare SSL/TLS加密模式。

Setting the Encryption mode to Full (strict).

结论

在本教程中,您已经学会了如何使用各种 Cloudflare 提供的 SSL/TLS 选项保护您的网站。将 LetsEncrypt 添加到您的 Cloudflare SSL 配置中还添加了灵活且用户可管理的源证书选项!

有了保护站点访问者连接的各种选项的知识,您是否会逐步实现与 Cloudflare SSL 服务器的完全安全连接?

Source:
https://adamtheautomator.com/cloudflare-ssl/