介绍Cloudflare提供的几种网站HTTPS加密方法与提高网站安全性的方式,同时介绍防止通过域名暴露IP的方法,和阻断IP访问握手,进而防止获取域名的方法,提高网站的安全性。

Cloudflare的TLS安全设置

TLS严格加密模式

使用Cloudflare解析域名的一大重要原因就是其免费的CDN(Proxy)功能,这需要至少访问者到Cloudflare之间使用TLS加密。Cloudflare提供了灵活、完全和严格三种方案。灵活(flexible)表示用户浏览器与Cloudflare使用Cloudflare提供的证书加密,而完全(Full)严格(strict)需要Cloudflare与源服务器通信也需要加密。

证书适用范围

使用灵活模式加密的站点不需要服务器配置证书,若服务器申请了证书,请选择完全加密模式。

源服务器证书

Cloudflare 源证书是 Cloudflare 颁发的免费 TLS 证书,可以安装在源服务器上,以方便使用 HTTPS 的访问者进行端到端加密。

Cloudflare提供的源服务器证书有效期为15年,供严格加密模式使用。只能用于通过Cloudflare代理的TLS加密。

新增选择泛域名 example.com*.example.com ,新增PEM格式证书和私钥。您可以粘贴至宝塔面板等应用。

客户端证书——防止暴露IP

参见:如何避免Cloudflare背后的源站被恶意访问 | Mayx的博客

Cloudflare 官方文档:Authenticated origin pull · Cloudflare SSL/TLS docs

Cloudflare提供了经过身份验证的源服务器拉取功能,即Authenticated Origin Pulls (mTLS),根据官方文档介绍,简单原理即为在TLS的基础上增加一层握手,能够有效的防止泄露源站IP。

有客户端认证的TLS握手

部署步骤:

  1. 根据Cloudflare部署步骤,下载Cloudflare提供的证书,并部署在源服务器上
  2. 以Nginx为例,先将证书转换成crt格式:

    openssl x509 -in authenticated_origin_pull_ca.pem -out cloudflare.crt
  3. 将Nginx server 中启用客端验证:

    # Cloudflare 客户端认证
    ssl_client_certificate /etc/nginx/certs/cloudflare.crt;
    ssl_verify_client on;
  4. 在Cloudflare/TLS/源服务器页面下,开启“经过身份验证的源服务器拉取”后,即可保护源站。

DNSSEC

域名系统安全扩展(英语:Domain Name System Security Extensions,缩写为DNSSEC)是Internet工程任务组(IETF)的对确保由域名系统 (DNS)中提供的关于互联网协议(IP)网络使用特定类型的信息规格包。它是对DNS提供给DNS客户端(解析器)的DNS数据来源进行认证,并验证不存在性和校验数据完整性验证,但不提供机密性和可用性。 DNSSEC 验证可以保护 DNS 数据,也可使这类数据在 DNS 以外的应用程序中值得信赖,因此,为域名部署 DNSSEC,有利于互联网安全,并可加强应对攻击能力。

请阅读Cloudflare文档了解DNSSEC是如何工作的,开启DNSSEC需要去域名注册商添加Cloudflare提供的认证信息。

在腾讯云注册的域名可以参考此文配置:Cloudflare配置DNSSEC-腾讯云开发者社区-腾讯云 (tencent.com)

需要注意Cloudflare给出的配置与腾讯云对应的是:

关键标签:密钥标记
加密算法:算法
摘要类型:摘要类型
摘要:摘要

其中加密算法13 在腾讯云中的对应是 ECDSA Curve P-256 with SHA-25

HSTS

HSTS 是 HTTP 严格传输安全(HTTP Strict Transport Security)的缩写。启用HSTS后服务器会拒绝未加密的连接,强制HTTPS加密访问,用户不能绕过无效的证书。

如何从浏览器的 HSTS 缓存中删除域?

参考:什么是HSTS,为什么要使用它? - 知乎 (zhihu.com)

在设置 HSTS 并测试它时,可能需要清除浏览器中的 HSTS 缓存。 如果你设置 HSTS 不正确,你可能会访问网站出错,除非你清除数据。 下面是几种常用浏览器的方法。 还要注意,如果你的域在 HSTS 预加载列表中,清除 HSTS 缓存将是无效的,并且无法强制进行 HTTP 连接。

要从 Chrome HSTS 缓存中删除一个域名,请按照以下步骤操作:

  1. 访问 chrome://net-internals/#hsts
  2. Delete domain security policies下的文本框中输入要删除的域
  3. 点击文本框旁边的 Delete 按钮

删除域名

之后,你可以检查移除是否成功:

  1. Query HSTS/PKP domain 下的文本框中输入要验证的域
  2. 点击文本框旁边的 Query 按钮
  3. 返回应该是 not found

查询域名

Nginx配置HTTPS安全

IP访问时拒绝握手

需要Nginx版本大于 1.19.4可以使用本功能,本例中Nginx 版本1.22.1,添加default_server服务器,对443端口拒绝握手

# Block IP access
 server {
  listen 80 default_server;
  server_name _;
  server_name 1.2.3.4;
  #return 403;
  return 301 https://$host$request_uri;
  }

  server{
  listen 443 ssl http2 default_server;
  server_name _;
  server_name 1.2.3.4;
  #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则

  # 阻止握手
  ssl_reject_handshake on;
  
  # Cloudflare 客户端认证
  ssl_client_certificate /www/server/panel/vhost/cert/cloudflare.crt;
  ssl_verify_client on;
  
  #tmp tls
  ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  error_page 497  https://$host$request_uri;
  #SSL-END
 }