dehydrated
原作者 | Lukas Schauer |
---|---|
预览版本 |
v0.6.1
(2018年3月14日
) |
开发状态 | 运行中 |
编程语言 | Shell Script |
许可协议 | MIT license |
网站 |
dehydrated |
源代码库 |
github |
dehydrated是一套支援ACME协定的软体套件(目前仅由Let's Encrypt提供服务)。
特色
相较于官方推广的Certbot使用Python撰写,dehydrated仅使用Shell Script与OpenSSL与curl的指令就可以执行,这些指令在大多数系统中都已经提供。
安装
在Ubuntu 17.10之后的版本(包含即将出版的18.04)可以直接安装dehydrated
[1],而在比较旧的版本可以透过我包装的PPA安装:
$ sudo add-apt-repository ppa:gslin/dehydrated
$ sudo apt update
$ sudo apt install dehydrated
另外可以直接去官方网站上下载档案,仅需下载dehydrated
档案。我建议把这个档案放到/usr/sbin/
下。
基本设定
dehydrated在侦测到/etc/dehydrated/config
或/usr/local/etc/dehydrated/config
时(两个都有时前者优先),会将/etc/dehydrated
或是/usr/local/etc
当作设定目录,所以我们需要产生/etc/dehydrated/config
,目前里面不需要有东西:
$ sudo mkdir /etc/dehydrated
$ sudo touch /etc/dehydrated/config
进阶设定
这边的设定都是选择性设定,进阶使用者可以修改dehydrated预设值,对安全性与效能的参数进行调整。
在config
内可以设定开启凭证内标示一定要开OCSP Stapling:
OCSP_MUST_STAPLE=yes
在config
内可以设定KEYSIZE
,预设是4096,可以改成2048:
KEYSIZE=2048
域名设定
Domain
Domain的认证可以透过http-01
或是dns-01
的协定,这边是用http-01
的方式认证。
在domains.txt
内一行是一张凭证,有几种方式可以设定。
一张凭证一个域名
一行放一个域名,将需要申请的网域名称放到domains.txt
内:
$ cd /etc/dehydrated
$ echo 'blog.gslin.org' | sudo tee -a domains.txt
$ echo 'wiki.gslin.org' | sudo tee -a domains.txt
一张凭证多个域名
将想要放在同一张凭证的域名放在同一行,一样是domains.txt
内:
$ cd /etc/dehydrated
$ echo 'blog.gslin.org wiki.gslin.org' | sudo tee -a domains.txt
Wildcard
Wildcard的认证只能透过dns-01
,而且一定要有一个主域名(没有*
)的:
$ cd /etc/dehydrated
$ echo 'gslin.org *.gslin.org' | sudo tee -a domains.txt
认证设定
http-01
dehydrated预设会用/var/www/dehydrated
作为认证目录,需要将网页的/.well-known/acme-challenge/
指到这边。以nginx的设定会像是这样:
server { # ... # map /var/www/dehydrated/ location /.well-known/acme-challenge/ { alias /var/www/dehydrated/; } }
dns-01
dns-01
会需要使用TXT
record认证。这边会使用lexicon(不适合用pyenv安装,因为通常使用root权限跑dehydrated,这会使得环境无法取得),这需要另外安装。
另外dehydrated需要lexicon的examples/dehydrated.default.sh
(将dehydrated的hook命令转给lexicon使用),所以需要下载这个档案,复制到/usr/sbin/lexicon-dehydrated.default.sh
以便后续更新:
$ cd /tmp
$ git clone https://github.com/AnalogJ/lexicon.git
$ sudo cp lexicon/examples/dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh
或是直接用GitHub提供的连结下载:
$ cd /tmp
$ curl -LO https://raw.githubusercontent.com/AnalogJ/lexicon/master/examples/dehydrated.default.sh
$ sudo cp dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh
执行
第一次需要同意条款:
$ sudo dehydrated --register --accept-terms
之后就可以用-c
自动更新:
$ sudo dehydrated -c
如果是使用dns-01
(像是Wildcard),需要在环境变数里提供对应的API token:
$ sudo PROVIDER=digitalocean LEXICON_DIGITALOCEAN_TOKEN=x dehydrated -c -k /usr/sbin/lexicon-dehydrated.default.sh --challenge dns-01
另外因为lexicon在设定DNS的值之后,预设会停30秒才会跑下一步,会比较慢,请耐心等待。
自动更新
上面提到更新的指令可以放到/etc/cron.weekly
内执行,并且透过传回值可以判断是否有更新,然后重跑nginx或是Postfix(以及其他有用到的服务)。
像是:
#!/bin/bash
export PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"
sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400); dehydrated -c && ( service nginx reload; service postfix reload )
或是:
#!/bin/bash
export PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"
sleep $(expr $(printf "\%d" "0x$(hostname | md5sum | cut -c 1-8)") \% 86400); PROVIDER=digitalocean LEXICON_DIGITALOCEAN_TOKEN=x dehydrated -c -k /usr/sbin/lexicon-dehydrated.default.sh --challenge dns-01 && ( service nginx reload; service postfix reload )
其中:
sleep
片段是为了同一个时间连到Let's Encrypt的伺服器造成类似DDoS的效果。sleep
后面不使用随机变数而是使用hostname
与md5sum
计算是为了随机打散,但又要避免很凑巧一堆机器同时打Let's Encrypt的伺服器。
其他
这边主要是我的个人想法,放在最后避免干扰只是想要学设定方法的读者。
dehydrated的相依性较少,仅需Bash、OpenSSL与curl,这三个套件在蛮多Linux作业系统内已经内建,这对于自动化环境带来的负担会比较少(指的是Puppet或是Chef这类工具),同时也避免了套件版本互相影响的问题。
目前比较大的问题在于申请Wildcard certificate时,因为需要透过dns-01
申请,而这常常会用到lexicon(因为其他使用Shell Script的DNS操作软体支援度比较低)。但lexicon使用Python撰写而引用了大量套件,这违背了使用dehydrated的本意(轻量)。
参考资料
- ↑ Ubuntu – Package Search Results -- dehydrated. [2018-04-24].