Dehydrated:修订间差异

来自Gea-Suan Lin's Wiki
跳到导航 跳到搜索
此页面具有访问限制。如果您看见此消息,则说明您没有权限访问此页面。
 
(未显示同一用户的14个中间版本)
第23行: 第23行:


== 基本設定 ==
== 基本設定 ==
dehydrated在偵測到<code>/etc/dehydrated/config</code>或<code>/usr/local/etc/dehydrated/config</code>時(兩個都有時前者優先),會將<code>/etc/dehydrated</code>或是<code>/usr/local/etc</code>當作設定目錄,所以我們需要產生<code>/etc/dehydrated/config</code>, 目前裡面不需要有東西
 
dehydrated在偵測到<code>/etc/dehydrated/config</code>或<code>/usr/local/etc/dehydrated/config</code>時(兩個都有時前者優先),會將<code>/etc/dehydrated</code>或是<code>/usr/local/etc</code>當作設定目錄,所以我們需要產生<code>/etc/dehydrated/config</code>
 
另外因為從v0.7.0開始預設會使用<code>secp384r1</code>的憑證,這會導致很多舊一點的瀏覽器與爬蟲無法使用 所以指定<code>KEY_ALGO=rsa</code>保持相容性
 
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo mkdir -p /etc/dehydrated /var/www/dehydrated
sudo mkdir -p /etc/dehydrated /var/www/dehydrated
sudo touch /etc/dehydrated/config
echo "KEY_ALGO=rsa" | sudo tee /etc/dehydrated/config
</syntaxhighlight>
</syntaxhighlight>


第57行: 第61行:


=== 一張憑證一個域名 ===
=== 一張憑證一個域名 ===
 一行放一個域名,將需要申請的網域名稱放到<code>domains.txt</code>內:
 一行放一個域名,將需要申請的網域名稱放到<code>domains.txt</code>內:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
cd /etc/dehydrated
cd /etc/dehydrated
第65行: 第71行:


=== 一張憑證多個域名 ===
=== 一張憑證多個域名 ===
 將想要放在同一張憑證的域名放在同一行,一樣是<code>domains.txt</code>內:
 將想要放在同一張憑證的域名放在同一行,一樣是<code>domains.txt</code>內:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
cd /etc/dehydrated
cd /etc/dehydrated
第72行: 第80行:


=== Wildcard ===
=== Wildcard ===
Wildcard的認證一定要有帶有一個主域名(沒有<code>*</code>):
 
Wildcard的認證一定要有帶有一個主域名(沒有<code>*</code> ),要注意Wildcard憑證無法使用<code>http-01</code>的驗證過程取得,只能透過<code>dns-01</code>取得(參考後面怎麼設定<code>dns-01</code>的認證 ):
 
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
cd /etc/dehydrated
cd /etc/dehydrated
第154行: 第164行:
#!/bin/bash
#!/bin/bash
export PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"
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 )
sleep $(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400); dehydrated -c && ( service nginx reload; service postfix reload ) > /tmp/dehydrated-lite.log-$(date -u +%Y%m%d-%H%M%S) 2>&1
</syntaxhighlight>
</syntaxhighlight>


第162行: 第172行:
#!/bin/bash
#!/bin/bash
export PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"
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 $(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 ) > /tmp/dehydrated-lite.log-$(date -u +%Y%m%d-%H%M%S) 2>&1
</syntaxhighlight>
</syntaxhighlight>


 其中:
 其中:
