中间人劫持连接的应对办法是什么?(一)

日期: 栏目:文章分享 浏览:982 评论:0

站点通过HTTPS 对外提供服务,用户在访问某站点,往往会直接输入站点域名,而不是完整的HTTPS地址,站点一般会发送301重定向,要求浏览器升级到HTTPS连接。

将所有非安全请求重定向到安全URL是常规做法,但是中间人仍然可以在重定向发生前劫持连接。

HSTS指示浏览器只能使用HTTPS访问域名,来处理潜在的中间人劫持风险。即使用户输入或使用普通的HTTP连接,浏览器也严格将连接升级到HTTPS。

HSTS

HSTS是一种可选的安全增强策略,已经由IETF 中指定。

服务端通过--响应头来通知客户端应用 HSTS协议。

Strict-Transport-Security: max-age=31536000; includeSubDomains
# inclueSubDomains 是可选参数,告知浏览器将HSTS策略用到当前域的子域。

一旦浏览器认可这个响应头,知晓访问这个域名的所有请求必须使用HTTPS连接,将会在1年时间内缓存这个约定。

当支持 HSTS的浏览器认可该响应头:

因为HSTS策略由客户端强制执行,有一些前置条件:

HSTS

细心的你可能发现,HSTS还是存在一个薄弱漏洞配置burpsuit谷歌浏览器证书及HSTS问题处理,那就是浏览器没有当前HSTS信息,或者第一次访问; 或者新操作系统,浏览器重装,清除浏览器缓存;HSTS信息的max-age过期;

依然需要一次明文HTTP请求和重定向才能升级到HTTPS并 刷新HSTS信息,这一次依然给攻击者可乘之机,针对以上攻击,HSTS的应对办法是在浏览器内置一个域名列表,这个列表内域名,浏览器都会使用HTTPS发起连接,这个列表由维护,主流浏览器均在使用。

Nginx

在Nginx中设置 HSTS相对简单:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# always 参数确保所有的响应都有 STS Header, 旧版本(低于1.7.5)不支持always参数。

nginx 的继承规则:

如果某个配置块包含一个 指令,那么将不会继承上层的配置burpsuit谷歌浏览器证书及HSTS问题处理, 因此你需要在内部配置块重申 指令。

server {
    listen 443 ssl;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    # This 'location' block inherits the STS header
    location / {
        root /usr/share/nginx/html;
    }
    # Because this 'location' block contains another 'add_header' directive,
    # we must redeclare the STS header
    location /servlet {
        add_header X-Served-By "My Servlet Handler";
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        proxy_pass http://localhost:8080;
    }
}

ASP.的福利时间

若使用 作为边缘(face-to-) web服务器, 参见下面的服务配置

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddHsts(options =>
    {
        options.Preload = true;
        options.IncludeSubDomains = true;
        options.MaxAge = TimeSpan.FromDays(60);
        options.ExcludedHosts.Add("example.com");
        options.ExcludedHosts.Add("www.example.com");
    });
    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}

请注意: 对于本地回送 hosts 并不生效

这也是开发者在本地启动时 抓不到 -- 响应头的原因。

下面给出启用了 HSTS的 结果示例:

+ nginx 启用HSTS:

+ 清除HSTS信息:

标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。发布前请先查看评论规则:点我查看