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

2017 年 6 月 15 日申请 Let's Encrypt 免费的 ssl 攻略,之前的攻略都可以扔了。

  •  
  •   uuair · 2017-06-15 22:31:12 +08:00 · 7859 次点击
    这是一个创建于 2728 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么说以前的都可以扔了呢?因为我走了很多很多弯路,然后还不相信官方的话,虽然还有问题无法解决,但我已经做到 A+了。

    好了,开始干活,我的系统环境是 ubuntu17.4+nginx+ghost 博客

    首先要知道,申请 Let's Encrypt 的方法,官方有一个自动获得软件,叫 Certbot,它的官网有使用方法,一定要看这个!!!!虽然他还有不完善的地方,不过我会改掉的!

    cerbot 官网

    按照官方网站里面选择的 ningx 以及 ubuntu17.4 的安装方法运行吧:

    $ sudo apt-get install software-properties-common  
    $ sudo add-apt-repository ppa:certbot/certbot  
    $ sudo apt-get update  
    $ sudo apt-get install python-certbot-nginx   
    

    看,上面最后一步其实已经跟很多教程不同了,对吧!

    下一步再按照官网运行:

    certbot --nginx  
    

    好了,上面这部需要 sudo 或者 sudo su 来运行,这个不算毛病。

    第一步输入一个邮箱,以后可以找回你失去的东西,然后选择域名。

    接下来就好玩了,因为这个软件,已经配置好了 nginx,按照其他教程,后面还要弄关于 nginx 的问题,还有什么验证问题,但现在,都不用干了,因为都好了!!

    软件生成的文件/etc/letsencrypt/options-ssl-nginx.conf<--------看好了这个文件,里面的内容是这样的:

    ssl_session_cache shared:le_nginx_SSL:1m;
    ssl_session_timeout 1440m;
    
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    
    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";
    

    仔细看看,已经包括很多教程的内容了,甚至更多! 所以不要学教程,在 nginx 的配置文件当中添加这些内容,会出错的!

    所以下一步是修改,因为这时候进入测试网站:https://myssl.com 看到的结果是 B 级。

    here we go!

    根据这里: https://weakdh.org/sysadmin.html 指出的问题,Diffie-Hellman for TLS 有问题,certbot 是没有设置的,所以需要手动来一波。

    我是这样的,进入 /etc/letsencrypt/live/你的域名 /
    这里存着生成的各种 pem 以及证书,就在这里吧:

    openssl dhparam -out dhparams.pem 2048  
    

    等啊等啊,然后生成 dhparams.pem 了,这下进入 ningx 的目录,找到网站的.conf 文件,你看,文件里面已经被改的五花八门了吧,这就是 certbot 生成的,在这些文件下面添加:

    ssl_dhparam /etc/letsencrypt/live/你的域名 /dhparams.pem;
    

    然后,我是说然后又来了,上面这些只能让你的网站到 A,下面还有一个,开启全局 https,或者说设置 HSTS,再楼上那个文件下面继续添加:

     #HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)  
     add_header Strict-Transport-Security max-age=15768000;
    

    保存吧,然后无论是systemctl restart nginx还是sudo nginx -s reload都可以开启 ssl,虽然虽然,并不完美!

    最后来一步我用不知道对错的自动更新,我实在 root 下运行的:

    crontab -e  
    0 3 * * 2,4,6 certbot renew -q --pre-hook "service nginx start" --post-hook "service nginx restart"
    

    上面这个对不对,我没法测试啊,理论上是可以的吧。。

    60 条回复    2017-06-17 15:18:32 +08:00
    SourceMan
        1
    SourceMan  
       2017-06-15 22:33:23 +08:00 via iPhone
    这么复杂,我都是一键申请和续签的,没有这么多步骤
    uuair
        2
    uuair  
    OP
       2017-06-15 22:34:51 +08:00
    @SourceMan 小伙子,要与时俱进啊。。。
    0ZXYDDu796nVCFxq
        3
    0ZXYDDu796nVCFxq  
       2017-06-15 22:36:57 +08:00 via iPhone   ❤️ 26
    标题好牛逼,进来一看,纯粹标题党,正文养分约为零。
    Clarke
        4
    Clarke  
       2017-06-15 22:37:32 +08:00 via Android
    mark 一下。
    uuair
        5
    uuair  
    OP
       2017-06-15 22:38:14 +08:00
    @gstqc 来来来,你说我是标题党,我搜到最新的配置指南事 2017 年 3 月份的,你看看跟我说的一样不?
    在网站的 conf 里面,添加了过多的东西,然后无法启动 nginx。
    bkmi
        6
    bkmi  
       2017-06-15 22:40:27 +08:00   ❤️ 1
    flaneurse
        7
    flaneurse  
       2017-06-15 22:40:42 +08:00 via Android
    正好再过一个月要续了,先记下来
    fudanglp
        8
    fudanglp  
       2017-06-15 22:42:05 +08:00
    acme 好像更流行一点
    0ZXYDDu796nVCFxq
        9
    0ZXYDDu796nVCFxq  
       2017-06-15 22:45:55 +08:00 via iPhone   ❤️ 2
    @uuair 1. 申请方法有非常多的文章,要了解的看下 acme 协议
    2. 要自动化签发的,看下 acme.sh 这个脚本,各种验证方法和自动续签
    3. Nginx 无法启动,跟申请证书一点关系都没
    4. 评价 A+, 和证书没有一点关系,反正最低只能申请 RSA 2048 的证书。只和你的 Web server 配置有关。
    ershiwo
        10
    ershiwo  
       2017-06-15 22:48:03 +08:00
    签发用自动化工具,安全性配置按 Mozilla 推荐的抄,A+ 没什么难的吧。两年前的东西照样用,基本流程又没有什么大变化。
    lightening
        11
    lightening  
       2017-06-15 22:48:29 +08:00
    最简单的办法大概是用 Caddy 这个直接支持 LE 的 web server 吧……
    uuair
        12
    uuair  
    OP
       2017-06-15 22:49:02 +08:00
    @gstqc 好吧,我明白了,你根本没看我写的。。哈哈,反正我也是给自己记录一下,而且方便跟我一样不懂的人走弯路,你的话我可以忽略啦。
    sundong
        13
    sundong  
       2017-06-15 22:49:53 +08:00
    阿里云 方便+ 简单+免费
    https://ooo.0o0.ooo/2017/06/15/59429e75879e0.png
    0ZXYDDu796nVCFxq
        14
    0ZXYDDu796nVCFxq  
       2017-06-15 22:50:57 +08:00 via iPhone
    @uuair no,是你没看明白我回复的 4 点内容。
    DearTanker
        15
    DearTanker  
       2017-06-15 22:53:32 +08:00
    感谢分享。
    zuolan
        16
    zuolan  
       2017-06-15 22:55:45 +08:00
    自己写了个 Docker 镜像,只需要一条命令,全自动运行,真正一键搞定,管你什么服务器什么配置。。。。( Docker Hub 一堆这种镜像,我就不给自己打广告了)
    Kilerd
        17
    Kilerd  
       2017-06-15 23:00:38 +08:00   ❤️ 3
    嗯,你居然不用 acme.sh

    你这个也可以扔了。(滑稽
    GoldenPillow
        18
    GoldenPillow  
       2017-06-15 23:06:53 +08:00 via iPhone
    支持分享,不过撸主没有做好科技查新工作啊,acme.sh 非常方便
    neilp
        19
    neilp  
       2017-06-15 23:08:03 +08:00 via iPhone
    我是被标题吓到,然后进来的
    zpf124
        20
    zpf124  
       2017-06-15 23:23:48 +08:00   ❤️ 1
    同 A+ 的路过,达到这个级别 配置很简单.

    我之前的配置照着这几个网址弄的,当时这个工具还不支持直接 nginx 启动。

    Let's Encrypt 工具网站
    https://certbot.eff.org/#debianwheezy-nginx

    mozilla 的服务器配置生成器,
    https://mozilla.github.io/server-side-tls/ssl-config-generator/

    用这个生成 Modern 级别的配置 在再生成一下 dhparams.pem 就直接是 A+了。



    另外楼主 你的定时计划命令 应该不要那两个 hook。 根据工具的文档,应该可以不用停止 nginx。它的文档里写的是“更新命令会使用和注册相同的参数除非你手动修改”。
    之前需要些 hook 是因为当时使用的是 standalone 插件,这个插件需要使用 80/443 端口来让他自己成为 web 服务器从而可以让 Let's Encrypt 的服务器可以验证你拥有这个域名,所以需要关闭掉真正监听这两个端口的服务器软件。 而现在有了支持 nginx 的插件,应该可以不用关闭 nginx 服务了。

    官方文档里 给 debian7 写的文档里是 直接将 certbot-auto renew --no-self-upgrade 加入 定时计划。我想 Ubuntu 也类似。

    // 不过 这个得 你自己验证一下了,我现在是用 acme.sh ...
    zpf124
        21
    zpf124  
       2017-06-15 23:26:12 +08:00
    @ershiwo 确实简单, 用 mozilla 的生成器生成一个激进的不然兼容那 0.x%的老软件的配置,再生成以下 dhparams 就直接 A+了。
    uuair
        22
    uuair  
    OP
       2017-06-15 23:30:21 +08:00
    @zpf124 是啊是啊,我也没发验证,但是那个不是重启,而是不要让 nginx 关闭的意思。
    zpf124
        23
    zpf124  
       2017-06-15 23:39:56 +08:00
    @uuair 讲真 确实非常简单,你的文章也没有涉及深入的部分,只有三条命令的使用... 确实有点水....

    nginx 起不来 确实是你配置有问题, 涉及 https 的配置主要就 4 项 ,不算过多。

    ssl_certificate 证书
    ssl_certificate_key 私钥
    ssl_protocols 支持的安全通讯协议 (为了安全就是 TLS1.2,兼容就 TLSv1 TLSv1.1 TLSv1.2)
    ssl_ciphers 支持的加密算法 (这个可能长了点,但算法就那么些,网上搜这个属性能搜出一大堆配置)
    zpf124
        24
    zpf124  
       2017-06-15 23:46:21 +08:00
    @Clarke
    @flaneurse

    就像楼上其他人说的 现在好像 acme.sh 更流行一点,而且工具更小更简单...
    https://github.com/Neilpang/acme.sh 这个项目的 wiki 里就有教程
    或者也可以看这个 https://ruby-china.org/topics/31983

    至于 nginx 的配置 直接用 mozilla 那个生成就很好。
    zpf124
        25
    zpf124  
       2017-06-15 23:52:10 +08:00
    @uuair 你根本没看懂文档, 那两个 hook 实现的功能是

    当工具开始处理之前 执行 --pre-hook 之后处理续签 等续签完成后 触发 --post-hook

    整个命令的意思就是 当 certbot renew 运行前,停止 nginx, 当 certbot renew 运行结束后 再启动 nginx。

    这个命令 是为了 以前的 standalone 插件设计的, 因为这个插件 要用 web 端口。
    Clarke
        26
    Clarke  
       2017-06-16 00:04:08 +08:00 via Android
    @zpf124,好的,哪个简单我就用哪个。
    zpf124
        27
    zpf124  
       2017-06-16 00:07:00 +08:00



    基本都是 mozilla 默认生成的,添了个 ssl_dhparam,注释了 ssl_trusted_certificate,完事 。A+~~~
    wangxiaodong
        28
    wangxiaodong  
       2017-06-16 00:11:02 +08:00   ❤️ 1
    @uuair

    阻碍网站成为 A+的关键点主要是 Web Server 的相关设置,跟 https 证书签发不太相关。

    tls/https 证书不管通过什么方式签署下来的,理论上大多数就符合 A+,比如我网站 https://congci.com 就是用自行编程方式来申请证书的。

    在这里给大家推荐一个 go 语言版本的证书申请开源项目 - https://github.com/xenolf/lego

    签发 go 代码 - certificates, failures := client.ObtainCertificate([]string{"mydomain.com"}, bundle, nil, false)
    SourceMan
        29
    SourceMan  
       2017-06-16 00:15:14 +08:00 via iPhone
    我都懒得回复了,楼上正解
    chanssl
        30
    chanssl  
       2017-06-16 00:33:10 +08:00
    acme.sh 用着挺好挺方便。
    ahu
        31
    ahu  
       2017-06-16 01:16:14 +08:00
    不管怎么说,这篇文章价值还是很大。让我了解到了 certbot 和 acme.sh 的更新,尤其是 caddy server
    顺带又知道了好多相关项目,例如 Gogs
    heimeil
        32
    heimeil  
       2017-06-16 01:58:14 +08:00 via Android
    最简单的 Caddy,两句配置 HTTPS 和 HTTP2 都有了,还是自动续订 Let's Encrypt 证书的。
    ryd994
        33
    ryd994  
       2017-06-16 03:01:31 +08:00 via Android
    你知不知道,Nginx 可以 include ?
    sxyuqiao
        34
    sxyuqiao  
       2017-06-16 04:28:41 +08:00 via iPhone
    28 楼正解 来 V2 发教程之前还是多学习学习吧
    xfspace
        35
    xfspace  
       2017-06-16 08:48:51 +08:00 via Android
    我进不去`ningx`目录啊。怎么生成`dhparams.pem`?
    nfroot
        36
    nfroot  
       2017-06-16 09:24:38 +08:00
    大家看这里,
    大家看这里,
    大家看这里,
    大家看这里,
    楼主说的 ningx 到底是什么软件???

    说什么之前的攻略都可以扔了,也太目中无人了吧,又不是全世界只有 ubuntu17.4+nginx 一种搭配。你的攻略都不通用,还想跟别人比肩。
    楼上说得对,你就一标题党。还跟我们说 ningx,你倒是给我解释一下,多处出现 ningx 是几个意思?

    虽然说你是分享应该感谢没错,但是也稍微注意一下用词吧,还有别搞错别字。谢谢
    yuanchao
        37
    yuanchao  
       2017-06-16 09:37:22 +08:00
    有一种那个感觉
    yuanchao
        38
    yuanchao  
       2017-06-16 09:37:59 +08:00
    有一种那个感觉


    你们都让开,不是我针对谁,我是说在坐各位都是垃圾
    7654
        39
    7654  
       2017-06-16 10:00:26 +08:00
    同推荐 acme.sh 脚本一键运行
    lele140
        40
    lele140  
       2017-06-16 10:00:46 +08:00
    同样推荐 https://acme.sh
    mokeyjay
        41
    mokeyjay  
       2017-06-16 10:05:29 +08:00   ❤️ 3
    不是很懂你这种自信心爆棚的家伙
    mritd
        42
    mritd  
       2017-06-16 10:12:45 +08:00 via iPhone
    @ershiwo 完全正确
    jianleer
        43
    jianleer  
       2017-06-16 10:16:48 +08:00
    感谢楼主,A+ 了
    momocraft
        44
    momocraft  
       2017-06-16 10:19:18 +08:00
    考虑过为什么自己走了那么多弯路吗 :doge:
    abclearner
        45
    abclearner  
       2017-06-16 10:21:02 +08:00
    看得雨里雾里的 我一技术小白 照着 DO 上的一篇攻略 弄完就 A+了
    那个日期是干什么的?
    ppwangs
        46
    ppwangs  
       2017-06-16 10:43:08 +08:00
    sunber
        47
    sunber  
       2017-06-16 11:39:22 +08:00
    感觉比我之前申请的 startssl 麻烦多了
    lsido
        48
    lsido  
       2017-06-16 12:48:25 +08:00 via Android
    哈哈哈哈,我居然看完了各种喷
    4679kun
        49
    4679kun  
       2017-06-16 13:05:26 +08:00 via Android
    A+太简单了 来玩这个
    myliyifei
        50
    myliyifei  
       2017-06-16 13:05:34 +08:00 via Android
    非 443 端口没法用 很蛋疼
    yangxuan8282
        51
    yangxuan8282  
       2017-06-16 15:06:09 +08:00
    申请证书自动化工具有官方的工具 certbot,脚本有 acme.sh,用 docker 的话有 neilpang/nginx-proxy 和 blackglory/caddy-proxy,如果非说手动申请更先进的话总得说出点理由吧
    Zohar
        52
    Zohar  
       2017-06-16 15:37:50 +08:00 via Android   ❤️ 1
    楼主成功地把一件很简单的事情给复杂化了→_→
    momocraft
        53
    momocraft  
       2017-06-16 15:39:33 +08:00
    @yangxuan8282 解决其他方法中不存在的问题,给人更大的成就感 →_→
    yangxuan8282
        54
    yangxuan8282  
       2017-06-16 15:43:19 +08:00
    @momocraft 确实,可能会有点类似网站备案成功的那种仪式感
    johnlui
        55
    johnlui  
       2017-06-16 18:20:16 +08:00
    A+ 并不是什么好事,虽然兼容性爆表,但是苹果 ATS 不认,而且支持的加密方式太多,除 MAC 端 Chrome 之外的其他浏览器有时候会报告很奇怪的问题,反而会影响真实用户的访问。
    Tink
        56
    Tink  
       2017-06-16 19:39:32 +08:00 via iPhone
    这是啥意思
    litanid
        57
    litanid  
       2017-06-16 21:30:49 +08:00
    zingl
        58
    zingl  
       2017-06-16 22:40:57 +08:00
    前面套 HTTPS CDN,什么都不用,结束
    yytsjq
        59
    yytsjq  
       2017-06-16 22:53:26 +08:00
    Hardrain
        60
    Hardrain  
       2017-06-17 15:18:32 +08:00
    个人认为还是 acme.sh 更好用,特别是申请 ECDSA 证书的时候.

    Letsencrypt/Certbot 需要自己生成 CSR 而 acme.sh 不用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3507 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:16 · PVG 19:16 · LAX 03:16 · JFK 06:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.