「Dehydrated」:修訂間差異

出自Gea-Suan Lin's Wiki
跳至導覽 跳至搜尋
本頁面具有訪問限制。如果您看見此訊息,這代表您沒有訪問本頁面的權限。
(未顯示同一使用者於中間所作的 44 次修訂)
行 3: 行 3:
| name          = dehydrated
| name          = dehydrated
| author         = Lukas Schauer
| author         = Lukas Schauer
| released        = {{Start date|2016|04|09}}
| latest preview version = v0.6.1
| latest preview date   = {{Start date and age|2018|03|14}}
| status         = 運行中
| status         = 運行中
| programming language  = [[Shell Script]]
| programming language  = [[Shell Script]]
行 12: 行 9:
| website         = {{URL|https://dehydrated.de/}}
| website         = {{URL|https://dehydrated.de/}}
}}
}}
'''dehydrated'''是一套支援ACME協定的套件(目前 由[[Let's Encrypt]]提供服務)。
'''dehydrated'''是一套支援ACME協定的 軟體 套件(目前 主要是 由[[Let's Encrypt]]提供服務)。


== 特色 ==
== 特色 ==
行 18: 行 15:


== 安裝 ==
== 安裝 ==
 在[[Ubuntu]] 17.10之後的版本(包含即將出版的18.04) 可以直接安裝<code>dehydrated</code><ref>{{Cite web |url=https://packages.ubuntu.com/search?keywords=dehydrated |title=Ubuntu – Package Search Results -- dehydrated |accessdate=2018-04-24}}</ref>, 而在 比較 舊的版本 可以透過 我包裝的[[PPA]]安裝:
 在[[Ubuntu]] 17.10之後的版本(包含即將出版的18.04) 的APT內有<code>dehydrated</code><ref>{{Cite web |url=https://packages.ubuntu.com/search?keywords=dehydrated |title=Ubuntu – Package Search Results -- dehydrated |accessdate=2018-04-24}}</ref> 可以裝 但因為我自己包了一包只有執行檔的( 比較 小), 可以透過[[PPA]]安裝:
<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="bash">
$ sudo add-apt-repository ppa:gslin/dehydrated
sudo add-apt-repository ppa:gslin/dehydrated-lite
$ sudo apt update
sudo apt update
$ sudo apt install dehydrated
sudo apt install dehydrated-lite
</syntaxhighlight>
</syntaxhighlight>


 另外可以直接去官方網站上下載檔案,僅需下載<code>dehydrated</code>檔案。我建議把這個檔案放到<code>/usr/sbin/</code>下。
 另外 可以直接去官方網站上下載檔案,僅需下載<code>dehydrated</code>檔案。我建議把這個檔案放到<code>/usr/sbin/</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>,目前裡面不需要有東西:
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>,目前裡面不需要有東西:
<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="bash">
$ sudo mkdir /etc/dehydrated
sudo mkdir /etc/dehydrated
$ sudo touch /etc/dehydrated/config
sudo touch /etc/dehydrated/config
</syntaxhighlight>
</syntaxhighlight>


== 進階設定 ==
== 進階設定 ==
 這邊的設定都是選擇性設定,進階使用者可以修改dehydrated預設值。
 這邊的設定都是選擇性設定,進階使用者可以修改dehydrated預設值 ,對安全性與效能的參數進行調整


 在<code>config</code>內可以設定開啟憑證內標示一定要開OCSP Stapling:
 在<code>config</code>內可以設定開啟憑證內標示一定要開OCSP Stapling:
行 48: 行 45:


== 域名設定 ==
== 域名設定 ==
=== Domain ===
認證可以透過<code>http-01</code>或是<code>dns-01</code>的協定 。無論是那種 <code>domains.txt</code> 內設定要申請 網域名稱,裡面一行就是一張憑證,一行如果有多個域名就是將這些域名申請到同一個憑 裡:
Domain的 認證可以透過<code>http-01</code>或是<code>dns-01</code>的協定, 這邊 <code>http-01</code>的 方式認


在<code>domains.txt</code>內一行是一張憑證,有幾種方式可以設定。
=== 一張憑證一個域名 ===
 
==== 一張憑證一個域名 ====
 一行放一個域名,將需要申請的網域名稱放到<code>domains.txt</code>內:
 一行放一個域名,將需要申請的網域名稱放到<code>domains.txt</code>內:
<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="bash">
$ cd /etc/dehydrated
cd /etc/dehydrated
$ echo 'blog.gslin.org' | sudo tee -a domains.txt
echo 'blog.gslin.org' | sudo tee -a domains.txt
$ echo 'wiki.gslin.org' | sudo tee -a domains.txt
echo 'wiki.gslin.org' | sudo tee -a domains.txt
</syntaxhighlight>
</syntaxhighlight>


==== 一張憑證多個域名 ====
=== 一張憑證多個域名 ===
 將想要放在同一張憑證的域名放在同一行,一樣是<code>domains.txt</code>內:
 將想要放在同一張憑證的域名放在同一行,一樣是<code>domains.txt</code>內:
<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="bash">
$ cd /etc/dehydrated
cd /etc/dehydrated
$ echo 'blog.gslin.org wiki.gslin.org' | sudo tee -a domains.txt
echo 'blog.gslin.org wiki.gslin.org' | sudo tee -a domains.txt
</syntaxhighlight>
</syntaxhighlight>


=== Wildcard ===
=== Wildcard ===
Wildcard的認證 只能透過<code>dns-01</code>,而且 一定要有一個主域名(沒有<code>*</code>)
Wildcard的認證一定要 有帶 有一個主域名(沒有<code>*</code>):
<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="bash">
$ cd /etc/dehydrated
cd /etc/dehydrated
$ echo 'gslin.org *.gslin.org' | sudo tee -a domains.txt
echo 'gslin.org *.gslin.org' | sudo tee -a domains.txt
</syntaxhighlight>
</syntaxhighlight>


== 認證設定 ==
== 認證設定 ==
Domain-validated certificate(即DV,非Wildcard的)的可以用<code>http-01</code>或是<code>dns-01</code>的方式認證。Wildcard的只能使用<code>dns-01</code>的方式認證。
=== http-01 ===
=== http-01 ===
dehydrated預設會用<code>/var/www/dehydrated</code>作為認證目錄,需要將網頁的<code>/.well-known/acme-challenge/</code>指到這邊。以[[nginx]]的設定會像是這樣:
dehydrated預設會用<code>/var/www/dehydrated/</code>作為認證目錄,需要將網頁的<code>/.well-known/acme-challenge/</code>指到這邊。以[[nginx]]的設定會像是這樣:
<pre>
<pre>
server {
server {
行 87: 行 83:
    }
    }
}
}
</pre>
以[[Apache]]的會是這樣(放到<code>/etc/apache2/conf-available/dehydrated.conf</code>內,再用<code>a2enconf dehydrated</code>啟用):
<pre>
Alias /.well-known/acme-challenge /var/www/dehydrated
<Directory /var/www/dehydrated>
   Options None
   AllowOverride None
   Require all granted
</Directory>
</pre>
</pre>


=== dns-01 ===
=== dns-01 ===
<code>dns-01</code>會需要使用<code>TXT</code> record認證。這邊會使用[[lexicon]],所以系統內需要安裝[[Python]](不適合用pyenv,因為 跑dehydrated 通常使用root權限)。
<code>dns-01</code>會需要使用<code>TXT</code> record認證。這邊會使用[[lexicon]](不適合用pyenv 安裝 ,因為通常使用root權限 跑dehydrated,這會使得環境無法取得 ,這需要另外安裝
 
{{See also|lexicon}}


 這 邊用Python 2說明:
  另外dehydrated需要lexicon的<code>examples/dehydrated.default.sh</code>(將dehydrated的hook命令轉給lexicon使用),所以需要下載 個檔案,複製到<code>/usr/sbin/lexicon-dehydrated.default.sh</code> 以便後續更新:
<syntaxhighlight lang="shell-session">
$ sudo apt install python python-pip
</syntaxhighlight>


然後安裝lexicon:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="shell-session">
cd /tmp
$ sudo pip install dns-lexicon
git clone https://github.com/AnalogJ/lexicon.git
sudo cp lexicon/examples/dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh
</syntaxhighlight>
</syntaxhighlight>


  另外lexicon的<code>examples/dehydrated.default.sh</code> 拿來將dehydrated的hook指令介 給lexicon ,所以需要 下載 這個檔案,複製到<code>/usr/sbin/lexicon-dehydrated.default.sh</code>以便後續更新
  接用[[GitHub]]提供的連結 下載:


<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="bash">
$ cd /tmp
cd /tmp
$ git clone https://github.com/AnalogJ/lexicon.git
curl -LO https://raw.githubusercontent.com/AnalogJ/lexicon/master/examples/dehydrated.default.sh
$ sudo cp lexicon/examples/dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh
sudo install -g root -m 0755 -o root dehydrated.default.sh /usr/sbin/lexicon-dehydrated.default.sh
</syntaxhighlight>
</syntaxhighlight>


行 123: 行 129:
</syntaxhighlight>
</syntaxhighlight>


 如果是使用<code>dns-01</code>(像是Wildcard),需要在環境變數裡提供對應的API token:
 如果是使用<code>dns-01</code>(像是Wildcard), 可能 需要在環境變數裡提供對應的API token (給[[lexicon]]使用)


<syntaxhighlight lang="shell-session">
<syntaxhighlight lang="shell-session">
行 129: 行 135:
</syntaxhighlight>
</syntaxhighlight>


 另外因為lexicon在設定DNS的值之後,預設會停30秒才會跑下一步,會比較慢, 請耐心
 另外因為lexicon在設定DNS的值之後,預設會停30秒才會跑下一步,會比較慢, 需要 一下才會知道結果。
 
== 自動更新 ==
上面提到更新的指令可以放到<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 本意(輕量 )。
上面提到更新 指令可以放到<code>/etc/cron.weekly</code> 內執行 透過傳回值可以判斷是否有更新,然後重跑[[nginx]] 或是[[Postfix]] (以及其他有 服務 )。


== 參考資料 ==
== 參考資料 ==
行 139: 行 172:
== 外部連結 ==
== 外部連結 ==
* {{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-lite PPA for dehydrated (lite) : Gea-Suan Lin]
* [https://github.com/AnalogJ/lexicon AnalogJ/lexicon: Manipulate DNS records on various DNS providers in a standardized way.]


[[Category:軟體]]
[[Category:軟體]]

於 2018年10月28日 (日) 15: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 ppa:gslin/dehydrated-lite
sudo apt update
sudo apt install dehydrated-lite

另外也可以直接去官方網站上下載檔案,僅需下載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

域名設定

認證可以透過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的認證一定要有帶有一個主域名(沒有*):

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 )

或是:

#!/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後面不使用隨機變數而是使用hostnamemd5sum計算是為了隨機打散,但又要避免很湊巧一堆機器同時打Let's Encrypt的伺服器。

其他

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

dehydrated的相依性較少,僅需BashOpenSSLcurl,這三個套件在蠻多Linux作業系統內已經內建,這對於自動化環境帶來的負擔會比較少(指的是Puppet或是Chef這類工具),同時也避免了套件版本互相影響的問題。

目前比較大的問題在於申請Wildcard certificate時,因為需要透過dns-01申請,而這常常會用到lexicon(因為其他使用Shell Script的DNS操作軟體支援度比較低)。但lexicon使用Python撰寫而引用了大量套件,這違背了使用dehydrated的本意(輕量)。

參考資料

外部連結