如果你的 linux 系統剛好有提供 dehydrated 包,那你就可以略過這篇文章了,如果沒有,那只能手動安裝。
下載 dehydrated,放到 /usr/local/bin 底下
$ wget "https://raw.githubusercontent.com/dehydrated-io/dehydrated/master/dehydrated" $ chmod 744 dehydrated $ mv dehydrated /usr/local/bin/
創造幾個空資料夾,後面用得到。然後啟動 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
編輯 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
編輯你要申請證書的 domain 列表檔 /etc/dehydrated/domains.txt,一行一個 domain,像這樣
www.example.com www.example.org
新增一個 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
- 修改 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
第一次執行 dehydrated 要先註冊,這段只要執行一次,以後就不用了
$ dehydrated --register --accept-terms
申請證書
- “-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!
- 在 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