「Dehydrated」:修訂間差異
無編輯摘要 |
(→dns-01) |
||
(未顯示同一使用者於中間所作的 26 次修訂) | |||
行 3: | 行 3: | ||
| name = dehydrated | | name = dehydrated | ||
| author = Lukas Schauer | | author = Lukas Schauer | ||
| latest preview version = v0.6.1 | | latest preview version = v0.6.1 | ||
| latest preview date = {{Start date and age|2018|3|14}} | | latest preview date = {{Start date and age|2018|3|14}} | ||
行 12: | 行 11: | ||
| website = {{URL|https://dehydrated.de/}} | | website = {{URL|https://dehydrated.de/}} | ||
}} | }} | ||
'''dehydrated'''是一套支援ACME協定的套件(目前僅由[[Let's Encrypt]]提供服務)。 | '''dehydrated'''是一套支援ACME協定的 軟體 套件(目前僅由[[Let's Encrypt]]提供服務)。 | ||
== 特色 == | == 特色 == | ||
行 35: | 行 34: | ||
== 進階設定 == | == 進階設定 == | ||
這邊的設定都是選擇性設定,進階使用者可以修改dehydrated預設值。 | 這邊的設定都是選擇性設定,進階使用者可以修改dehydrated預設值 ,對安全性與效能的參數進行調整 。 | ||
在<code>config</code>內可以設定開啟憑證內標示一定要開OCSP Stapling: | 在<code>config</code>內可以設定開啟憑證內標示一定要開OCSP Stapling: | ||
行 90: | 行 89: | ||
=== dns-01 === | === dns-01 === | ||
<code>dns-01</code>會需要使用<code>TXT</code> record認證。這邊會使用[[lexicon | <code>dns-01</code>會需要使用<code>TXT</code> record認證。這邊會使用[[lexicon]](不適合用pyenv 安裝 ,因為通常使用root權限 跑dehydrated,這會使得環境無法取得 ) ,這需要另外安裝 。 | ||
這 | {{See also|lexicon}} | ||
< | |||
另外dehydrated需要lexicon的<code>examples/dehydrated.default.sh</code>(將dehydrated的hook命令轉給lexicon使用),所以需要下載 這 個檔案,複製到<code>/usr/sbin/lexicon-dehydrated.default.sh</code> 以便後續更新: | |||
</ | |||
<syntaxhighlight lang="shell-session"> | <syntaxhighlight lang="shell-session"> | ||
$ sudo | $ cd /tmp | ||
$ git clone https://github.com/AnalogJ/lexicon.git | |||
$ sudo cp lexicon/examples/dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh | |||
</syntaxhighlight> | </syntaxhighlight> | ||
或 是 直 接用[[GitHub]]提供的連結 下載: | |||
<syntaxhighlight lang="shell-session"> | <syntaxhighlight lang="shell-session"> | ||
$ cd /tmp | $ cd /tmp | ||
$ | $ curl -LO https://raw.githubusercontent.com/AnalogJ/lexicon/master/examples/dehydrated.default.sh | ||
$ sudo | $ sudo install -g root -m 0755 -o root dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh | ||
</syntaxhighlight> | </syntaxhighlight> | ||
行 131: | 行 130: | ||
另外因為lexicon在設定DNS的值之後,預設會停30秒才會跑下一步,會比較慢,請耐心等待。 | 另外因為lexicon在設定DNS的值之後,預設會停30秒才會跑下一步,會比較慢,請耐心等待。 | ||
== | == 自動更新 == | ||
上面提到更新的指令可以放到<code>/etc/cron.weekly</code>內執行,透過傳回值可以判斷是否有更新,然後重跑[[nginx]]或是[[Postfix]](以及其他有用到的服務)。 | 上面提到更新的指令可以放到<code>/etc/cron.weekly</code>內執行, 並且 透過傳回值可以判斷是否有更新,然後重跑[[nginx]]或是[[Postfix]](以及其他有用到的服務 )。 | ||
像是: | |||
<syntaxhighlight lang="bash"> | |||
#!/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 ) | |||
</syntaxhighlight> | |||
或是: | |||
<syntaxhighlight lang="bash"> | |||
#!/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 ) | |||
</syntaxhighlight> | |||
其中: | |||
* <code>sleep</code>片段是為了同一個時間連到[[Let's Encrypt]]的伺服器造成類似DDoS的效果。 | |||
* <code>sleep</code>後面不使用隨機變數而是使用<code>hostname</code>與<code>md5sum</code>計算是為了隨機打散,但又要避免很湊巧一堆機器同時打Let's Encrypt的伺服器。 | |||
== 其他 == | |||
這邊主要是我的個人想法,放在最後避免干擾只是想要學設定方法的讀者。 | |||
dehydrated的相依性較少,僅需[[Bash]]、[[OpenSSL]]與[[curl]],這三個套件在蠻多[[Linux]]作業系統內已經內建,這對於自動化環境帶來的負擔會比較少(指的是[[Puppet]]或是[[Chef]]這類工具),同時也避免了套件版本互相影響的問題。 | |||
目前比較大的問題在於申請Wildcard certificate時,因為需要透過<code>dns-01</code>申請,而這常常會用到[[lexicon]](因為其他使用Shell Script的DNS操作軟體支援度比較低)。但lexicon使用[[Python]]撰寫而引用了大量套件,這違背了使用dehydrated的本意(輕量 )。 | |||
== 參考資料 == | == 參考資料 == | ||
行 140: | 行 166: | ||
* {{Official|https://dehydrated.de/}} | * {{Official|https://dehydrated.de/}} | ||
* [https://launchpad.net/~gslin/+archive/ubuntu/dehydrated PPA for dehydrated : Gea-Suan Lin] | * [https://launchpad.net/~gslin/+archive/ubuntu/dehydrated PPA for dehydrated : Gea-Suan Lin] | ||
[[Category:軟體]] | [[Category:軟體]] |
於 2018年4月24日 (二) 06:26 的修訂
原作者 | 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 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:
$ 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].