V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
m31271n
V2EX  ›  分享创造

让互联网更安全 —— 配置好自己的 HTTPS

  •  
  •   m31271n · 2016-07-16 11:47:39 +08:00 · 5911 次点击
    这是一个创建于 3045 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • HTTPS 出现很久了, Let's Encrypt 也出现很久了。
    • 还没用 HTTPS 的站挺多的,证书配置有错误的也挺多的。
    1. 做了小工具 —— docker-acme.sh ,简化了申请证书和更新证书的流程。希望它可以帮助正在使用 Let's Encrypt 证书的 V 友们免去一些痛苦。(每次证书到期,都挺折腾的,对吧?)

    2. 发现很多站的 HTTPS 不正确,再广播一个自己收集总结的 Nginx 的 HTTPS 配置

    3. 推荐工具: SSL Server Test

    愿大家的 HTTPS 都能配置成功。匿了。

    44 条回复    2016-07-20 09:39:14 +08:00
    inroading
        1
    inroading  
       2016-07-16 12:17:39 +08:00   ❤️ 1
    头像真吓人
    ivmm
        2
    ivmm  
       2016-07-16 12:29:12 +08:00
    仅仅只有 https 不够吧。

    还要 DNSSEC
    anjunecha
        3
    anjunecha  
       2016-07-16 13:22:06 +08:00   ❤️ 1
    看了一眼那个 https 配置感觉似乎有一些问题, spdy 不要用了,改成 http2 吧,另外 OCSP 装订那里,要做一个 ssl_stapling_verify ,以及你用的 8.8.8.8 的 resolver 对国内用户不太友好的,建议增加一个国内的 resolver
    m31271n
        4
    m31271n  
    OP
       2016-07-16 13:28:28 +08:00
    @anjunecha 感谢你的回复。
    m31271n
        5
    m31271n  
    OP
       2016-07-16 13:30:38 +08:00
    @ivmm 当然不够,对于普通站长,真的有能力有能力来部署 DNSSEC 吗?
    lhbc
        6
    lhbc  
       2016-07-16 13:31:15 +08:00
    1. nginx 1.9 以后已经不支持 SPDY 了,只能 HTTP/2
    2. ssl_ciphers 里, ECDHE-ECDSA 应该优先于 ECDHE-RSA 。当然,没有 ECC 证书 ECDSA 就是白搭。如果用了 1.11 的新特性 双证书,那 ECDSA 必须优先 RSA 。
    3. Strict-Transport-Security includeSubdomains 这种大坑,不详细说清楚,让别人随便配,那真是无底坑了
    DT27
        7
    DT27  
       2016-07-16 13:33:09 +08:00
    只用 apache 。。。
    ZE3kr
        8
    ZE3kr  
       2016-07-16 13:50:20 +08:00
    @m31271n 就只能等越来越多的 DNS 解析商去支持了,一般没有站长用自己服务器去做 DNS 解析的吧……
    anjunecha
        9
    anjunecha  
       2016-07-16 13:55:50 +08:00 via iPhone
    HSTS 是有点坑, lz 要谨慎配置,建议 lz 把 include Subdomains 这个配置字段去掉,如果子域需要的话每个子域单独配
    m31271n
        10
    m31271n  
    OP
       2016-07-16 13:58:35 +08:00
    @anjunecha @lhbc
    感谢你们提出的意见,已经更新。

    1. spdy 更新为 http2
    2. 添加 ssl_stapling_verify on;
    3. resolver 新添国内 114 和 阿里 DNS
    4. 为 HSTS 的大坑进行注释。

    但是还有一个问题不解,考虑到安全和兼容性,现在 ssl_cipher 的推荐设置是什么?
    m31271n
        11
    m31271n  
    OP
       2016-07-16 14:03:12 +08:00
    @anjunecha 确实是,已经去掉了。
    m31271n
        12
    m31271n  
    OP
       2016-07-16 14:03:58 +08:00
    @ZE3kr 嗯。愿早日实现大一统。
    McContax
        13
    McContax  
       2016-07-16 14:29:11 +08:00 via Android
    我就问下,我区区一个博客站,真的有必要用 https 吗??遇到系统时间不对的还没法显示
    ZE3kr
        14
    ZE3kr  
       2016-07-16 14:32:06 +08:00
    @m31271n 配置的话不同的 Nginx 和 OpenSSL 可能不同, Mozilla 有一套推荐,分为 Old 、 Intermediate 、 Modern ,看你需要的兼容性, Intermediate 就能够被评为 A+ 了。

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

    nginx 1.10.0 | intermediate profile | OpenSSL 1.0.2g ( Ubuntu 16.04 就是这个)

    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

    或者 CloudFlare 的配置 https://github.com/cloudflare/sslconfig/blob/master/conf

    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    anjunecha
        15
    anjunecha  
       2016-07-16 14:33:37 +08:00 via iPhone
    @m31271n ssl_cipher 这个不一定,看你的证书类型, nginx 版本,以及需要兼容的浏览器等等,你可以去 stackoverflow 上查一查
    m31271n
        16
    m31271n  
    OP
       2016-07-16 14:35:28 +08:00
    @McContax 没必要。
    m31271n
        17
    m31271n  
    OP
       2016-07-16 14:53:08 +08:00
    @ZE3kr @anjunecha 感谢,已经更新相关配置并添加了注释。
    gzelvis
        18
    gzelvis  
       2016-07-16 15:26:25 +08:00
    @anjunecha 能加你交个朋友吗? 我 QQ:2248227
    greatghoul
        19
    greatghoul  
       2016-07-16 16:00:05 +08:00
    小哥你这东西好。
    m31271n
        20
    m31271n  
    OP
       2016-07-16 16:23:18 +08:00
    yytsjq
        21
    yytsjq  
       2016-07-16 16:57:25 +08:00
    @anjunecha 看介绍 HSTS 不是安全性更高吗,坑在哪呢?
    m31271n
        22
    m31271n  
    OP
       2016-07-16 16:59:22 +08:00
    坑在 `includeSubdomains`,如果开了这个,所有的子域都会使用 HTTPS 。
    m31271n
        23
    m31271n  
    OP
       2016-07-16 16:59:35 +08:00
    shiny
        24
    shiny  
       2016-07-16 17:19:08 +08:00
    我之前也想把 acme.sh Docker 化,还有一个疑问是更新证书后如何通知 nginx reload configure?
    dasenlin
        25
    dasenlin  
       2016-07-16 18:33:45 +08:00
    @m31271n 请教楼主,看了楼主的配置文件, https 之间如何 301 呢,比如像 https://xxx.com 如何重定向到 https://www.xxx.com ,我有个开启 https 的站点无法这样跳转, http 之间倒是可以跳转
    InFaNg
        26
    InFaNg  
       2016-07-16 19:37:33 +08:00 via Android
    @m31271n rage4
    m31271n
        27
    m31271n  
    OP
       2016-07-16 19:40:38 +08:00
    @InFaNg 这是啥意思。
    m31271n
        28
    m31271n  
    OP
       2016-07-16 19:46:30 +08:00
    m31271n
        29
    m31271n  
    OP
       2016-07-16 19:47:48 +08:00
    @dasenlin HTTPS A 站 -> HTTPS B 站,两个都配置好证书就行了。
    m31271n
        30
    m31271n  
    OP
       2016-07-16 20:05:01 +08:00
    @shiny 还一直以为 nginx 会自动重新读取证书而不用 reload ,看来我并没有考虑周全。
    shiny
        31
    shiny  
       2016-07-16 20:30:55 +08:00
    @m31271n 所以 ame.sh 有个 reloadcmd 参数,但跨容器就不好处理了。
    m31271n
        32
    m31271n  
    OP
       2016-07-16 20:38:08 +08:00
    @shiny 不过,倒是想到了一个办法 —— 在 Nginx 容器中使用 inotifywait 这种文件状态检测工具来监测证书变化,证书一旦变化了就重载 Nginx 。(这个办法你觉得如何?)
    wql
        33
    wql  
       2016-07-16 20:44:25 +08:00 via Android
    @m31271n 这个配置的标准名称,是 includeSubDomains 。注意, Domains 的 D 得大写(推荐配置)。
    includeSubdomains 已经 deprecated 了
    shiny
        34
    shiny  
       2016-07-16 20:47:21 +08:00
    @m31271n 听上去可行,建议补充到您的这个项目里,那就解决了我面临的问题了 :D
    m31271n
        35
    m31271n  
    OP
       2016-07-16 20:56:27 +08:00
    @shiny 这个是得在你的 Nginx 容器中实现的。
    VmuTargh
        36
    VmuTargh  
       2016-07-16 21:00:17 +08:00   ❤️ 2
    HTTPS 怎么够,你还需要如下选项:

    0.HSTS ,个人 HTTPS 站点必备,很多企业站也上线了 HSTS 。谷歌也搞了一个 HSTS Preload List ,任何被登记在这个 list 里面的站点会直接用 https 链接,避免 fallback 风险。当然这个列表 Firefox 、 Edge 也兹磁。

    1.DNSSEC ,虽然我兔境内 DNSSEC 部署几乎等于没有,只有 CNNIC 一家。但有总比没有好, DNSSEC 本身就是用于对抗 DNS 污染的。不过需要用户操作系统还有 DNS 服务器兹磁。目前 DNSSEC 在大多数国别域名以及 gTLD 已经部署,各个根服务器组也已部署了 DNSSEC 兹磁。越来越多的域名注册商、 DNS 服务商开始提供 DNSSEC 的兹磁了。

    2.HPKP ,这个东西用来防止伪造证书进行中间人攻击,通过 HPKP 头设置指定证书(可以包括域名证书、中间证书或者根 CA 证书)的 fingerprint ,来检验是否为此服务器使用证书,以避免中间人攻击。

    3.DANE ,这个玩意其实和 HPKP 差不多,都是验证证书的机制,但是这个是基于 DNSSEC 的,实现不如 HPKP 优雅。但是适配范围更广。包括 TCP 、 UDP 等,不仅仅是 HTTPS 。所兹磁的 SSL 证书也不仅限定于正规 CA 签发的证书,也包括自签名证书。

    4.Certificate Transperency ,这个被成为证书透明度的东西一直没搞懂是如何发挥作用的。但是据窝的观察,应该是判断证书是否可信的一个机制。当然, CT 依赖于 SCT 服务器……

    另外暴力膜一下……

    BroncoTc :
    网络上的 https 和 http 相比,加了一个 s 有什么用? http+1s 比 http 安全吗?
    我不是运维工作者,但我见得多了,我觉得我作为一个贴膜专家兼前国家二级赛艇运动员,有必要跟你们分享一点网络协议方面的人生经验。
    一个网站的安全呀,不仅需要在应用层面添加必要的防护,更要从网络协议层面上考虑架构的合理性。
    毫无疑问, HTTPS 正是这样一种既兼顾了应用层面的奋斗,又考虑了架构合理性的新理念,它代表了先进生产力的发展要求,代表了先进文化的发展方向,代表了最广大码农的根本利益。
    所以,一个没有+1s 的网站,可能被运营商劫持,可能被黑客攻击,可能有很多种不幸的可能。但是当网站+1s 之后,一切烦恼就结束了。用上海知名气象学家徐嘉诰的话说就是,本来天气预报今天有黑客攻击, https 一来,万里无云。
    不知道你想过没有,为什么程序员天天加班到没时间,但在续命的问题上却有莫大的热情呢?因为他们真切的体会到了+1s 的好处
    http=( h ) a ( t ) oo young ( t ) oo sim ( p ) le ?
    m31271n
        37
    m31271n  
    OP
       2016-07-16 21:01:10 +08:00
    @wql 嗯。已更改。
    shiny
        38
    shiny  
       2016-07-16 21:29:33 +08:00
    @m31271n 我指你可以在文档注明 reload 方式或者提供一些帮助或者脚本,这个项目在独立容器里当然无法处理。
    m31271n
        39
    m31271n  
    OP
       2016-07-16 23:03:20 +08:00
    @shiny 了解。 Wink! Wink!
    Him
        40
    Him  
       2016-07-17 12:30:12 +08:00   ❤️ 2
    小哥好厉害
    lan894734188
        41
    lan894734188  
       2016-07-17 19:12:00 +08:00 via Android
    很好奇为什么是 A-
    Pseric
        42
    Pseric  
       2016-07-17 23:52:57 +08:00
    其实用 CloudFlare 很无痛没烦恼,只是一般网站仍需要去处理路径上的问题。
    m31271n
        43
    m31271n  
    OP
       2016-07-18 17:18:02 +08:00
    @lan894734188 查看 SSL Server Test 的结果,看看如何修复。
    2025
        44
    2025  
       2016-07-20 09:39:14 +08:00
    他的官网: https://letsencrypt.org/ 的证书为何不是自己的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   956 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:58 · PVG 04:58 · LAX 12:58 · JFK 15:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.