CentOS+Apache 安裝 Let’s Encrypt

今天要介紹的是如何在 CentOS + Apache 上安裝並成功取得 Let’s Encrypt SSL 憑證!對於網站想實裝 SSL 憑證又不曉得該使用哪家提供的憑證,Let’s Encrypt 可以說是好選擇!

1.什麼是 Let’s Encrypt

Let’s Encrypt 是一個免費提供 SSL 憑證的憑證提供機構,由許多大公司與非營利機構贊助,像Google Chrome、Firefox、FB等等。SSL 憑證應該不用多說,為了網站的安全以及排名,這憑證可是很重要的,可以說是必要安裝的一張憑證。

更多的贊助商列表以及 Let’s Encrypt 介紹歡迎直接至 Let’s Encrypt 網站查看。

2.安裝環境介紹(重要)

這部分算是整篇文章裡最重要的一段,因為不同的環境在安裝取得憑證的工具(Certbot)的方式都不太一樣,所以請務必弄清楚自家伺服器的環境。

目前有CentOS6+Apache與CentOS7+Apache,請根據環境看相對應的安裝方式喔。

3.安裝 Certbot

要取得憑證必須要有工具,Let’s Encrypt官方目前針對 SSH 連線與非 SSH 連線皆有提供方法,但最建議是使用 SSH 連線+ Cerobot,本篇文章也是使用 SSH+Cerbot 進行憑證申請。

這邊就要再提一次安裝環境,Certbot 可以在許多環境下安裝,點進 Certbot 官網中下段便會看到I am using[Software] on [System],下拉選單任意組合就是 Certbot 提供安裝的環境,請各位務必針對自家伺服器的環境進行選擇。

在開始安裝前,請先用SSH登入自家主機可以的話請使用 root 帳號,不行就使用同樣權限的帳號,或者等等安裝時發現指令權限不夠,請自動在指令前加上「sudo」,表示以最高權限(root)執行該指令。

  1. mac-user$ ssh root@[server-domain-or-ip]

3.1. CentOS6+Apache

首先是CentOS 6+Apache,根據官網的選擇,某貓的選項會是「I am using Apache on CentOS 6」,下面就會出現安裝方法了。

輸入密碼確定登入伺服器後,可以開始安裝 Cerbot 。

  1. [root@centos6 ~ ]# wget https://dl.eff.org/certbot-auto
  2. [root@centos6 ~ ]# chmod a+x certbot-auto

在看到這篇文章前如果有查看其他安裝教學的話,可能會看到安裝使用的是 certbot 而非certbot-auto ,其實這是差不多的東西,只是 certbot-auto 會自動安裝最新版,且會自動安裝 certbot 需要的其他依賴,不會發生裝了結果有依賴沒裝不能用的囧況。

3.2. CentOS7+Apache

根據官網的選擇,這邊的選項會是「I am using Apache on CentOS/RHEL 7」。選擇完後根據下面的方法安裝。

使用SSH登入主機後,開始安裝certbot。

  1. [root@centos7 ~ ]# yum install certbot-apache

(゚∀。) 阿咧,奇怪,我的紀錄怎麼跟官方的不一樣咧。

我的紀錄就是那樣裝,用yum安裝真的很方便,只是要記得先裝yum。

官方的裝法是這樣:

  1. [root@centos7 ~ ]# yum install python2-certbot-apache

其實也是很方便,安全一點就照官方的裝法吧。

4.憑證取得前

CentOs6的話,正式取得憑證前有兩件事要做,第一件是確認剛剛安裝的certbot-auto在哪,通常會在/root/底下,完整路徑為/root/certbot-auto

這個路徑很重要,CentOS6 等等取得憑證會需要(當然也可以 cd 到/root/就不用打完整路徑了),CentOS7則不用確定這個,畢竟是直接安裝,而不像CentOS6那樣只是下載執行檔,進行安裝前還得修改執行檔權限。

第二件是確認是否有安裝 EPEL repository(因為更新憑證需要 python,而在測試環境是否支援自動更新時,certbot-auto 的測試程式會自動安裝 python):

  1. [root@centos ~ ]# yum list installed | grep epel
  2. epel-release.noarch

如果有出現epel-release.noarch就表示有安裝,沒有請安裝:

  1. [root@centos ~ ]# yum install epel-release

5.取得憑證

一切準備就緒,來取得憑證吧!2018年3月 Let’s Encrypt 提供了新的憑證:wildcard certificate,總之叫他通用憑證,是張很好用的憑證!加上本來就提供的憑證,目前 Let’s Encrypt 提供兩種憑證:域名憑證與通用憑證。

5.1. 域名憑證

域名憑證採域名(domain)針對制,憑證支援申請的域名,不在申請域名內一律不支援。比較好理解(就是一直記不住域名的定義是啥的,像某貓),就是「這張憑證是針對有申請的網址ㄛ,沒申請的不能用ㄛ」這樣。

  1. CentOS6:
  2. [root@centos6 ~ ]# /root/certbot-auto --apache certonly --cert-name exam.com -d exam.com
  3. CentOS7:
  4. [root@centos7 ~ ]# certbot --apache certonly --cert-name exam.com -d exam.com
  5. 如果上一行安裝失敗,改用:
  6. [root@centos7 ~ ]# certbot --webroot certonly --webroot-path=/var/www/path-to-folder/ --cert-name exam.com -d exam.com,www.exam.com

