V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iugo
V2EX  ›  程序员

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

  •  
  •   iugo ·
    iugo · 2016-06-19 00:42:29 +08:00 · 8990 次点击
    这是一个创建于 3085 天前的主题,其中的信息可能已经有所发展或是发生改变。

    感觉 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/

    第 1 条附言  ·  2018-09-30 11:22:22 +08:00
    56 条回复    2016-06-28 10:27:56 +08:00
    UnisandK
        1
    UnisandK  
       2016-06-19 00:57:29 +08:00   ❤️ 2
    yexm0
        2
    yexm0  
       2016-06-19 01:27:43 +08:00 via Android
    如果想要客户浏览你的网站时在浏览器地址栏旁显示中文公司名称的话可以看看沃通的 ev ssl 证书。不过价格非常昂贵就是了。
    不需要中文公司名的话可以看看 startssl: https://www.startssl.com/NewsDetails?date=20160606
    ck65
        3
    ck65  
       2016-06-19 01:32:24 +08:00
    很适时的布道。感谢已发,再加五个铜板。
    lslqtz
        4
    lslqtz  
       2016-06-19 01:32:56 +08:00 via iPhone
    @UnisandK 这个好,免费签了 alphassl 的泛域名。
    supman
        5
    supman  
       2016-06-19 01:37:30 +08:00 via iPad
    在 godaddy 买了一个 后来发现 竟然不支持子域名。。好伤心
    lslqtz
        6
    lslqtz  
       2016-06-19 01:41:32 +08:00 via iPhone
    @supman 上面给的那个支持泛域名,爽炸了。
    lslqtz
        7
    lslqtz  
       2016-06-19 01:43:19 +08:00 via iPhone
    证书属性
    主题: OU=Domain Control Validated,CN=*.loli.cn.com
    私钥长度: 2048
    算法: SHA256withRSA
    SHA1: A1453028EA6E896C992ACFC5803937F51F6904C6
    extKeyUsage: Server Authentication;Client Authentication;
    sans: *.loli.cn.com , loli.cn.com
    ocspUrl: http://ocsp2.globalsign.com/gsalphasha2g2
    crlUrl: http://crl2.alphassl.com/gs/gsalphasha2g2.crl
    caUrl: http://secure2.alphassl.com/cacert/gsalphasha2g2r1.crt
    序列号: 3ff51e52
    keyUsage: keyEncipherment digitalSignature dataEncipherment
    issue: C=BE,O=GlobalSign nv-sa,CN=AlphaSSL CA - SHA256 - G2
    root:
    有效期: 365(天)
    颁发时间: 2016-6-19 1:32:36
    截止时间: 2017-6-20 1:32:36
    公钥:
    ASN1:

    @UnisandK 感谢已发送。
    New2016
        8
    New2016  
       2016-06-19 02:06:31 +08:00   ❤️ 4
    binux
        9
    binux  
       2016-06-19 02:32:22 +08:00
    「增加了证书, 增加了加解密, 理论上肯定有额外消耗.
    但这些都是值得的. 而且这些消耗在目前一个页面动辄几百 KB 的年代, 应该不算什么.」

    额外消耗的是 CPU ,和「动辄几百 KB 」反而是加大消耗的关系。
    lslqtz
        10
    lslqtz  
       2016-06-19 03:14:21 +08:00 via iPhone
    @binux cpu 消耗起来简直要死人,还是挂 cdn 上 http 回源吧。
    SlipStupig
        11
    SlipStupig  
       2016-06-19 06:58:25 +08:00
    之前看 google 的说法是全线产品全部启用 tls ,对消耗的增加并不大
    @lslqtz
    lslqtz
        12
    lslqtz  
       2016-06-19 07:19:39 +08:00
    @SlipStupig 你也要想想人有多少服务器啊。。
    egen
        13
    egen  
       2016-06-19 08:24:58 +08:00
    上了 HTTPS 后顺便上 HTTP2 才划算
    RangerWolf
        14
    RangerWolf  
       2016-06-19 08:34:59 +08:00
    感谢布道! 想问下,你介绍的这些,是否适用于 http2 呢?

    基本上不太了解相关的东西~ 希望能继续布道 :D
    dndx
        15
    dndx  
       2016-06-19 08:37:37 +08:00
    @binux
    @lslqtz Google 连 Youtube 视频都使用 TLS 了, CPU 都有 AES-NI , I/O 会比 CPU 资源先用尽。
    lslqtz
        16
    lslqtz  
       2016-06-19 08:50:31 +08:00 via iPhone
    @dndx 可它们是用 chacha20 啊。。
    lslqtz
        17
    lslqtz  
       2016-06-19 08:52:20 +08:00 via iPhone
    @RangerWolf 适用。
    lslqtz
        18
    lslqtz  
       2016-06-19 08:54:35 +08:00 via iPhone
    @yexm0 为啥要沃通的,其他品牌不好吗。
    startssl 优势比沃通好多了。
    yexm0
        19
    yexm0  
       2016-06-19 09:06:32 +08:00 via Android
    @lslqtz 暂时没听说其他家支持中文公司名
    Themyth
        20
    Themyth  
       2016-06-19 11:13:42 +08:00
    实话说,不知道是不是错觉,总觉得使用 ssl 的比不使用 ssl 的慢很多?
    现在我也在头疼要不要全部使用 ssl 了。
    zrj766
        21
    zrj766  
       2016-06-19 11:16:28 +08:00 via Android
    上了 SSL 吧,虽然就是个小博客,那堆图片替换还是让我费神的。。
    612
        22
    612  
       2016-06-19 12:11:07 +08:00 via iPhone
    @lslqtz 沃通的根就是 startssl
    SourceMan
        23
    SourceMan  
       2016-06-19 12:16:27 +08:00 via iPhone
    这种文章,直接拉到上面,有推广链接的差评
    而且按照 V2EX 的规则,你可以正文直接一个原文 URL 的
    lslqtz
        24
    lslqtz  
       2016-06-19 12:22:57 +08:00 via iPhone
    @612 那有咋样。。说的沃通价格和 startssl 一样好似的
    lslqtz
        25
    lslqtz  
       2016-06-19 12:23:57 +08:00 via iPhone
    @yexm0
    哪家我还真没听说过 我记得 comodo 可以 geotrust 可以 globalsign 可以
    lyragosa
        26
    lyragosa  
       2016-06-19 12:28:01 +08:00
    @New2016 这是个什么鬼,免费生成泛域名?
    lavande
        27
    lavande  
       2016-06-19 13:20:45 +08:00
    我想借机吐槽新浪微薄的登录页竟然不是 https
    aaronlam
        28
    aaronlam  
       2016-06-19 13:50:42 +08:00
    @New2016 请问下,这个 SSL 证书是 Alphassl 官方提供的么?
    lslqtz
        29
    lslqtz  
       2016-06-19 14:04:52 +08:00
    @lyragosa 我用的第一个生成,他发的应该是源码。
    New2016
        30
    New2016  
       2016-06-19 14:07:24 +08:00 via iPhone
    @lyragosa 可以泛域名,可以 ecc ,需要 admin@域名 之类的邮箱。全自动,除了 csr 要自己弄


    @aaronlam 不清楚
    lyragosa
        31
    lyragosa  
       2016-06-19 14:22:37 +08:00
    @New2016 有点厉害,不过申请了半天没发来邮件……
    maxsec
        32
    maxsec  
       2016-06-19 15:39:20 +08:00
    @yexm0 StartSSL 也支持中文名字
    kkhu2004
        33
    kkhu2004  
       2016-06-19 15:41:51 +08:00
    手动感谢。
    lslqtz
        34
    lslqtz  
       2016-06-19 16:17:32 +08:00
    @lyragosa 用第一个可以,发我 csr 和邮箱,我帮你申请发邮件给你。
    hfeeki
        35
    hfeeki  
       2016-06-19 16:24:57 +08:00
    伟大的墙会组织你用 https 的
    62900015
        36
    62900015  
       2016-06-19 16:50:09 +08:00
    @New2016 https://github.com/Mujj/alpha-ssl-auto 这里是中文版,渠道都一样,都是 singlehop ,配置你的 singlehop 账号密码进去就 OK 。
    imnpc
        37
    imnpc  
       2016-06-19 17:52:36 +08:00
    重要的网站都建议部署 SSL
    v9ox
        38
    v9ox  
       2016-06-19 18:03:55 +08:00
    但这些都是值得的. 而且这些消耗在目前一个页面动辄几百 KB 的年代, 应该不算什么. 并且, 浏览器对于 HTTP/2 只认加密的.


    没看懂最后一句...
    wql
        39
    wql  
       2016-06-19 18:17:11 +08:00
    纠正一下, ALPN 是一种 HTTP 版本协商协议,已经逐渐替代已经被废弃的 NPN ,成为标准。
    BearTher
        40
    BearTher  
       2016-06-19 18:29:04 +08:00
    hzlzh
        41
    hzlzh  
       2016-06-19 19:40:33 +08:00
    昨天刚给 https://weflow.io/ 更换了 startssl 加的证书
    iugo
        42
    iugo  
    OP
       2016-06-19 22:54:02 +08:00
    @binux
    @lslqtz
    @dndx
    @SlipStupig

    https://istlsfastyet.com/

    加解密的确会对 CPU 有消耗。目前简单的办法就是硬件上使用专用加解密卡,软件上利用好 Session 重用。
    iugo
        43
    iugo  
    OP
       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
        44
    Laynooor  
       2016-06-19 23:36:09 +08:00 via Android
    网站要用到 Google 的字体库,用国内的源替换了, F12 看是 http1.2 https
    其他网站资源都是 HTTP/2 HTTP
    对速度有影响么
    wql
        45
    wql  
       2016-06-19 23:59:27 +08:00 via Android
    @iugo 确实是因为 alpn 与 h2 一起发布导致这个草案直接过期流产。
    Zohar
        46
    Zohar  
       2016-06-20 05:17:47 +08:00 via Android
    @Laynooor 你需要这个→https://fonts.iwch.me/
    lslqtz
        47
    lslqtz  
       2016-06-20 07:17:42 +08:00
    @BearTher 只要域名好,就要买买买。
    lslqtz
        48
    lslqtz  
       2016-06-20 07:18:17 +08:00
    @Zohar 滋此。
    @Laynooor Google 的字体库全部炸了,本人在使用科大的字体库。
    BearTher
        49
    BearTher  
       2016-06-20 10:36:16 +08:00
    @lslqtz 可这压根就是个二级域啊。。 在我心目中它还不如 loli12580.com 有价值
    lslqtz
        50
    lslqtz  
       2016-06-20 10:40:11 +08:00
    @BearTher 啥,你和 cn.com 比好记?
    国外还有 com.sb 呢。。
    codesun
        51
    codesun  
       2016-06-23 13:36:54 +08:00
    HTTPS 就能完全避免中间人攻击了吗?好像不是吧。。。

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

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

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

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

    TLS 协议本身没有任何漏洞吗?好像不是吧,可能只是目前未发现罢了
    这个是神逻辑. 如: 我是活在(黑客帝国的)母体中而不是物理现实中吗? 好像是吧, 可能只是我目前未发现证据罢了.
    codesun
        53
    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
        54
    62900015  
       2016-06-26 03:39:42 +08:00
    @codesun 安全和性能是需要互相妥协的,你说的很对,不一定所有的业务都需要上,关键位置就可以了,另外不同的 SSL 厂商能抗的连接数不一样,压测下你会看到 HTTP 能抗几万, HTTPS 就几 K SSL 挂了。
    iugo
        55
    iugo  
    OP
       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
        56
    iugo  
    OP
       2016-06-28 10:27:56 +08:00
    @codesun HTTPS 再不安全, 再漏洞, 也是比明文的 HTTP 安全的. 也就是说所有安全方面, HTTPS 的下限是 HTTP.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1117 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:41 · PVG 06:41 · LAX 14:41 · JFK 17:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.