许多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 部署简要指南的更多相关文章

  1. pipenv 简要指南

    pipenv 简要指南 pipenv是requests作者的一个项目, 整合了virtualenv, pip, pipfile, 用于更方便地为项目建立虚拟环境并管理虚拟环境中的第三方模块. 安装 直 ...

  2. 《开源自主OdooERP部署架构指南》试读:第二章数据库服务构建

    文/开源智造联合创始人老杨 本文来自<开源自主OdooERP部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 使用apt.postgresql.org 您可以选择使用 ...

  3. 阿里云Https部署网站

    0.开始之前 文章图片很多,注意流量 首先你得准备好一个已经备案成功的域名,并且有一个在阿里云的服务器部署了的网站. 然后就是你迫切的希望升级网站为HTTPS部署. 那么我们开始吧! 1.申请CA证书 ...

  4. 免费开源《OdooERP系统部署架构指南》试读:第一章 Odoo架构概述

    文/开源智造联合创始人老杨 本文来自<OdooERP系统部署架构指南>的试读章节.书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 从web浏览器到PostgreSQL,多层与其他层交互以处理 ...

  5. 内网劫持渗透新姿势:MITMf简要指南

    声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...

  6. SingnalR 从开发到生产部署闭坑指南

    前天倒腾了一份[SignalR在react/go技术栈的实践], 步骤和思路大部分是外围框架的应用, 今天趁热打铁, 给一个我总结的SignalR避坑指南. 1.SignalR 默认协商 不管是.NE ...

  7. Django应用部署 - 上线指南

    http://blog.csdn.net/pipisorry/article/details/46957613 python manage.py runserver已经很接近于服务器的形式,但是并不能 ...

  8. 关于HTTPS的简要内容

    HTTPS是什么? 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HT ...

  9. Confluence 6 代理和 HTTPS 详细配置指南链接

    详细配置指南 更多有关连接器示例,我们提供了一些按步骤配置的指南来帮助你启用 HTTPS 并正确配置你的代理. HTTPS: Running Confluence Over SSL or HTTPS  ...

随机推荐

  1. flvplayer.swf flv视频播放器使用方法

    今天由于网页上要加入一个视频文件,就研究了一下flv视频播放器flvplayer.swf      :   关于SewisePlayer  插件 演示例子链接   一.直接在html文件中加载: &l ...

  2. php字符串常见面试题

    >> 本文固定链接: http://php.ncong.com/mianshi/mianshiti_string.html >> 转载请注明: 恩聪php 2014年09月02 ...

  3. Excel--java POi

    import java.io.File; import java.io.FileOutputStream; import org.apache.commons.io.FileUtils; import ...

  4. Tr A

    Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第 ...

  5. 转:Centos6.3添加解码器播放MP3和常见视频音频

    原文来自于:http://blog.csdn.net/odaynot/article/details/8462273 参考地址: http://wiki.centos.org/AdditionalRe ...

  6. 使用XCode---下载组件

    XCode是一个轻量级的ORM组件(对象与关系数据库映射),提供以面向对象的方式操作数据库的功能,能够解决90%以上的数据库操作场景. 做为X系列组件最重要的一员,XCode秉承了简单实用的特点,力求 ...

  7. The first time

    早上起来发现昨晚申请的博客开通了,\(^o^)/~纪念下,就像刚打代码学的hello world一样,用c,c++写一个程序纪念下.O(∩_∩)O~哈哈哈哈哈. /*C hello world程序*/ ...

  8. nginx的使用配置

    nginx为反向代理服务器,可以反向代理不同域名转向不同的具体服务器.可以用于负载压力或是同一台机器使用不同域名进行访问. 以下片段是服务器配置: #user cmcc; worker_process ...

  9. SCALA表达示简例

    作了解,感觉比一般的差距有点大哟. package com.hengheng.scala class HelloScala { } object HelloScala { def main(args: ...

  10. BAT之间的区别(学点网页编程,然后开始研究)

    A: 阿里不就是靠网页起家的吗? T: 腾讯靠客户端. B: 百度是靠网页背后的算法技术支持- 最近网页技术又发布了很多新功能,而现在网页功能也已经很强大了. 不知道自己是不是老了,总觉得不喜欢网页( ...