就範例來說,這個指令表示,我要求一張叫做「exam.com」的憑證,這張憑證支援域名「exam.com」。

那如果要支援複數子網域(subdomain)不同的域名呢?可以!-d 這個參數後面的網域用半形逗號隔開即可。

  1. -d exam.com,www.exam.com
首要參數
--apache
Software 是 Apache 的話記得加這個
--webroot
表示改用網站資料夾路徑當認證,跟上一個的apache只能二擇一
選擇性必要參數
--webroot-path
如果使用首要參數使用webroot的話,就必須加上這個,後面加上網站資料夾的絕對路徑
其他參數
certonly
如果想要手動修改 conf 檔(ssl.conf)的話請加上這個。不加的話,在取得憑證的同時,certbot 會自動修改必要的 conf 檔案與啟動 mod_ssl(如果預設沒啟動的話)
--cert-name
後面接的字串為此張憑證的名稱
-d:或是用 --domains
後面接的字串為此張憑證適用的域名,複數域名用半型逗號「,」隔開即可。

確定後會出現幾個問題,輸入對應回答即可:

  1. 要求輸入憑證快過期時的通知信箱。Let’s Encrypt 提供的憑證只有三個月期限,到期時需要手動延期(或是說續約?),當然有方法自動續約,這點等等會說明。
  2. 要求閱讀服務條款(Terms of Service),a 同意。
  3. 詢問是否願意分享 email 給 EFF(Electronic Frontier Foundation)使用,會寄送關於 EFF 相關資訊信件,y 願意,n 不願意。

都確定後便會取得憑證,接著顯示取得的憑證cert.pem、中繼檔案chain.pem與 keyprivate.pem,位置通常會在/etc/letsencrypt/live/$domain/底下,$domain為憑證名稱。

到這邊域名憑證取得部分就完成啦!

5.2. 通用憑證

這是 Let’s Encrypt 在2018年3月新推出的憑證,是個超好用的憑證!

通用憑證支援「*.website.com」域名,只要申請一張憑證,無論前方的「*」(prefixes)是什麼,一張憑證用到底!如果就之前的域名憑證的話,只要不在申請域名內,就算星號後面的網址長得一模一樣,域名憑證還是不支援的喔。

目前某貓只有在 CentOS7+Apache 的環境上安裝過通用憑證,所以以下的安裝資訊都是 CentOS7+Apache 的喔,請務必確認好自家環境。

5.2.1. 升級 certbot

在申請通用憑證前,要先確認主機上的 certbot 是否支援 ACMEv2,要支援 ACMEv2 的話,certbot 版本需大於等於 0.22.0,可以用 yum 檢查:

  1. [root@centos ~ ]# yum list installed | grep certbot

check-certbot-version
[圖一]檢查certbot版本
可以看到某貓已經將 certbot 升級至 0.24.0,而如果還沒升級的,可以使用 yum 針對特定 package 進行升級:

  1. [root@centos ~ ]# yum update certbot

這樣就會只升級 certbot 囉。

5.2.2. 申請通用憑證

好,那麼升級完畢,可以來安裝通用憑證啦!這次要安裝的域名為「*.website.com」與「website.com」兩個,安裝方法如下:

  1. [root@centos ~ ]# certbot --manual certonly --preferred-challenges dns --cert-name siteWildcardCer -d *.website.com,website.com --server https://acme-v02.api.letsencrypt.org/directory
參數說明
--manual
如果安裝憑證在主機上,而非目標的 webserver,或想要自己驗證 domain 的話,可以使用這個 plugin。manual plugin 支援三種參數:dns、https 和 tls-sni,三選一。
子參數說明
dns
會要求在 DNS 供應商那放置一個「 TXT DNS record」,內容是關於憑證與域名。某貓就是選擇這個方法,詳細等等會說。
https
會要求放一個檔案在網站跟目錄的/.well-known/acme-challenge/資料夾底下(資料夾要自己創),其實就跟 webroot plugin 一樣,只是 webroot plugin 會自動完成這一步,但 https 要手動完成。
tls-sni
tls-sni認證之前出了些問題,官方是建議使用 https 或是 dns 認證,所以這個某貓就不解說了,好吧某貓英文爛也是一點……幫哭Q_Q
--preferred-challenges
後面接 manual 的參數,三選一。
--cert-name
後頭接憑證名稱,不一定要跟網址一樣。
-d:或是 --domains
後接域名。
--server
certbot 預設是使用 ACMEv1,因為通用憑證需使用 ACMEv2,所以這邊要額外加上設定。

以上都輸入後,會進入申請程序,這邊因為是使用 dns 認證,所以會有一個部分跟域名憑證不同,就是「TXT DNS record」。

申請流程如下:要求輸入憑證過期時的通知信箱->詢問是否接受紀錄此申請IP->出現兩條 DNS TXT(這邊是重點):

  1. -------------------------------------------------------------------------------
  2. Please deploy a DNS TXT record under the name
  3. _acme-challenge.site.com with the following value:
  4. <value1>
  5. Before continuing, verify the record is deployed.
  6. -------------------------------------------------------------------------------
  7. 這邊可以按確定,會出現第二條
  8. -------------------------------------------------------------------------------
  9. Please deploy a DNS TXT record under the name
  10. _acme-challenge.site.com with the following value:
  11. <value2>
  12. Before continuing, verify the record is deployed.
  13. -------------------------------------------------------------------------------
  14. 這邊先不要按確定喔

這邊先別按確定,複製value1value2,至網址的提供商,找到 DNS 設定頁面,新增兩條:

  1. 第一條:
  2. Host Name:_acme-challenge
  3. Record Type: TXT
  4. Address: value1
  5. 第二條:
  6. Host Name:_acme-challenge
  7. Record Type: TXT
  8. Address: value2

儲存,等一到五分鐘,期間剛剛申請憑證的終端機別按任何按鍵(預防 DNS TXT 還沒生效就繼續申請憑證),也別關閉。可以開另一個終端機登入伺服器,輸入:

  1. [root@centos ~ ]# host -t txt _acme-challenge.site.com
  2. _acme-challenge.site.com descriptive text "<value1>"
  3. _acme-challenge.site.com descriptive text "<value2>"

如果像範例出現下面那兩行,就表示 DNS TXT 生效了!生效的話就可以繼續申請囉(可以按下確定惹)。

申請成功後,畫面上就會出現憑證等相關檔案的放置位置囉。

6.安裝憑證

因為發生了一些事情才發現某貓憑證根本裝錯ww為什麼網站會動www還是說其實這不算錯,只是沒裝完整嗎ww(大草原

發現原因當下某貓只想:(/‵Д′)/~ ╧╧

好,首先憑證申請完後,其實它還需要「安裝」,說是「安裝」,其實也就是將憑證指定給要裝憑證的網站,然後重開apache。要將憑證指定給網站,需要修改ssl.conf這隻檔案。

請 SSH 登入伺服器,移動到/etc/httpd/conf.d/這個資料夾。CentOS7 是在這邊,CentOS6 應該也是。

找到ssl.conf後,開啟它,搭配VirtualHost當範例,請新增這一段:

  1. <VirtualHost ip:443>
  2.     SSLEngine on
  3.     SSLCertificateFile /etc/letsencrypt/live/(憑證名稱)/cert.pem
  4.     SSLCertificateKeyFile /etc/letsencrypt/live/(憑證名稱)/privkey.pem
  5.     SSLCertificateChainFile /etc/letsencrypt/live/(憑證名稱)/chain.pem
  6.     DocumentRoot (網站資料夾絕對路徑)
  7.     ServerName www.website.com
  8.     ServerAlias website.com
  9. </VirtualHost>

其實最重要的,所謂的「安裝」,就是增加SSLEngine開始的四行,這四行有確實對到正確的檔案的話,就沒什麼問題了(會這麼說就表示沒裝好會出問題,絕對會出問題喔所以絕對要裝好)。

檔案修改好後,儲存,檢查syntax是否正確,正確就重開 apache 吧。

  1. 檢查Syntax用:
  2. [root@centos ~ ]# apachectl configtest
  3. 出現 Syntax OK 表示語法皆正常
  4. 重開apache(不影響既有使用者):
  5. [root@centos ~ ]# apachectl graceful

7.自動更新憑證

因為 Let’s Encrypt 提供的憑證只有三個月(確切是90天)的期限,而通常不會只裝一張憑證,比起一張張手動更新,還是設定自動檢查並更新比較好。

certbot 本身就有提供檢查並更新的指令,首先要先檢查自動更新是否可使用:

  1. CentOS6:
  2. [root@centos6 ~ ]# /root/certbot-auto renew --dry-run
  3. CentOS7:
  4. [root@centos7 ~ ]# certbot renew --dry-run

這個的功能就是「假測試」更新功能,測試花的時間會有點長,放置就好,不要以為當掉就把命令取消喔(會這麼說表示某貓做過這種事,千萬別模仿喔w)

如果沒出現錯誤的話,就可以設定 crontab 進行自動更新啦:

  1. CentOS6:
  2. [root@centos6 ~ ]# /root/certbot-auto renew
  3. CentOS7:
  4. [root@centos7 ~ ]# certbot renew

官方的建議是每天凌晨零點與中午十二點進行兩次檢查,如果過期就進行更新:

  1. 0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && /root/certbot-auto renew
  2. CentOS7 就把後面改成 certbot renew 就好

8. 取得所有安裝憑證資訊

當安裝許多憑證後,可以用指令確認目前有幾張憑證、何時安裝與何時到期:

  1. CentOS6:
  2. [root@centos6 ~ ]# /root/certbot-auto certificates
  3. CentOS7:
  4. [root@centos7 ~ ]# certbot certificates

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Powered by WordPress.com.

Up ↑

%d bloggers like this: