背景
最近开发项目过程中,项目突然不能访问了,vs调试也不能成功,日志也没有。但.net 8的项目又能成功,真是一头雾水啊,问题在哪里都没找到。最后找到的原因,真是哭笑不得,因为某一个项目配置添加了HSTS,导致了所有localhost访问的网站,全部不能访问了。
作为经验教训,一定要好好记下来。因为公司有很多项目,所以会有交叉开发的情况,有时候就会打开其他项目修改代码或者测试。其中一个项目就做了HSTS的配置,因为之前没有弄过着个配置,所以不知道它的作用,现在终于了解。
问题表现
问题的表现就是上面描述的那样,不仔细看还不知道,是被强制跳转https 了,现在地址栏都不显示https或http了,所以不容易发现。调试浏览器就可以看到下面的情况了。第一个localhost使用得是http,但浏览器强制307跳转到htpps了,虽然都是localhost,但协议已经变了,本地发布一般会使用证书,所以https无法访问。
解决办法就是安装证书让https可以访问,另外就是删除localhost 的HSTS。
安装证书网上的教程很多,IIS自己都可以发布一个,给本地访问使用。删除HSTS也很简单。介绍一下HSTS,这才是问题的核心。
HSTS(HTTP Strict Transport Security)
HSTS(HTTP Strict Transport Security) 是一种Web安全策略机制,用于告知浏览器只能通过 HTTPS 协议访问一个网站,而不允许通过 HTTP 协议访问。这是为了防止一些常见的攻击方式,如 SSL剥离攻击(SSL Stripping),确保网站的所有请求都经过加密的HTTPS连接。
HSTS的工作原理:
1、服务器启用HSTS:
网站服务器通过在响应头中包含一个特殊的 Strict-Transport-Security 头部来启用HSTS。例如:
Strict-Transport-Security: max-age=31536000; includeSubDomains
这个头部的意思是,网站要求浏览器仅通过HTTPS访问,并且要求该策略在 31536000秒(即一年) 内生效。此外,includeSubDomains 指定该策略也适用于所有子域名。
2、浏览器的行为:
当浏览器首次访问支持HSTS的HTTPS网站时,服务器返回这个 Strict-Transport-Security 头部,浏览器将把该站点的所有后续请求都强制转为HTTPS连接。
即使用户在地址栏中输入的是 http://,浏览器也会自动将其转换为 https://,从而避免了通过不安全的HTTP协议访问。
3、防止SSL剥离攻击:
SSL剥离攻击是一种攻击方式,攻击者通过拦截和修改从浏览器到服务器的通信,将原本的HTTPS请求劫持为HTTP请求,导致敏感数据在未加密的HTTP连接中传输,从而泄露信息。
HSTS有效阻止了这种攻击,因为一旦浏览器知道该网站支持HSTS,所有后续请求都会通过HTTPS而不是HTTP进行,攻击者无法轻易劫持连接。
HSTS的常用参数:
max-age=<seconds>:指定HSTS策略的有效期(以秒为单位)。浏览器在这段时间内强制使用HTTPS访问该站点。
includeSubDomains:表示HSTS策略不仅适用于根域名,还适用于所有子域名。
preload:这是一个可选标记,表示网站希望将其域名列入浏览器的HSTS预加载列表。预加载列表是浏览器厂商维护的一个固定列表,在浏览器首次访问时就知道哪些网站支持HSTS,从而立即启用HTTPS,而无需等待服务器返回头部。
使用HSTS的优势:
1、增强安全性:通过强制使用HTTPS协议,确保所有的数据都经过加密传输,防止中间人攻击。
2、防止SSL剥离攻击:阻止攻击者通过降级攻击让用户与网站之间的连接回退到HTTP。
3、提高用户信任:HSTS是一个标准化的安全措施,显示网站对数据保护的重视,增强用户对网站的信任。
使用HSTS的注意事项:
1、一旦启用,不能轻易撤销:一旦浏览器缓存了HSTS规则,用户在设置的 max-age 时间内都必须通过HTTPS访问该网站。如果站点后来禁用HSTS,用户的浏览器可能仍会将其请求转向HTTPS,直到缓存过期。
2、预加载列表的应用:如果启用了 preload 标记并且将网站提交到HSTS预加载列表,网站必须始终使用HTTPS,否则可能会影响访问。
示例:
假设你的服务器想要启用HSTS,可以在HTTP响应中添加如下头部:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
浏览器这样做会:
- 强制浏览器在未来一年内(max-age=31536000)使用HTTPS访问该站点。
- 确保所有子域名(includeSubDomains)也遵循该策略。
- 提交到浏览器的HSTS预加载列表(preload)。
SSL剥离攻击(SSL Stripping)
SSL剥离攻击(SSL Stripping) 是一种中间人攻击(Man-in-the-Middle Attack),攻击者通过劫持客户端与服务器之间的通信,将原本的 HTTPS(加密的安全连接)降级为 HTTP(未加密的连接),从而使得敏感数据(如用户名、密码、信用卡信息等)以明文形式传输,容易被攻击者窃取。
攻击过程:
1、正常的HTTPS请求:用户向一个网站发送HTTPS请求(例如,https://example.com),该请求会被发送到服务器。
2、攻击者介入:攻击者位于客户端和服务器之间,充当中间人。当浏览器向目标服务器请求建立HTTPS连接时,攻击者拦截并修改请求。
3、降级为HTTP:攻击者将客户端的HTTPS请求转发为HTTP请求(例如,http://example.com),然后将修改后的请求发送到目标服务器。
4、服务器响应:目标服务器返回一个普通的HTTP响应,可能没有加密保护。
5、客户端接收未加密数据:浏览器收到HTTP响应后,认为是一个正常的HTTP响应,因此不会加密数据。这时,所有数据,包括敏感信息,都通过不安全的HTTP连接传输。
删除HSTS
网站添加 HSTS 配置,主要是保护网站的安全,在互联网上,这是比较重要的。而对于本地调整却比较麻烦,本地调试所有项目都是使用localhost的,而且基本都没有使用https,这样已设置HSTS,所有网站都不能访问了。
配置证书可以到网上查找教程,简单介绍一下删除某一个域名的HSTS 删除 。在浏览器地址栏输入下面地址。
google浏览器:chrome://net-internals/#hsts
edge浏览器:edge://net-internals/#hsts
添加要操作的域名,点击“delete”即可。