不透過 apt 手動安裝 dehydrated ( for letsencrypt )

如果你的 linux 系統剛好有提供 dehydrated 包,那你就可以略過這篇文章了,如果沒有,那只能手動安裝。

  1. 下載 dehydrated,放到 /usr/local/bin 底下

    $ wget "https://raw.githubusercontent.com/dehydrated-io/dehydrated/master/dehydrated"
    $ chmod 744 dehydrated
    $ mv dehydrated /usr/local/bin/

  2. 創造幾個空資料夾,後面用得到。然後啟動 apache SSL mode

    $ mkdir -p /etc/dehydrated/  # dehydrated 的 config 放這裡
    $ mkdir -p /var/www/dehydrated/ # 後面跑 http01 challenges 會用到
    $ a2enmod ssl #啟動 apache SSL mode
    $ service apache2 restart #重啟 apache

  3. 編輯 dehydrated 的 config 檔,位置在 /etc/dehydrated/config

  • CONTACT_EMAIL 一定要填你會收信的 email,這樣如果你的憑證發生什麼意外,他才通知得到你。
  • KEYSIZE 建議用到 4096
  • CA 是指目前 letsencrypt 的 API URL,目前是用第二版(acme-v02)。
  • OCSP_MUST_STAPLE 建議設成 yes。

假設你的 CONTACT_EMAIL 是 admin@exmaple.org ,那 /etc/dehydrated/config 應該長這樣。

KEYSIZE="4096"
CONTACT_EMAIL=admin@exmaple.org
CA="https://acme-v02.api.letsencrypt.org/directory"
OCSP_MUST_STAPLE=yes

  1. 編輯你要申請證書的 domain 列表檔 /etc/dehydrated/domains.txt,一行一個 domain,像這樣

    www.example.com
    www.example.org

  2. 新增一個 apapche ssl config 檔,位置放在 (/etc/apache2/sites-available/options-ssl-apache.conf),這個很重要,設得很嚴格,會比較安全,但是比較 latency 的 device 會無法連上你的網站 ( 比如說 android 4.0 以前的手機 ),設定的太鬆,等於沒有防護。 我提供兩個可用的版本,實際得視情形斟酌設置。

    SSLEngine on
    
    SSLProtocol TLSv1.2
    SSLHonorCipherOrder on
    SSLCipherSuite "!ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:!ECDHE-ECDSA-AES128-SHA:!ECDHE-ECDSA-AES256-SHA:!ECDHE-ECDSA-AES128-SHA256:!ECDHE-ECDSA-AES256-SHA384:!ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:!ECDHE-RSA-AES128-SHA:!ECDHE-RSA-AES256-SHA:!ECDHE-RSA-AES128-SHA256:!ECDHE-RSA-AES256-SHA384:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES256-SHA256"
    SSLSessionCacheTimeout 300
    SSLCompression off
    
    SSLStaplingStandardCacheTimeout 172800
    SSLStaplingErrorCacheTimeout 60
    SSLStaplingResponderTimeout 4
    SSLStaplingReturnResponderErrors Off

另一個版本

  1. 修改 apache 的 config 檔

假設你這次要申請 SSL 證書的 domain 是 www.example.com,他的 apache config 檔是在 /etc/apache2/sites-available/www.example.com.conf ( 如果你有多個 domain 需要申請 SSL 證書,你就要逐一新增這段設定 )

  • 新增這段設定這是為了給 dehydrated 進行 http01 challenges 用的
    Alias /.well-known/acme-challenge /var/www/dehydrated
    <Directory /var/www/dehydrated>
        Options None
        AllowOverride None
        Require all granted
    </Directory>

整個 www.example.com.conf 看起來會長像這樣

<VirtualHost *:80>
	ServerName www.example.com
	DocumentRoot /var/www/www.example.com
	ErrorLog ${APACHE_LOG_DIR}/example_error.log
	CustomLog ${APACHE_LOG_DIR}/example_access.log combined
    <Directory /var/www/www.example.com>
        AllowOverride All
        Options -Indexes
        Require all granted
    </Directory>
    # 新增的設定在這裡
    Alias /.well-known/acme-challenge /var/www/dehydrated
    <Directory /var/www/dehydrated>
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    # 新增的設定在這裡
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

修改完記得 reload config 檔

$ apache2ctl -t # 先 check config 檔有沒有語法問題
$ service apache2 reload

  1. 第一次執行 dehydrated 要先註冊,這段只要執行一次,以後就不用了

    $ dehydrated --register --accept-terms

  2. 申請證書

  • “-c” 是 cron 的意思,以後你可以把這段直接加入 crontab,讓他每兩個月跑一次,這樣就不用時間到的時候自己還要手動下指令更新 SSL 證書。
  • 有一個有用的參數 “-f”,是 force 的意思,當你有遇到證書出包的時候,你會需要 -f 重新申請新證書,平常是不到的。

執行看起來會長像這樣

$ dehydrated -c 
# INFO: Using main config file /etc/dehydrated/config
Processing www.example.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting new certificate order from CA...
 + Received 1 authorizations URLs from the CA
 + Handling authorization for www.example.com
 + 1 pending challenge(s)
 + Deploying challenge tokens...
 + Responding to challenge for www.example.com authorization...
 + Challenge is valid!
 + Cleaning challenge tokens...
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!

  1. 在 apache config 當中加入 SSL 的設定 注意的點有兩個
  • 引入的 SSL 區段,要 include 我們之前新增的 ssl config 檔 /etc/apache2/sites-available/options-ssl-apache.conf
  • 申請下來的證書會放在 /etc/dehydrated/certs// 底下,以 www.example.com 網站來說,他就會放在 /etc/dehydrated/certs/www.example.com/ 底下。

整個 www.example.com.conf 看起來會長像這樣

<VirtualHost *:80>
	ServerName www.example.com
	DocumentRoot /var/www/www.example.com
	ErrorLog ${APACHE_LOG_DIR}/example_error.log
	CustomLog ${APACHE_LOG_DIR}/example_access.log combined
    <Directory /var/www/www.example.com>
        AllowOverride All
        Options -Indexes
        Require all granted
    </Directory>
    Alias /.well-known/acme-challenge /var/www/dehydrated
    <Directory /var/www/dehydrated>
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

# 新增的 SSL 設定
<IfModule mod_ssl.c>
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
<VirtualHost *:443>
	ServerName www.example.com
	DocumentRoot /var/www/www.example.com
	ErrorLog ${APACHE_LOG_DIR}/example_error.log
	CustomLog ${APACHE_LOG_DIR}/example_access.log combined
    <Directory /var/www/www.example.com>
        AllowOverride All
        Options -Indexes
        Require all granted
    </Directory>
    Alias /.well-known/acme-challenge /var/www/dehydrated
    <Directory /var/www/dehydrated>
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    
    SSLUseStapling on
    Include /etc/apache2/sites-available/options-ssl-apache.conf
    SSLCertificateFile /etc/dehydrated/certs/www.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/dehydrated/certs/www.example.com/privkey.pem
</VirtualHost>
</IfModule>
# 新增的 SSL 設定
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

新增完重啟 apache ,完成!

$ apache2ctl -t # 先 check config 檔有沒有語法問題
$ service apache2 restart

Share Comments
comments powered by Disqus