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

一个快速获取/更新 Let's encrypt 证书的 shell script

  •  8
     
  •   clanned · 2015-12-07 20:10:44 +08:00 · 23464 次点击
    这是一个创建于 3266 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/xdtianyu/scripts/tree/master/lets-encrypt

    调用 acme_tiny.py 认证、获取、更新证书,不需要额外的依赖。

    下载到本地

    wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
    wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
    chmod +x letsencrypt.sh
    

    配置文件
    只需要修改 DOMAIN_KEY DOMAIN_DIR DOMAINS 为你自己的信息

    ACCOUNT_KEY="letsencrypt-account.key"
    DOMAIN_KEY="example.com.key"
    DOMAIN_DIR="/var/www/example.com"
    DOMAINS="DNS:example.com,DNS:whatever.example.com"
    

    执行过程中会自动生成需要的 key 文件。

    运行

    ./letsencrypt.sh letsencrypt.conf
    

    注意
    需要已经绑定域名到 /var/www/example.com 目录,即通过 http://example.com http://whatever.example.com 可以访问到 /var/www/example.com目录,用于域名的验证

    cron 定时任务

    每个月自动更新一次证书,可以在脚本最后加入 service nginx reload等重新加载服务。

    0 0 1 * * /etc/nginx/certs/letsencrypt.sh /etc/nginx/certs/letsencrypt.conf >> /var/log/lets-encrypt.log 2>&1
    
    63 条回复    2016-12-08 00:52:46 +08:00
    Cavolo
        1
    Cavolo  
       2015-12-07 20:17:07 +08:00 via iPhone
    get ,感谢楼主
    ahu
        2
    ahu  
       2015-12-07 20:26:01 +08:00
    我就知道会有,好快!
    ahu
        3
    ahu  
       2015-12-07 20:35:13 +08:00
    @clanned 何不把本文内容设为该项目的 README.md
    clanned
        4
    clanned  
    OP
       2015-12-07 20:50:24 +08:00
    @ahu 已经添加到 README-CN.md ,谢谢建议
    mx1700
        5
    mx1700  
       2015-12-07 21:05:01 +08:00
    为什么我着没有 /etc/ssl/openssl.cnf 文件。。。生成失败
    pupboss
        6
    pupboss  
       2015-12-07 21:16:00 +08:00
    话说这个有没有可能像 StartSSL 一样,那谁脑子一抽就给封了
    lution
        7
    lution  
       2015-12-07 21:31:04 +08:00
    Lets Encrypt 的认证一定要通过 80 端口吗? 可以通过其他端口( 443 )来进行认证吗?
    skydiver
        8
    skydiver  
       2015-12-07 21:53:13 +08:00
    @lution 你还没有证书呢,怎么通过 443 。。。
    yeyeye
        9
    yeyeye  
       2015-12-07 22:06:10 +08:00
    请收下我的膝盖吧!
    yeyeye
        10
    yeyeye  
       2015-12-07 22:20:52 +08:00
    @clanned 细细看了楼主 2 遍正文,有一个疑问 /需求想提出来。

    在这个浮躁的社会,一个 IP 用 SNI 搞好几个证书将是常态( sha256 就把 IE6 刷掉了,以后又不准签发 sha1 证书,所以 SNI 必然很快会是常态)

    所以楼主可否解决此问题,一个脚本直接可以处理多个证书,我想这个问题处理好,就能满足大部分的欲望了……
    clanned
        11
    clanned  
    OP
       2015-12-07 22:27:06 +08:00
    @pupboss startssl 有段时间被封过?最近两年都可以正常使用


    @lution 用官方客户端可以用 standalone 模式,指定端口,这样客户端会自己建一个 Web 服务器用于认证。


    @mx1700 是不是没有安装 OpenSSL ?还是自己编译了 OpenSSL ,找下

    /usr/local/ssl/openssl.cnf
    /usr/lib/ssl/openssl.cnf
    /etc/ssl/openssl.cnf
    clanned
        12
    clanned  
    OP
       2015-12-07 22:30:31 +08:00
    @yeyeye 你是说一个证书多个域名吗? DOMAINS="DNS:example.com,DNS:whatever.example.com",这个配置是两个域名的例子,你按照格式添加就行了,最好不要太多
    oott123
        13
    oott123  
       2015-12-07 22:46:36 +08:00 via Android
    @mx1700 CentOS 好像是 /etc/pki/ssl 还是 /etc/ssl/pki 目录下
    xhat
        14
    xhat  
       2015-12-07 22:47:12 +08:00
    dns query timed out 是怎么回事,难道 dnspod 在国外不被解析么
    xhat
        15
    xhat  
       2015-12-07 22:48:13 +08:00   ❤️ 1
    @clanned @mx1700
    /etc/pki/tls/openssl.cnf
    yylzcom
        16
    yylzcom  
       2015-12-07 23:00:50 +08:00
    @clanned 一个服务器上好几个网站需要好几个证书,这个有没有什么办法呢
    imWBB
        17
    imWBB  
       2015-12-07 23:43:44 +08:00
    试了 很好用。
    clanned
        18
    clanned  
    OP
       2015-12-07 23:44:49 +08:00 via Android
    @xhat 是的, let's encrypt 用的 Google 8.8.8.8 解析, dnspod 这段时间对 8.8.8.8 解析有问题,我昨天已经切换到 cloudxns 了。用 nslookup lets-encrypt.xdty.org 8.8.8.8 检查下域名,更多细节参考 https://www.xdty.org/1909


    @yylzcom 同一个证书可以签署同一个域名的多个二级域名,也可以添加多个不同域名,应该没有影响,参考这个配置 DOMAINS="DNS:example.com,DNS:whatever.example.com"
    imxieke
        19
    imxieke  
       2015-12-07 23:54:45 +08:00 via Android
    支持通配符不?(我想我自己已经有答案了 )
    yeyeye
        20
    yeyeye  
       2015-12-08 00:09:47 +08:00
    @clanned 看你的解释感觉这个 Let's encrypt 简直不能更棒了,完全不像一个刚出生的婴儿……还能搞自动化,验证方式也多样化。如果不被打压,确实很赞!以前 startssl 被墙了一次(使用了 Startssl 的国外服务器站点都被墙了一小段时间,我记得是很短的一个时间,几个小时?几天?)
    TrustyWolf
        21
    TrustyWolf  
       2015-12-08 00:17:10 +08:00
    我有强迫症,绝对不会在运行着网站的服务器上额外安装任何东西...
    So. 感觉 StartSSL 要方便不少。
    yylzcom
        22
    yylzcom  
       2015-12-08 00:18:36 +08:00
    @TrustyWolf 这个不会长时间占用 80 端口,而且整个过程首次也就不到 5 分钟,设置好之后就是几秒钟甚至自动续期... 比 StartSSL 方便...
    TrustyWolf
        23
    TrustyWolf  
       2015-12-08 00:38:27 +08:00
    @yylzcom 我比较希望 Let's Encrypt 能增加证书的有效期和域名的认证方式,比如通过添加 DNS 的 TXT 记录之类的。
    clanned
        24
    clanned  
    OP
       2015-12-08 08:10:37 +08:00 via Android
    @yylzcom 并没有占用 80 端口,只是在你的 Web 目录写了认证域名的临时文件


    @TrustyWolf 没有安装额外依赖,就是再发 HTTP 请求下载证书,比 startssl 方便很多。应该不会有 txt 认证,这个是认证域名解析,就算是你拿到免费的动态域名解析服务也可以签证书。


    @imxieke 不支持通配符野证书
    dallaslu
        25
    dallaslu  
       2015-12-08 09:04:52 +08:00
    @clanned 野卡证书……
    johnjiang85
        26
    johnjiang85  
       2015-12-08 12:17:35 +08:00   ❤️ 2
    @xhat
    @clanned
    关于 letsencrypt 无法验证使用 DNSPod 解析的域名的情况,我们经过排查主要为两个原因造成:
    1. 超时错误。
    DNSPod 免费服务器最近几天一直持续受到大流量攻击,且中国电信骨干网络出现拥塞,从国外访问 DNSPod 免费 DNS 服务器丢包严重,导致国外 DNS (如 8.8.8.8 )解析 DNSPod 免费域名异常,该问题目前已基本恢复正常。
    2. DNS 验证失败错误.
    letsencrypt 在最终验证时使用了随机大小写( 0x20 encode )方式进行 DNS 解析请求,以及请求 CAA 记录(可以不支持)。 DNSPod 为了提高解析服务器的性能,以及应对随机大小写方式的 DNS FLOOD 攻击,是没有对该验证方式进行支持的,一律返回小写。我们正在对该问题进行验证,验证 OK 后将尽快更新支持 letsencrypt 。
    Niphor
        27
    Niphor  
       2015-12-08 13:38:29 +08:00
    只能通过 80 端口略蛋疼啊

    我开发板用的家用网络 80 被封了...
    xhat
        28
    xhat  
       2015-12-08 14:55:29 +08:00
    @johnjiang85 消息来的太慢,已换 cloudxns 成功
    mx1700
        29
    mx1700  
       2015-12-08 16:58:42 +08:00
    我用的阿里的 DNS 解析,报错 DNS query timed out
    但 nslookup 检查 8.8.8.8 是能解析的,这是不想让我用吗
    imxieke
        30
    imxieke  
       2015-12-08 17:34:19 +08:00
    你好 出现错误了唉 求解
    ```
    Traceback (most recent call last):
    File "/tmp/acme_tiny.py", line 2, in <module>
    import argparse, subprocess, json, os, sys, base64, binascii, time, hashlib, re, copy, textwrap, logging
    ImportError: No module named argparse
    ```
    lution
        31
    lution  
       2015-12-08 18:19:13 +08:00
    @johnjiang85 我这里始终都是 DNS query timed out
    clanned
        32
    clanned  
    OP
       2015-12-08 18:35:44 +08:00
    @imxieke 你的操作系统、环境是什么? argparse 是 libpython2.7-stdlib 标准库里的内容
    imxieke
        33
    imxieke  
       2015-12-08 18:41:49 +08:00
    @clanned centos 6.5 64 位, python2.6 是 python 版本低了?
    xhat
        34
    xhat  
       2015-12-08 18:42:02 +08:00   ❤️ 1
    @imxieke
    yum install python-argparse
    imxieke
        35
    imxieke  
       2015-12-08 18:52:44 +08:00
    @xhat 好的 我在升级 python ,等下我试试 谢谢哈
    johnjiang85
        36
    johnjiang85  
       2015-12-09 09:53:52 +08:00
    @lution 现在国内 letsencrypt 解析 timed out 非常多,包括 DNSPod 、阿里等的 DNS 基本都是 timed out ,无法验证通过。 0x20 问题我们是使用国外节点进行测试的。
    lution
        37
    lution  
       2015-12-09 09:59:52 +08:00
    @johnjiang85 感谢回复,因为这个问题已经迁到 CloudFlare 了,说实话,感觉真不错。
    johnjiang85
        38
    johnjiang85  
       2015-12-09 12:04:41 +08:00
    测试感觉现在 letsencrypt 的验证规则一直在变, 12.09 的最新规则 DNSPod 、 ali 、 XNS 等都无法验证通过了,都报 timed out 错误, DNSPod 这边修改后的解析程序,测试已经可以验证通过,本周将从免费版逐步灰度更新。
    主要修改内容有:1. 支持 0x20 encode ( letsencrypt 貌似已经修改了该规则,不再需要了,但是还是会进行支持). 2.对 CAA 请求进行应答
    dot
        39
    dot  
       2015-12-09 19:08:15 +08:00
    我用安全宝倒是一次过了……从 DNSPod 出来的……
    quericy
        40
    quericy  
       2015-12-13 18:38:20 +08:00
    @johnjiang85
    我说用官方的 no root 工具咋一直报 dns 查询错误
    原来是这样 orz
    johnjiang85
        41
    johnjiang85  
       2015-12-17 17:36:15 +08:00
    @quericy
    目前 DNSPod 免费套餐灰度更新了部分服务器,已经可以验证通过 letsencrypt 的证书了。
    之前一些其他国内 NS 可以验证通过,但是现在无法验证通过了,主要是 letsencrypt 修改了规则,重新兼容新规则,并申请开通安全防护策略耽误了一些时间。
    fishlee
        42
    fishlee  
       2015-12-17 22:44:44 +08:00 via Android
    谢谢分享了。
    quericy
        43
    quericy  
       2015-12-18 11:45:12 +08:00
    @johnjiang85 感谢,这次 2 分钟就搞定了
    rio
        44
    rio  
       2015-12-24 10:33:18 +08:00
    @johnjiang85 又开始超时了
    CloudXNS
        45
    CloudXNS  
       2015-12-25 17:30:33 +08:00
    CloudXNS 本版更新已兹磁,欢迎测试。~
    https://www.cloudxns.net/Support/detail/id/1062.html
    typcn
        46
    typcn  
       2015-12-25 18:30:30 +08:00
    @CloudXNS 才发现 cloudxns 免费版都自带全球解析加速,在国外相当于免费的 amazon route 53
    CloudXNS
        47
    CloudXNS  
       2015-12-28 13:47:12 +08:00
    @typcn 我们免费版和收费版的解析是一样的。
    janecc
        48
    janecc  
       2016-01-25 13:02:17 +08:00
    不支持阿里 DNS ,怎么破解
    clanned
        49
    clanned  
    OP
       2016-01-25 13:04:07 +08:00 via Android
    @janecc 临时把 ns 解析切换到国外或者国内可用的服务商
    baiyuxiong
        50
    baiyuxiong  
       2016-01-29 20:56:40 +08:00
    这四个参数都表示什么意思?

    ACCOUNT_KEY="letsencrypt-account.key"
    DOMAIN_KEY="example.com.key"
    DOMAIN_DIR="/var/www/example.com"
    DOMAINS="DNS:example.com,DNS:whatever.example.com"
    baiyuxiong
        51
    baiyuxiong  
       2016-01-29 21:13:50 +08:00
    为什么没有 fullchain.pem 和 privkey.pem ?
    nginx 应该怎么配置?
    a308057848
        52
    a308057848  
       2016-02-03 17:21:47 +08:00
    ACCOUNT_KEY 去哪里拿
    clanned
        53
    clanned  
    OP
       2016-02-03 17:58:52 +08:00
    @a308057848 "执行过程中会自动生成需要的 key 文件。", 设置好名字就行,会自动生成。
    Remember
        54
    Remember  
       2016-02-08 11:30:45 +08:00
    @clanned 支持 ecdsa 证书么
    panlilu
        55
    panlilu  
       2016-02-08 16:33:53 +08:00
    已用,非常赞,感谢已送上。
    leobin
        56
    leobin  
       2016-03-03 17:18:16 +08:00
    出现错误求教

    Generate CSR...leob.csr
    error on line -1 of /dev/fd/63
    3073984776:error:02001002:system library:fopen:No such file or directory:bss_file.c:169:fopen('/dev/fd/63','rb')
    3073984776:error:2006D080:BIO routines:BIO_new_file:no such file:bss_file.c:172:
    3073984776:error:0E078072:configuration file routines:DEF_LOAD:no such file:conf_def.c:197:
    Parsing account key...
    Parsing CSR...
    Traceback (most recent call last):
    File "/tmp/acme_tiny.py", line 198, in <module>
    main(sys.argv[1:])
    File "/tmp/acme_tiny.py", line 194, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
    File "/tmp/acme_tiny.py", line 70, in get_crt
    raise IOError("Error loading {0}: {1}".format(csr, err))
    IOError: Error loading leob.csr: unable to load X509 request
    3074353416:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: CERTIFICATE REQUEST
    clanned
        57
    clanned  
    OP
       2016-03-03 17:44:08 +08:00
    @leobin 什么系统环境的?我也不清楚这个是什么问题
    leobin
        58
    leobin  
       2016-03-03 21:13:28 +08:00
    @clanned 好吧,是 debian7 ,我用官方教程装好了
    Faratv2
        59
    Faratv2  
       2016-03-30 12:38:11 +08:00
    @leobin
    @clanned
    和 56 楼遇到了一样的问题
    yidongnan
        60
    yidongnan  
       2016-04-12 12:37:58 +08:00
    @baiyuxiong fullchain.pem 和 privkey.pem 的问题解决了吗
    Neo
        61
    Neo  
       2016-07-31 01:14:05 +08:00
    Traceback (most recent call last):
    File "/tmp/acme_tiny.py", line 198, in <module>
    main(sys.argv[1:])
    File "/tmp/acme_tiny.py", line 194, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
    File "/tmp/acme_tiny.py", line 123, in get_crt
    wellknown_path, wellknown_url))

    请问这个问题有解吗?
    Neo
        62
    Neo  
       2016-07-31 01:20:29 +08:00
    @clanned cenos7
    Aduang
        63
    Aduang  
       2016-12-08 00:52:46 +08:00
    Traceback (most recent call last):
    File "/tmp/acme_tiny.py", line 198, in <module>
    main(sys.argv[1:])
    File "/tmp/acme_tiny.py", line 194, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
    File "/tmp/acme_tiny.py", line 123, in get_crt
    wellknown_path, wellknown_url))
    centos7 求救
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2599 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 430ms · UTC 01:44 · PVG 09:44 · LAX 17:44 · JFK 20:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.