* <code>sleep</code>片段是為了同一個時間連到[[Let's Encrypt]]的伺服器造成類似DDoS的效果。
* <code>sleep</code>片段是為了 避免一堆機器 同一個時間連到[[Let's Encrypt]]的伺服器 造成類似DDoS的效果。
* <code>sleep</code>後面不使用隨機變數而是使用<code>hostname</code>與<code>md5sum</code>計算是為了隨機打散,但又要避免很湊巧一堆機器同時打Let's Encrypt的伺服器。
* <code>sleep</code>後面不使用隨機變數而是使用<code>hostname</code>與<code>md5sum</code>計算是為了隨機打散,但又要避免很湊巧一堆機器同時打Let's Encrypt的伺服器。
== 清理 ==
dehydrated因為設計的關係,最快是每兩個月才會更新一次([[Let's Encrypt]]發出來的是三個月有效,dehydrated預設只會renew少於一個月有效期的憑證),而金鑰與憑證的檔案大小一組實際佔用也才28K(用最大的4096-bit RSA整套),一台機器跑個一百年也才600組資料,算起來約16.4MB。應該是沒有太多清理的需求。
但如果還是想要清掉舊的資料,dehydrated有提供指令可以清:
<syntaxhighlight lang="bash">
sudo dehydrated -gcd
</syntaxhighlight>
也可以考慮包裝到<code>/etc/cron.yearly</code>:
<syntaxhighlight lang="bash">
#!/bin/bash
/usr/sbin/dehydrated -gcd
</syntaxhighlight>


== 其他 ==
== 其他 ==
 這邊主要是我的個人想法,放在最後避免干擾只是想要學設定方法的讀者。
 這邊主要是我的個人想法,放在最後避免干擾只是想要學設定方法的讀者。


第181行: 第209行:


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo add-apt-repository -y ppa:gslin/dehydrated-lite; sudo apt update; sudo apt install -y dehydrated-lite; sudo mkdir -p /etc/dehydrated /var/www/dehydrated; sudo touch /etc/dehydrated/config; sudo dehydrated --register --accept-terms; echo -e '#!/bin/bash\nexport PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"\nsleep $(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400); dehydrated -c && ( service nginx reload )' | sudo tee /etc/cron.weekly/dehydrated-lite; sudo chmod 755 /etc/cron.weekly/dehydrated-lite
sudo add-apt-repository -y ppa:gslin/dehydrated-lite; sudo apt update; sudo apt install -y cron dehydrated-lite; sudo apt clean; sudo mkdir -p /etc/dehydrated /var/www/dehydrated; echo -e "KEY_ALGO=rsa\nKEYSIZE=2048" | sudo tee /etc/dehydrated/config; sudo dehydrated --register --accept-terms; echo -e '#!/bin/bash\nexport PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"\nsleep $(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400); dehydrated -c && ( service nginx reload ) > /tmp/dehydrated-lite.log-$(date -u +%Y%m%d-%H%M%S) 2>&1' | sudo tee /etc/cron.weekly/dehydrated-lite; sudo chmod 755 /etc/cron.weekly/dehydrated-lite
</syntaxhighlight>
</syntaxhighlight>



2023年11月19日 (日) 13:59的最新版本

dehydrated
原作者 Lukas Schauer
开发状态 运行中
编程语言 Shell Script
许可协议 MIT license
网站 dehydrated.de
源代码库 github.com/lukas2511/dehydrated

dehydrated是一套支援ACME协定的软件套件(目前主要是由Let's Encrypt提供服务)。

特色

相较于官方推广的Certbot使用Python撰写,dehydrated仅使用Shell Script与OpenSSLcurl的指令就可以执行,这些指令在大多数系统中都已经提供。

安装

Ubuntu 17.10之后的版本(包含即将出版的18.04)的APT内有dehydrated[1]可以装,但因为我自己包了一包只有执行档的(比较小),可以透过PPA安装:

sudo add-apt-repository -y ppa:gslin/dehydrated-lite; sudo apt update; sudo apt install -y dehydrated-lite

另外也可以直接去官方网站上下载档案,仅需下载dehydrated档案。我建议把这个档案放到/usr/sbin/下。

基本设定

dehydrated在侦测到/etc/dehydrated/config/usr/local/etc/dehydrated/config时(两个都有时前者优先),会将/etc/dehydrated或是/usr/local/etc当作设定目录,所以我们需要产生/etc/dehydrated/config

另外因为从v0.7.0开始预设会使用secp384r1的凭证,这会导致很多旧一点的浏览器与爬虫无法使用,所以指定KEY_ALGO=rsa保持相容性:

sudo mkdir -p /etc/dehydrated /var/www/dehydrated
echo "KEY_ALGO=rsa" | sudo tee /etc/dehydrated/config

进阶设定

这边的设定都是选择性设定,进阶使用者可以修改dehydrated预设值,对安全性与效能的参数进行调整。

config内可以设定开启凭证内标示一定要开OCSP Stapling:

OCSP_MUST_STAPLE=yes

也可以设定KEYSIZE,预设是4096,可以改成2048:

KEYSIZE=2048

另外也可以指定使用ZeroSSL的CA,其中的EAB资讯xy可以在注册ZeroSSL后从网页界面上拿到:

CA=zerossl
EAB_HMAC_KEY=x
EAB_KID=y

域名设定

认证可以透过http-01或是dns-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的认证一定要有带有一个主域名(没有*),要注意Wildcard凭证无法使用http-01的验证过程取得,只能透过dns-01取得(参考后面怎么设定dns-01的认证):

cd /etc/dehydrated
echo 'gslin.org *.gslin.org' | sudo tee -a domains.txt

认证设定

Domain-validated certificate(即DV,非Wildcard的)的可以用http-01或是dns-01的方式认证。Wildcard的只能使用dns-01的方式认证。

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/;
    }
}

Apache的会是这样(放到/etc/apache2/conf-available/dehydrated.conf内,再用a2enconf dehydrated启用):

Alias /.well-known/acme-challenge /var/www/dehydrated
<Directory /var/www/dehydrated>
    Options None
    AllowOverride None
    Require all granted
</Directory>

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 install -g root -m 0755 -o root dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh

执行

第一次需要同意条款:

sudo dehydrated --register --accept-terms

之后就可以用-c自动更新:

sudo dehydrated -c

如果是使用dns-01(像是Wildcard),可能需要在环境变数里提供对应的API token(给lexicon使用):

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 ) > /tmp/dehydrated-lite.log-$(date -u +%Y%m%d-%H%M%S) 2>&1

或是:

#!/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 ) > /tmp/dehydrated-lite.log-$(date -u +%Y%m%d-%H%M%S) 2>&1

其中:

  • sleep片段是为了避免一堆机器同一个时间连到Let's Encrypt的服务器,造成类似DDoS的效果。
  • sleep后面不使用随机变数而是使用hostnamemd5sum计算是为了随机打散,但又要避免很凑巧一堆机器同时打Let's Encrypt的服务器。

清理

dehydrated因为设计的关系,最快是每两个月才会更新一次(Let's Encrypt发出来的是三个月有效,dehydrated预设只会renew少于一个月有效期的凭证),而金钥与凭证的档案大小一组实际占用也才28K(用最大的4096-bit RSA整套),一台机器跑个一百年也才600组资料,算起来约16.4MB。应该是没有太多清理的需求。

但如果还是想要清掉旧的资料,dehydrated有提供指令可以清:

sudo dehydrated -gcd

也可以考虑包装到/etc/cron.yearly

#!/bin/bash
/usr/sbin/dehydrated -gcd

其他

这边主要是我的个人想法,放在最后避免干扰只是想要学设定方法的读者。

dehydrated的相依性较少,仅需BashOpenSSLcurl,这三个套件在蛮多Linux操作系统内已经内建,这对于自动化环境带来的负担会比较少(指的是Puppet或是Chef这类工具),同时也避免了套件版本互相影响的问题。

目前比较大的问题在于申请Wildcard certificate时,因为需要透过dns-01申请,而这常常会用到lexicon(因为其他使用Shell Script的DNS操作软件支援度比较低)。但lexicon使用Python撰写而引用了大量套件,这违背了使用dehydrated的本意(轻量)。

快速安装

这边是设定在更新后重启nginx

sudo add-apt-repository -y ppa:gslin/dehydrated-lite; sudo apt update; sudo apt install -y cron dehydrated-lite; sudo apt clean; sudo mkdir -p /etc/dehydrated /var/www/dehydrated; echo -e "KEY_ALGO=rsa\nKEYSIZE=2048" | sudo tee /etc/dehydrated/config; sudo dehydrated --register --accept-terms; echo -e '#!/bin/bash\nexport PATH=/usr/sbin:/usr/bin:/bin:"${PATH}"\nsleep $(expr $(printf "%d" "0x$(hostname | md5sum | cut -c 1-8)") % 86400); dehydrated -c && ( service nginx reload ) > /tmp/dehydrated-lite.log-$(date -u +%Y%m%d-%H%M%S) 2>&1' | sudo tee /etc/cron.weekly/dehydrated-lite; sudo chmod 755 /etc/cron.weekly/dehydrated-lite

参考资料

外部链接