Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

Let's Encrypt
post by tommy @ 25 五月, 2016 22:06

以往 SSL 憑證都要花錢買, 當然... 也可以自己用 openssl 來產生, 不過.... 自己做的 rootca 並不會被其他人承認, 常常要自己匯入後才能正常使用. 不過... 這情形在 Let's Encrypt 出現後, 大家都可以申請免費的 SSL 憑證了, 雖然期限只有三個月, 不過.... 只要到期前記得去 renew 就可以一直用下去.

官方的 client 用起來不怎麼簡單.... 通常用 letencrypt.sh 會比較容易. 有人也寫了 letencrypt.sh 的中文說明, 可以參考看看. 要注意的是文章提到的 config.sh 在目前的版本來看, 應該是 config 才對.

我目前只用 nginx, 所以就說一下在 nginix 的作法.

Let's Encrypt 的驗證方法是 http-01 (目前也支援 dns-01, 不然看不太懂, 加上... 申請這個通常是給 http 使用, 所以直接用 http-01 的方式比較快). 這個方式在驗證時, 需要在申請的 domain 下頭的 web server (只能用 port 80, 可以轉址, 但入口只能是標準的 http port 80) 的 /.well-known/acme-challenge/ 目錄下, 產生一個亂數的網址的檔案, 然後 Let's Encrypt 在簽署時會連過來抓取這個檔案, 如果裡頭的內容正確, 就算通過驗證, 就會簽發對應的憑證.

在 nginx 上頭, 可以用 location 指令搭配 alias 來處理:

location /.well-known/acme-challenge/ {
alias /var/www/letsencrypt/;
}

不過... 在我的機器上, 不知那個設定有衝突... 反正上頭的設定不會正常運作. 所以... 我就改成:

location ~ ^/.well-known/acme-challenge/(.*)$ {
alias /var/www/letsencrypt/$1;
}

建議設定好後, 自己在這目錄下建一個 test.txt, 然後連過去抓看看能不能正常抓到. (每個要用的 domain 下的虛擬網站都要能用)

然後就可以把這些 domain name 寫到 letencrypt.sh 所在目錄下的 domains.txt (建議用 domains.txt 處理, 用參數只能一次簽一個 domain name), 內容像是:

teatime.com.tw www.teatime.com.tw blog.teatime.com.tw
abc.com www.abc.com
xzy.org

每行是一個憑證, 同一個憑證可以允許多個網站 (要同一個 domain), letsencrypt.sh 會產生在其目錄下的 certs 子目錄內, 每個憑證一個目錄, 用該行的第一個名稱當目錄名稱.

直接執行 letsencrypt.sh -c 就會可以了 (renew 使用同樣指令, 會檢查是否需要才真的去 renew).

如果一切正常, 會有 cert.pem, chain.pem, fullchain.pem privkey.pem 在每個憑證的目錄下. 通常我們是用 fullchain.pem 與 privkey.pem 就可以.

nginx:

server {
listen 443 ssl http2;
server_name www.teatime.com.tw teatime.com.tw;
 
ssl_certificate /etc/letsencrypt.sh/certs/teatime.com.tw/fullchain.pem;
ssl_certificate_key /etc/letsencrypt.sh/certs/teatime.com.tw/privkey.pem;
}

如果要用 Strong Diffie-Hellman Group, 可以自己用 openssl 產生:

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

然後在 nginx 上頭設定:

server {
listen 443 ssl http2;
server_name www.teatime.com.tw teatime.com.tw;
 
ssl_certificate /etc/letsencrypt.sh/certs/teatime.com.tw/fullchain.pem;
ssl_certificate_key /etc/letsencrypt.sh/certs/teatime.com.tw/privkey.pem;
 
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
}

postfix 也可以用:

smtpd_tls_cert_file = /etc/letsencrypt.sh/certs/teatime.com.tw/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt.sh/certs/teatime.com.tw/privkey.pem
smtpd_use_tls = yes
smtpd_tls_auth_only = no
tls_random_source = dev:/dev/urandom

dovecot 也可以用:

ssl = yes
ssl_cert = </etc/letsencrypt.sh/certs/teatime.com.tw/fullchain.pem
ssl_key = </etc/letsencrypt.sh/certs/teatime.com.tw/privkey.pem

squid 如果有編入 ssl 支援, 要做 http over https 的話, 需要把 privkey.pem 與 fullchain.pem 合併成一個檔案:

cat privkey.pem fullchain.pem > both.pem

然後在 squid.conf 設定:

https_port 8443 cert=/etc/letsencrypt.sh/certs/teatime.com.tw/both.pem

如果是 pure-ftpd 的話... 是可以使用上頭這個 both.pem, 只不過... pure-ftpd 沒有地方指定, 只會抓 /etc/ssl/private/pure-ftpd.pem 這個檔案... 所以.. 直接做一個 symlink 過去就可以.

原則上, 這樣子處理後, 就可以正確使用 Let's Encrypt 的憑證了.

每次憑證是 3 個月, 所以... 可以每個星期執行一次 letencrypt.sh -c 就會在過期前自動 renew 了. 當然... 如果 renew 之後, 上面那些程式並不會自動載入新的憑證, 所以要寫個小 script 去檢查是不是檔案有變, 有的話要去 reload 這些 service (pure-ftpd 只能 restart 才有用).

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 37 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS