民间布道: 让 Web 服务使用 HTTPS

2016-06-19 00:42:29 +08:00
 iugo

感觉 V2 现在更加 "平民化" 了, 所以发点普通的东西, 说不定有用.

如有错漏, 还请雅正.


什么是 HTTPS?

安全的 HTTP 协议. 正式名称为 HTTP over TLS. 注, S-HTTP 是另一种东西.

核心就是基于证书的安全协议, SSL/TLS. TLS 是将 SSL 标准化后的名字, 现在 TLS 基本替代了之前 SSL 这个称呼.

标准: RFC; 制定者: IETF

为什么要使用 HTTPS?

HTTP 是明文传输的, 所以容易被中间人攻击. 使用 HTTPS 可以保护信息安全.

中间人攻击的危害非常大, 攻击者不仅能获取你的信息, 还能修改你收到的信息.

其次, 现在主流浏览器对 HTTP/2 要求必须使用 over TLS. Chrome 51 版本之后还只支持 ALPN 而废止对 NPN 的支持, 如果不支持 ALPN 则自动降级到 HTTP/1.1 .

什么是 ALPN, 什么是 NPN?

它们也都是协议, 主要定义了证书是如何传输及验证的. NPN 已经被逐渐废弃, 使用 ALPN 替代.

使用 HTTPS 会变慢吗?

增加了证书, 增加了加解密, 理论上肯定有额外消耗.

但这些都是值得的. 而且这些消耗在目前一个页面动辄几百 KB 的年代, 应该不算什么. 并且, 浏览器对于 HTTP/2 只认加密的.

如何让 Web 服务支持 HTTPS?

实现 HTTPS 服务一般需要两个东西:

  1. 提供 HTTP 服务的.
  2. 提供 TLS 服务的.

后者在 Linux 发行版中一般会被预装, 一款名为 OpenSSL 的软件工具集. 这里还要注意, 只有 OpenSSL 1.0.2 及以上版本才支持 ALPN.

如何配置 Web 服务器

https://mozilla.github.io/server-side-tls/ssl-config-generator/

这是一个自动生成 Web 服务配置文件的工具. 提供了 Apache, Nginx, Lighttpd 添加 HTTPS 服务的建议配置文件.

这些配置主要是监听 443 端口, 加入证书, 定义一下加密方法.

如何免费让 Web 服务支持 HTTPS?

  1. 获取免费证书 Let's Encrypt, StartSSL
  2. 通过免费 CDN CloudFlare

使用免费证书或者自签名证书需要注意:

证书需要被认可才有效, 级别高的服务需要更可信的证书, 所以建议商业用户购买可靠的证书. 另外, 要注意证书链和有效期的问题.

如何检测一个网站是否支持 HTTPS?

一般浏览器地址栏中会显示. 包含 https 字样, 或者为绿色皆为该站支持 HTTPS.

不建议在 HTTPS 页面中使用非 HTTPS 的资源. 如果出现这种情况, 浏览器会做提醒.

也可以通过这个地址进行测试: https://www.ssllabs.com/ssltest/

附录

相关 RFC 标准

HTTPS: RFC 2818 - HTTP Over TLS (2000)

HTTP/2: RFC 7540 - Hypertext Transfer Protocol Version 2 (2015)

TLS: RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2 (2008)

ALPN: RFC 7639 - The ALPN HTTP Header Field (2015)


原文: https://blog.clian.net/web-https/

9017 次点击
所在节点    程序员
56 条回复
hzlzh
2016-06-19 19:40:33 +08:00
昨天刚给 https://weflow.io/ 更换了 startssl 加的证书
iugo
2016-06-19 22:54:02 +08:00
@binux
@lslqtz
@dndx
@SlipStupig

https://istlsfastyet.com/

加解密的确会对 CPU 有消耗。目前简单的办法就是硬件上使用专用加解密卡,软件上利用好 Session 重用。
iugo
2016-06-19 23:28:40 +08:00
@wql 感谢。应该是我说得不准确。再补充一下:

ALPN 代指的是 The ALPN HTTP Header Field.
ALPN 是 Application-Layer Protocol Negotiation 的缩写。

This specification allows HTTP CONNECT requests to indicate what protocol is intended to be used within the tunnel once established, using the ALPN header field.

For a tunnel that is then secured using Transport Layer Security
(TLS) [RFC5246], the header field carries the same application
protocol label as will be carried within the TLS handshake [RFC7301].
If there are multiple possible application protocols, all of those
application protocols are indicated.

大概意思就是 ALPN 是 HTTP 连接请求的一个字段。在使用 TLS 通道时,会包含 handshake 信息( ALPN 主要描述请求端而非响应端信息)。

