HTTPS 部署简要指南
许多Web开发者都知道SSL,但常见的情况是SSL没有完整地部署或者没有部署在它应该部署的地方。这篇关于何时及如何部署SSL的简要指南,将帮助你避免大多数常见错误。
要点
- 如果你有任何机密信息,或者你要进行用户登陆,哪怕只是让管理员登陆,你就应该部署HTTPS。风险并非只存在于理论上。
- 决不要部分部署HTTPS:请将它用于所有内容,否则你将面临许多风险,比如session ID被拦截,其危害不亚于密码被拦截。
- 如果你部署了HTTPS,请将任何普通的HTTP请求都重定向至HTTPS的URL,以强制所有的请求都通过HTTPS来处理。
- 启用HTTP严格传输安全协议(HSTS)来进一步减少遭受攻击的可能。
- 在你的cookies,比如session cookie上设置安全标记,确保它们不会经由普通的HTTP请求而泄露。
什么是HTTPS?
HTTPS是将HTTP置于SSL/TLS之上,其效果是加密HTTP流量(traffic),包括请求的URL、结果页面、cookies、媒体资源和其他通过HTTP传输的内容。企图干扰HTTPS连接的人既无法监听流量,也无法更改其内容。除了加密,远程服务器的身份也要进行验证:毕竟,如果你都不知道另一端是谁,加密连接也就没什么用处了。这些措施将使拦截流量变得极其困难。虽然攻击者仍有可能知道用户正在访问哪个网站,但他所能知道的也就仅限于此了。
何时及为什么要部署HTTPS
只要你的网站有任何非公开信息,你就应当部署HTTPS,包括那些需要登陆的网站——毕竟,如果信息是公开的,根本就无需要求登陆。那些只有管理员才能登陆的网站,比如典型的Wordpress站点,也需要HTTPS。
部署HTTPS是必须的,因为如果没有它,即使有人在被动监听,也就是监听而不操控网络流量,他也能顺着HTTP传输读取到密码或认证令牌等机密信息。
这种攻击并非只存在于理论上。我自己(经过许可)就干过几次——在公共热点(public hotspots)上这太容易做到了。公共热点通常没有使用任何WiFi加密,因此监听所有流量只不过是小菜一碟。这种情况在酒吧、宾馆、火车和其他公共场所非常普遍。换句话说,如果你的用户某些时候从公共热点访问你的网站,而你又没有使用HTTPS,那么任何在公共热点附近的人都可以监听用户所有的流量。这并不是监听可能发生的唯一情况,但它确实很容易做到。
如果我只是在登陆页面使用HTTPS呢?
别这么干。只在登陆页面使用HTTPS固然可以防止用户的密码被窃取,但这只是问题的一部分。
首先,你的网站上使用HTTPS的部分越少,进行主动拦截就越容易:你的登陆链接可能指向一个HTTPS URL,但如果我在用户点击之前就改变了链接,HTTPS就没法帮到你了。部分使用HTTPS也将面临被动拦截的风险。
验证用户名和密码只是web上用户身份验证的一部分:我们还需要记住某个特定用户已经过验证和用于验证的账户。最常见的办法是使用session cookies,这通常意味着浏览器会将一个长的随机字符串,也就是session ID,存储在一个cookie中,例如在PHP中可以使用PHPSESSID来实现。服务器端的数据库知道那个随机字符串对应某个特定的session,而那个session又对应着某个特定的已验证用户。如果我用某种方式得到了你的session ID,那么当你登陆之后,我就获得了你所有的权限,这和我知道你的密码没什么两样。
考虑到这一风险,session ID都非常长且随机,并且它的生命期是有限的,这就意味着我没法靠猜测来获知它,因此session ID是足够安全的。但是,由于cookie的运作方式,浏览器每次向网站发请求时都会包含cookie信息。所以,即使已经登陆很久了,我请求的每个网页,哪怕通常情况下是公开的网页,也会导致我的session cookie被浏览器发送出去。如果这时有人在监听,他们依然可以篡改我的账户。
如果你仅仅把网站中涉及管理员的部分置于SSL的保护之下,同样的情况也可能发生:当你登陆并随后访问非SSL的公开内容时,浏览器也会发送session cookie。
简而言之:由于允许访问用户账户的session cookie在每一次请求中都会被发送,仅仅保障登陆页面的安全是绝对不够的。
我该如何正确地启用HTTPS?
强制使用HTTPS
一些网站购买了SSL证书并将其配置到Web服务器上,以为这就算完事儿了。但这只是表明你启用了HTTPS选项,而用户很可能不会注意到。为确保每个用户都从HTTPS中受益,你应该将所有传入的HTTP请求重定向至HTTPS。这意味着任何一个访问你的网站的用户都将自动切换到HTTPS,从那以后他们的信息传输就安全了。
但上述做法还是留下了一个空子:当用户第一次向你的网站发送请求时,他们使用的是普通HTTP,而那时他们可能就已经在传输机密信息了。上述做法还留下了一个“中间人攻击”漏洞(man-in-the-middle hole)。
严格传输安全协议
为进一步加强控制,请启用HTTP严格传输安全协议。这是一种可由服务器发送的特殊的头信息(header),它的含义是:在设定的时限内,你不能通过普通HTTP访问网站,也不能在证书不可靠时通过HTTPS访问网站。二级域名也可以选择包含HSTS。
HSTS是一种简单的服务器头信息,且容易配置。但是要注意在时限结束之前无法撤销设定,因此不要把时限设置得太长。你应该同时使用HSTS和HTTPS重定向,而不是用前者取代后者。
安全的cookies
Cookies,包括session cookie,有一个可选的安全标记。它大致的含义是:“不要用普通HTTP连接发送这个cookie” 启用这个安全标记,你的cookie就不会被浏览器的初始HTTP请求发送出去,直到连接切换为HTTPS且不再会被监听为止。
我可以只为已验证用户部署SSL吗?
不可以。一旦你遵循了上述指南,当用户发起普通HTTP连接时,你没法知道他们是否经过了验证。关键在于:除非用户已经连上了SSL,否则他们不应该传输任何机密信息,比如session cookie。
虽然我还能想出其他的办法来解决这些安全问题,但它们可能会在某个环节上失效。如今SSL的成本已相当低,采用其他方案并不划算。
进一步阅读
读过这篇博客,你可能还想看看“An appeal for security for the ordinary developer”、“But where is the decryption key?” 和“Proof of concept: arbitrary remote code execution through pickle-backed cookie-based sessions”这几篇文章
想进一步了解怎样正确设置加密和其他SSL选项,你可以看看Qualys Labs的SSL服务器测试和最佳实践文档、GitHub改进其SSL配置时的考量和Mozilla的TLS文档,不过Mozilla的TLS文档可能会吓到新手。尚处于草案阶段的Applied Crypto Hardening也不错,它提供了直接可用的配置模板并详细解释了模板中所用选项的合理性。
转http://blog.jobbole.com/57704/
HTTPS 部署简要指南的更多相关文章
- pipenv 简要指南
pipenv 简要指南 pipenv是requests作者的一个项目, 整合了virtualenv, pip, pipfile, 用于更方便地为项目建立虚拟环境并管理虚拟环境中的第三方模块. 安装 直 ...
- 《开源自主OdooERP部署架构指南》试读:第二章数据库服务构建
文/开源智造联合创始人老杨 本文来自<开源自主OdooERP部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 使用apt.postgresql.org 您可以选择使用 ...
- 阿里云Https部署网站
0.开始之前 文章图片很多,注意流量 首先你得准备好一个已经备案成功的域名,并且有一个在阿里云的服务器部署了的网站. 然后就是你迫切的希望升级网站为HTTPS部署. 那么我们开始吧! 1.申请CA证书 ...
- 免费开源《OdooERP系统部署架构指南》试读:第一章 Odoo架构概述
文/开源智造联合创始人老杨 本文来自<OdooERP系统部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 从web浏览器到PostgreSQL,多层与其他层交互以处理 ...
- 内网劫持渗透新姿势:MITMf简要指南
声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...
- SingnalR 从开发到生产部署闭坑指南
前天倒腾了一份[SignalR在react/go技术栈的实践], 步骤和思路大部分是外围框架的应用, 今天趁热打铁, 给一个我总结的SignalR避坑指南. 1.SignalR 默认协商 不管是.NE ...
- Django应用部署 - 上线指南
http://blog.csdn.net/pipisorry/article/details/46957613 python manage.py runserver已经很接近于服务器的形式,但是并不能 ...
- 关于HTTPS的简要内容
HTTPS是什么? 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HT ...
- Confluence 6 代理和 HTTPS 详细配置指南链接
详细配置指南 更多有关连接器示例,我们提供了一些按步骤配置的指南来帮助你启用 HTTPS 并正确配置你的代理. HTTPS: Running Confluence Over SSL or HTTPS ...
随机推荐
- 对于方法 String.Contains,只支持可在客户端上求值的参数。
var ProjectLevel_XJJS = "06,07,08,09"; p.Where(e =>ProjectLevel_XJJS.Contains(e.LevelCo ...
- Flowplayer-一款免费的WEB视频播放器 转 - helloweba.com
Flowplayer支持播放flv.swf等流媒体以及图片文件,能够非常流畅的播放视频文件,支持自定义配置和扩展. 1.加载flowplayer.js 在要播放视频的页面的head之间加入flowpl ...
- jquery easy ui 学习 (8)basic treegrid
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Netty笔记--ByteBuf释放
参考资料:http://www.maljob.com/pages/newsDetail.html?id=394 参考资料:http://www.blogjava.net/liuguly/archive ...
- iOS6 自动布局 入门–Auto Layout(转)
iOS6 自动布局 入门–Auto Layout(转) 标签: 杂谈 目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会 ...
- 嵌入式linux加载引导内核和根文件系统的方法
总体来说,嵌入式Linux内核和根文件的引导与PC机差不多.嵌入式linux内核和根文件系统可以存放在各种可能的存储设备中,一般情况下我 们将内核和根文件系统直接烧入到Flash中(包括NOR和NAN ...
- 利用Asio搭建日志系统
Asio(http://think-async.com)官方示例中给出了一个比较初步的日志服务,主要代码在basic_logger.hpp.logger_service.hpp.logger_serv ...
- 玩了一下SDN:MININET+FLOODLIGHT,感觉这确实是一个趋势啊
功能用增加中间层的方案来解决. 仿佛回到用交换机和路由器模拟器的感觉. 遇到执行命令小问题,狗哥搞定: mininet>mininet> dpctl dump-flows tcp:127. ...
- 转:implementing cons/car/cdr without explicit storage
I know this is old wine but it’s just too cool! It elegantly demonstrates closure and higher-order f ...
- COJ 0986 WZJ的数据结构(负十四) 区间动态k大
题解:哈哈哈我过了!!!主席树+树状数组写起来还真是hentai啊... 在这里必须分享我的一个沙茶错!!!看这段代码: void get(int x,int d){ ]=root[x];x;x-=x ...