介绍Cloudflare提供的几种网站HTTPS加密方法与提高网站安全性的方式,同时介绍防止通过域名暴露IP的方法,和阻断IP访问握手,进而防止获取域名的方法,提高网站的安全性。
Cloudflare的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。
部署步骤:
- 根据Cloudflare部署步骤,下载Cloudflare提供的证书,并部署在源服务器上
以Nginx为例,先将证书转换成
crt
格式:openssl x509 -in authenticated_origin_pull_ca.pem -out cloudflare.crt
将Nginx
server
中启用客端验证:# Cloudflare 客户端认证 ssl_client_certificate /etc/nginx/certs/cloudflare.crt; ssl_verify_client on;
- 在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 缓存中删除一个域名,请按照以下步骤操作:
- 访问
chrome://net-internals/#hsts
- 在
Delete domain security policies
下的文本框中输入要删除的域- 点击文本框旁边的 Delete 按钮
之后,你可以检查移除是否成功:
- 在
Query HSTS/PKP domain
下的文本框中输入要验证的域- 点击文本框旁边的 Query 按钮
- 返回应该是 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
}