NPN 的草案: https://tools.ietf.org/id/draft-agl-tls-nextprotoneg-03.html 还没正式确认就被替代了。估计主要因为 SPDY 被 HTTP/2 替代了吧。
Laynooor
2016-06-19 23:36:09 +08:00
网站要用到 Google 的字体库,用国内的源替换了, F12 看是 http1.2 https
其他网站资源都是 HTTP/2 HTTP
对速度有影响么
wql
2016-06-19 23:59:27 +08:00
@iugo 确实是因为 alpn 与 h2 一起发布导致这个草案直接过期流产。
Zohar
2016-06-20 05:17:47 +08:00
@Laynooor 你需要这个→https://fonts.iwch.me/
lslqtz
2016-06-20 07:17:42 +08:00
@BearTher 只要域名好,就要买买买。
lslqtz
2016-06-20 07:18:17 +08:00
@Zohar 滋此。
@Laynooor Google 的字体库全部炸了,本人在使用科大的字体库。
BearTher
2016-06-20 10:36:16 +08:00
@lslqtz 可这压根就是个二级域啊。。 在我心目中它还不如 loli12580.com 有价值
lslqtz
2016-06-20 10:40:11 +08:00
@BearTher 啥,你和 cn.com 比好记?
国外还有 com.sb 呢。。
codesun
2016-06-23 13:36:54 +08:00
HTTPS 就能完全避免中间人攻击了吗?好像不是吧。。。

任何信息都需要保证安全吗?好像不是吧。。。

TLS 协议本身没有任何漏洞吗?好像不是吧,可能只是目前未发现罢了
iugo
2016-06-23 14:14:36 +08:00
@codesun

HTTPS 就能完全避免中间人攻击了吗?好像不是吧。。。
举个 HTTPS 毫无帮助的例子吧.

任何信息都需要保证安全吗?好像不是吧。。。
好像只有您提到 "任何" 这两个字了吧?

TLS 协议本身没有任何漏洞吗?好像不是吧,可能只是目前未发现罢了
这个是神逻辑. 如: 我是活在(黑客帝国的)母体中而不是物理现实中吗? 好像是吧, 可能只是我目前未发现证据罢了.
codesun
2016-06-23 20:41:16 +08:00
@iugo

我觉得我的逻辑不神,你先别激动,且听我说说,你要觉得没道理,再尽情喷,我接受。

我看你这么一段描述,如果我没有理解错,你使用或者说是说服大家一起用 HTTPS 的主要目的是为了安全。

那么,我就着重点看你的“为什么使用 HTTPS ”这一段了。


“ HTTP 是明文传输的, 所以容易被中间人攻击. 使用 HTTPS 可以保护信息安全”
我的反驳是:“ HTTPS 就能完全避免中间人攻击了吗?”,我这么说是有根据的,因为之前看过几篇论文说过这方面的问题,并不是加密了就能解决安全问题。我不是安全领域的,不算懂,只能给出一个简单的例子:中间人发布伪造的证书,然后客户端安装了,这样就不能解决中间人攻击

关于“任何信息都需要保证安全吗?”我想表达的意思是,并不是所有的请求都需要使用 HTTPS ,盲目追求,只会浪费服务器资源,你如果要证据,可以在开启 HTTPS 前后,给 nginx 做个压测,握手也是需要耗时的。

关于“ TLS 协议本身没有任何漏洞吗?”我说错了,应该是已经有发现存在漏洞了,而且不在少数,当然版本不同,漏洞也各有不同,例子之一如下 https://hacked.com/tls-flawed-new-tls-vulnerability-found/
62900015
2016-06-26 03:39:42 +08:00
@codesun 安全和性能是需要互相妥协的,你说的很对,不一定所有的业务都需要上,关键位置就可以了,另外不同的 SSL 厂商能抗的连接数不一样,压测下你会看到 HTTP 能抗几万, HTTPS 就几 K SSL 挂了。
iugo
2016-06-28 10:24:43 +08:00
@codesun 我是这样理解的: 一个东西, 只要有用, 就可以用. 而不是只有完美了, 我们才应该用.

我看到的您的用词是这样的: "完全", "任何".

没什么东西是完全和任何的.

我觉得我之前的回答也不够准确, 重新回答一下:

HTTPS 就能完全避免中间人攻击了吗?好像不是吧。。。
不能完全避免, 但能很大程度上减少.

任何信息都需要保证安全吗?好像不是吧。。。
有些信息是必须保证安全的, 有些环境是必须保证安全的. 比如网银登入, 比如运营商劫持, 广告严重的环境.

TLS 协议本身没有任何漏洞吗?好像不是吧,可能只是目前未发现罢了
这个逻辑我就不说了. 我觉得不可思议, 但和 HTTPS 本身讨论没什么关系.

1. 再重申一遍, 强调 "完全", "任何" 这样的词是不恰当的.
2. 不是只有完美了才能用, HTTPS 解决 HTTP 的问题, 就能用. 目前国际主流浏览器(Firefox, Chrome, Safari, IE Edge)对更先进的协议 HTTP/2 的支持也有前提, 就是 over TLS, 参考 http://caniuse.com/#feat=http2

---

另外, 证书存在的意义就是伪造成本非常高. 伪造证书会被浏览器阻止访问, 除非用户强制. 比如 12306.cn 的证书是国际主流浏览器不认的, 因为它自签名, 浏览器会阻止访问.

隐患在于用户会自行安装不安全的根证书. 而又无法避免这些不安全的根证书乱发证书.
iugo
2016-06-28 10:27:56 +08:00
@codesun HTTPS 再不安全, 再漏洞, 也是比明文的 HTTP 安全的. 也就是说所有安全方面, HTTPS 的下限是 HTTP.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/286764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX