在服务器上配置仅使用HTTPS通信的教程
HTTP严格传输安全(HSTS)是一种安全功能,web服务器通过它来告诉浏览器仅用HTTPS来与之通讯,而不是使用HTTP。本文会说明如何在Apache2、Nginx和Lighttpd上如何启用HSTS。在主流的web服务器上测试通过:Nginx1.1.19、Lighttpd1.4.28和Apache2.2.22,环境为Ubuntu12.04、Debian6&7和CentOS6,只需要调整部分参数就可以工作在其它的发行版上。
什么是HTTP严格传输安全?
引用自MozillaDeveloperNetwork:
- 如果一个web服务器支持HTTP访问,并将其重定向到HTTPS访问的话,那么访问者在重定向前的初始会话是非加密的。举个例子,比如访问者输入http://www.foo.com/或直接输入foo.com时。
- 这就给了中间人攻击的一个机会,重定向可能会被破坏,从而定向到一个恶意站点而不是应该访问的加密页面。
- HTTP严格传输安全(HSTS)功能使Web服务器告知浏览器绝不使用HTTP访问,在浏览器端自动将所有到该站点的HTTP访问替换为HTTPS访问。
以下引自维基百科:
HSTS可以用来抵御SSL剥离攻击。SSL剥离攻击是中间人攻击的一种,由MoxieMarlinspike于2009年发明。他在当年的黑帽大会上发表的题为“NewTricksForDefeatingSSLInPractice”的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入https://,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有https://开头的链接为http://,达到阻止HTTPS的目的。
HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。
另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。
场景举例:
当你通过一个无线路由器的免费WiFi访问你的网银时,很不幸的,这个免费WiFi也许就是由黑客的笔记本所提供的,他们会劫持你的原始请求,并将其重定向到克隆的网银站点,然后,你的所有的隐私数据都曝光在黑客眼下。
严格传输安全可以解决这个问题。如果你之前使用HTTPS访问过你的网银,而且网银的站点支持HSTS,那么你的浏览器就知道应该只使用HTTPS,无论你是否输入了HTTPS。这样就防范了中间人劫持攻击。
注意,如果你之前没有使用HTTPS访问过该站点,那么HSTS是不奏效的。网站需要通过HTTPS协议告诉你的浏览器它支持HSTS。
服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的HTTP响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。
在Apache2中设置HSTS
编辑你的apache配置文件(如/etc/apache2/sites-enabled/website.conf和/etc/apache2/httpd.conf),并加以下行到你的HTTPSVirtualHost:
#Optionallyloadtheheadersmodule: LoadModuleheaders_modulemodules/mod_headers.so <VirtualHost67.89.123.45:443> HeaderalwayssetStrict-Transport-Security"max-age=63072000;includeSubdomains;preload" </VirtualHost>
现在你的web站点在每次访问时都会发送该请求头,失效时间是两年(秒数)。这个失效时间每次都会设置为两年后,所以,明天你访问时,它会设置为明天的两年后。
你只能在HTTPS虚拟机中设置这个头,而不能设置在HTTP虚拟机中。
要将你的访问者重定向到对应HTTPS站点,可使用如下设置:
<VirtualHost*:80> [...] ServerNameexample.com Redirectpermanent/https://example.com/ </VirtualHost>
如果仅仅是做重定向的话,甚至不需要设置DocumentRoot。
你也可以使用mod_rewrite来做重定向,但是上述的方式更简单更安全。不过,mod_rewrite可以重定向页面到对应的HTTPS页面,而上述配置则只重定向到“/”:
<VirtualHost*:80> [...] <IfModulemod_rewrite.c> RewriteEngineOn RewriteCond%{HTTPS}off RewriteRule(.*)https://%{HTTP_HOST}%{REQUEST_URI} </IfModule> </VirtualHost>
不要忘记重启Apache。
Lighttpd
对于lighttpd来说很简单,将下述配置增加到你的Lighttpd配置文件(例如:/etc/lighttpd/lighttpd.conf):
server.modules+=("mod_setenv") $HTTP["scheme"]=="https"{ setenv.add-response-header =("Strict-Transport-Security"=>"max-age=63072000;includeSubdomains;preload") }
重启Lighttpd。失效时间也是两年。
Nginx
Nginx甚至更简单,将下述行添加到你的HTTPS配置的server块中:
add_headerStrict-Transport-Security"max-age=63072000;includeSubdomains;preload";
不要忘记重启Nginx。