关于启用 HTTPS 的一些经验分享(二)

几天前,一位朋友问我:都说推荐用 Qualys SSL Labs 这个工具测试 SSL 安全性,为什么有些安全实力很强的大厂家评分也很低?我认为这个问题应该从两方面来看:1)国内用户终端情况复杂,很多时候降低 SSL 安全配置是为了兼容更多用户;2)确实有一些大厂家的 SSL 配置很不专业,尤其是配置了一些明显不该使用的 CipherSuite。 我之前写的《关于启用 HTTPS 的一些经验分享(一)》,主要介绍 HTTPS 如何与一些新出的安全规范配合使用,面向的是现代浏览器。而今天这篇文章,更多的是介绍启用 HTTPS 过程中在老旧浏览器下可能遇到的问题,以及如何取舍。[...]

继续阅读 »

从 Nginx 默认不压缩 HTTP/1.0 说起

临近年关,明显变忙,博客也更新得慢了,以后尽量保证周更吧。今天这篇文章属于计划之外的更新,源自于白天看到的《一个基于 http 协议的优化》。在这篇文章中,作者描述了这样一个现象: 在移动的 http 请求量和联通不相上下的前提下,移动的 http response 带来的网络流量是联通的 2.5 倍。移动大概有 3 成的请求都没有做压缩,而联通几乎都是经过压缩的。那些没有经过压缩的 http 会话都是走了 1.0 的协议,相反经过压缩的 http 会话都是走了 http1.1 协议。 也就是说在相同的服务端配置下,移动运营商过来的流量中有 30% 走了 HTTP/1.0,而作者所使用的 HTTP Server,不对 HTTP/1.0 响应启用 GZip。[...]

继续阅读 »

关于启用 HTTPS 的一些经验分享(一)

随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 HTTPS。就在今天,免费提供证书服务的 Let's Encrypt 项目也正式开放,HTTPS 很快就会成为 WEB 必选项。HTTPS 通过 TLS 层和证书机制提供了内容加密、身份认证和数据完整性三大功能,可以有效防止数据被查看或篡改,以及防止中间人冒充。本文分享一些启用 HTTPS 过程中的经验,重点是如何与一些新出的安全规范配合使用。至于 HTTPS 的部署及优化,之前写过很多,本文不重复了。[...]

继续阅读 »

域名小知识:Public Suffix List

前几天 Hax 贺老在我博客挖坟,在《Webkit 下最无敌的跨大域方案》中留言说到「这个实际确实应该是安全 Bug(Chrome 的某个开发者也可能犯错误),而且后来被修了」。那篇文章写于三年半前,也该更新一下了。最近一连写了好多关于 HTTP 的文章,今天正好拿 Webkit 这个 Bug 换换口味。[...]

继续阅读 »

基于 HTTP/2 的 WEB 内网穿透实现

HTTP/2 引入了二进制分帧层,将 HTTP/1.1 中的请求和响应拆成颗粒度更细的帧(frame),从而实现了优先级、流量控制和 Server Push 等功能;HTTP/2 在单条 TCP 连接上可以打开多个流,从而实现了多路复用;HTTP/2 使用静态字典、动态字典以及哈夫曼编码,对请求 / 响应头部进行压缩。总之,HTTP/2 从协议层面解决了 HTTP/1.1 的诸多问题。[...]

继续阅读 »

HTTP/2:新的机遇与挑战

今天我在公司做了一个名为《HTTP/2:新的机遇与挑战》的分享,从以下几个方面介绍了 HTTP/2: HTTP 历史回顾 HTTP/1 的困境 HTTP/2 技术简介 HTTP/2 部署与调试 HTTP/2 优化与实践 HTTP/2 未来之路 由于时间关系,很多点都没办法展开去讲,其中大部分知识点在我之前的博文中都有详细的介绍,剩下一部分后续再补充。[...]

继续阅读 »

HTTP 代理原理及实现(二)

在上篇《HTTP 代理原理及实现(一)》里,我介绍了 HTTP 代理的两种形式,并用 Node.js 实现了一个可用的普通 / 隧道代理。普通代理可以用来承载 HTTP 流量;隧道代理可以用来承载任何 TCP 流量,包括 HTTP 和 HTTPS。今天这篇文章介绍剩余部分:如何将浏览器与代理之间的流量传输升级为 HTTPS。[...]

继续阅读 »

HTTP 代理原理及实现(一)

Web 代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web 代理无处不在。我之前有关 HTTP 的博文中,多次提到了代理对 HTTP 请求及响应的影响。今天这篇文章,我打算谈谈 HTTP 代理本身的一些原理,以及如何用 Node.js 快速实现代理。[...]

继续阅读 »

Golomb-coded sets 原理介绍

在我之前的《H2O 中的 Cache-Aware Server Push 简介》这篇文章中,我写到: H2O 将要推送的资源路径 + ETag 存入一个集合,采用 Golomb-compressed sets 算法生成指纹,并编码为 Base64 字符串存入 Cookie,之后 H2O 可以通过检查某个资源路径 + ETag 是否存在于 Cookie 指纹对应的集合之中来决定是否推送。 Golomb-compressed sets(GCS)是一种空间利用率很高的数据结构,可以用于判断一个元素是否属于这个集合。它与 Bloom Filter 非常类似,区别是它的压缩率更高,同时查询效率更低。同样,GCS 也有将原本不属于集合的元素误判为属于的可能(false positive)。[...]

继续阅读 »

TLS 握手优化详解

随着 HTTP/2 的逐渐普及,以及国内网络环境越来越糟糕(运营商劫持和篡改),HTTPS 已经开始成为主流。HTTPS 在 TCP 和 HTTP 之间增加了 TLS(Transport Layer Security,传输层安全),提供了内容加密、身份认证和数据完整性三大功能,同时也给 Web 性能优化带来新的挑战。上次写的「使用 BoringSSL 优化 HTTPS 加密算法选择」一文中,我介绍了如何针对不同平台启用最合适的传输加密算法。本篇文章我打算继续写 HTTPS 优化 —— TLS 握手优化。[...]

继续阅读 »