CentOS 7 上為網站安裝使用 Let’s Encrypt SSL 憑證

來源:互聯網
上載者:User

安裝 Let’s Encrypt 用戶端

對於 CentOS 發行版來說目前有兩種安裝 Let’s Encrypt 用戶端的方式,一種是從上遊的 EPEL 源直接 yum 安裝,一種是從 Let’s Encrypt 的 GitHub 源下載。水景一頁使用的是下面的第二種方法,從 GitHub 下載。

兩種安裝方式
簡單比較:

YUM 安裝可跟隨系統更新一起更新該安裝包,但是沒有 apache 自動安裝認證的這個組件,安裝過程非常簡單。
git 安裝也很簡單,有 apache 外掛程式,但是需要另行升級更新。並且需要該虛擬機器主機已經配置了 SSL 憑證(自己簽發的也行)。
目前 EPEL 源中已經有了 letsencrypt 安裝包,但是這個安裝包還沒有整合 Apache 組件。這就意味著該用戶端只能擷取認證,還不能自動為網站安裝認證(其實安裝認證也就是修改虛擬機器主機設定檔,將其中的指向安全性憑證的路徑替換為當前擷取的 Let’s Encrypt CA 憑證)。

但是這個 Apache 外掛程式在 Let’s Encrypt 的 GitHub 源裡面已經是有了的。所以我們有兩種方案來操作:一是擷取 GitHub 上的 Let’s Encrypt 用戶端,然後自動擷取和安裝認證;二是從 EPEL 源上直接安裝 letsencrypt 包,僅擷取認證,手工安裝認證。

使用不包含 apache 外掛程式的 letsencrypt 是不太方便的。因為這裡的 letsencrypt 沒有 Apache 外掛程式,只能使用 certonly 或者 standalone 模式擷取認證。而因為擷取的認證需要立即進行驗證,也就是驗證所申請的認證與對應網域名稱的一致性,可是因為不能自動安裝認證,所以需要把 certonly 模式擷取的認證放在對應虛擬機器主機的網站根目錄讓 Let’s Encrypt 驗證伺服器可以訪問到。該目錄在 Linux 上還是個以 . 開頭的隱藏目錄,需要設定 Apache 伺服器以允許訪問隱藏目錄內的內容。看起來似乎也是挺麻煩的。standalone 模式似乎更麻煩,可能還需要讓虛擬機器主機暫停一下服務。由於當前存在這些問題,所以水景一頁選擇的是使用 GitHub 上的 Let’s Encrypt 用戶端以減少麻煩(內建可執行檔,無須編譯安裝)。

注意:使用用戶端擷取和安裝認證後其會自動極短暫地重啟 Apache 服務以使認證生效!

從 EPEL 安裝 LET’S ENCRYPT

既然是整合好的安裝包,那麼就非常簡單了(其實下一種方法也很簡單,只是沒法通過 YUM 升級)。目前 EPEL 官方源裡面已經整合了 Let’s Encrypt 的安裝包了。如果系統裡使用了 EPEL 的源的話,直接 YUM 安裝即可。不過再安裝一次 EPEL 源也不麻煩。

# yum install epel-release
# yum install letsencrypt
運行,

# letsencrypt --help
可以查看協助。還能看到提示說當前還沒有整合 Apache 外掛程式。這就意味著該用戶端只能擷取認證,還不能自動為網站安裝認證。

可以嘗試使用 apache 組件擷取認證並安裝。執行,

# letsencrypt --apache -d 111cn.net -d www.111cn.net -d test.111cn.net
The requested apache plugin does not appear to be installed

No installers are available on your OS yet; try running "letsencrypt-auto certonly" to get a cert you can install manually
GIT 安裝
安裝伺服器相依元件,因為要用 git 嘛,

# yum install epel-release
# yum install git
然後下載 Let’s Encrypt 用戶端,也就是從 GitHub 上複製該源的所有檔案,

# git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
上面的指令中最後的目錄表示將程式儲存到本地的 /opt/letsencrypt 檔案夾。

如果需要更新用戶端,可以通過下面的指令更新之,

# cd /opt/letsencrypt
# sudo git pull
當然也可以把這個指令加到下面要介紹的自動更新認證的指令碼裡面自動執行。

調整虛擬機器主機設定檔

先不慌著運行用戶端來擷取認證,還有些準備工作要做。使用 apache 自動安裝認證外掛程式有以下前提需要滿足才能成功,

需要該虛擬機器主機已經配置了 SSL 憑證(自己簽發的也行)。如果需要安裝一個自己簽發的認證,可以參考水景一頁上的這篇文章。
需要一個虛擬機器主機單獨一個 Apache 設定檔(.conf 檔案)。
如果像水景一頁一樣沒有使用分離的設定檔,可以按照下面的思路修改設定檔。因為如果伺服器的 SSL 設定檔中有幾個虛擬機器主機,letsencrypt 運行時會提示錯誤,

“We were unable to find a vhost with ServerName or Address of 111cn.net
然後讓你選擇有效設定檔。

假設原來的伺服器上虛擬機器主機的設定檔在 vhostssl.conf 檔案中。

建立檔案夾,

mkdir /etc/httpd/sites-available
mkdir /etc/httpd/sites-enabled
將 vhostssl.conf 檔案中每個虛擬機器主機單獨用一個針對 SSL 的設定檔,例如 111cn.net-ssl.conf 和 test.111cn.net-ssl.conf,儲存在 sites-available 檔案夾中。同時刪除 vhostssl.conf 檔案中的對應內容。

然後針對要啟用的主機的設定檔建立軟串連到 sites-enabled 檔案夾中,比如這裡的 111cn.net,

ln -s /etc/httpd/sites-available/111cn.net-ssl.conf /etc/httpd/sites-enabled/111cn.net-ssl.conf
這樣的好處是,如果不需要 111cn.net-ssl.conf 了,直接刪除 sites-enabled 檔案夾中的該項,而 sites-available 中還保留著原始設定檔作為備份。

然後在 vhostssl.conf 中添加下面的一行指令以讓 Apache 啟動時載入 sites-enabled 檔案夾中的所有虛擬機器主機設定檔,

IncludeOptional sites-enabled/*.conf
嗯,如果是 Apache 2.4 之前的版本,應該用,

Include sites-enabled/*.conf
準備好之後就可以進入 letsencrypt 安裝目錄執行認證的擷取和啟用了。

擷取及安裝認證

這裡以 git 安裝的 letsencrypt 為例。

進入 letsencrypt 檔案夾,比如這裡的,

# cd /opt/letsencrypt
運行以下指令,

# ./letsencrypt --apache -d 111cn.net -d www.111cn.net -d test.111cn.net
其中 --apache 表示使用 apache 外掛程式安裝認證;每個需要安裝認證的網域名稱都跟在一個 -d 後面。一般對於主網域名稱,如這裡的 111cn.net,通常我們會將 www.111cn.net 作為其別名同時申請認證。也就是說,至少包含類似於上面的三個網域名稱中的前兩個。當然也可以分開申請認證,比如,

先進行,

# ./letsencrypt --apache -d 111cn.net -d www.111cn.net
完成後再執行,

# ./letsencrypt --apache -d test.111cn.net
第一次運行會自動安裝一些必須的軟體包,包括 python 相關的內容。下載量大約是 20-30MB。之後就會自動擷取認證並安裝。

前面說過,apache 外掛程式目前只能處理一個虛擬機器主機單獨一個設定檔的配置方式。比如這裡提到的三個網域名稱對應兩個虛擬機器主機,111cn.net 和 www.111cn.net 對應主站;test.111cn.net 是另一個獨立的網站。那麼就需要將這兩個虛擬機器主機的 vhost 設定檔分別寫成兩個獨立的檔案,比如 111cn.net-ssl.conf 和 test.111cn.net-ssl.conf。否則會觸發錯誤而導致失敗。錯誤類似於,

The apache plugin is not working; there may be problems with your existing configuration.
The error was: PluginError(('There has been an error in parsing the file (%s): %s', u'/etc/httpd/conf.d/vhost.conf', u'Syntax error'),)
當然,修改虛擬機器主機設定檔後重新運行就可以了。下面接著說正確的路子。

然後緊接著就會提示輸入管理帳號的 email 地址。再就是同意協議。很簡單,除了 email 地址要輸入,剩下的就是一路 Enter 就可以了。

1. email for recovery of account credentials
2. Agrement
申請下來的認證會被儲存在 /etc/letsencrypt/live/ 檔案夾。

定時更新認證

注意:下面是按照 git 安裝的情況來說明的,如果是 yum 安裝,則需要根據情況調整 letsencrypt 指令。

Let’s Encrypt 認證的有效期間是 90 天。但是因為流程是全自動的,所以也不會造成多大麻煩。官方說明中強調所有認證只要過了 60 天就可以換髮新的認證,以留出一些時間用於應付突發情況。

對於自動更新指令碼,官方則建議最好每天運行一次,並且是在一天中隨機的某個時刻,這樣可以避免每次更新時都遇到特定的網路狀況、伺服器擁堵等問題,也就儘可能避免了連續多天無法擷取新認證的情況出現。

自動續期的命令為,

# ./letsencrypt-auto renew
該指令會自動更新伺服器上所有通過該方法擷取的認證。

官方給了一個自動更新指令碼作為例子,下面是針對使用 apache 外掛程式的自動續約指令碼。按照前面的情況,假設安裝位置為 /opt/letsencrypt。

#!/bin/sh
if ! /opt/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
 echo Automated renewal failed:
 cat /var/log/letsencrypt/renew.log
 exit 1
fi
將其儲存為 le-renew.sh 檔案,然後可以通過 cron 定時運行該檔案。

下面是水景一頁使用的自動化指令碼,前面添加了一個自動延遲幾分鐘的指令以避免總在某一個特定時刻更新,並ie如果更新失敗則會自動向指定的郵件地址發送寄件提醒。

#!/bin/sh
# https://111cn.net/
# 自動更新 letsencrypt 用戶端
cd /opt/letsencrypt
git pull

# 延時隨機的分鐘數
sleep $[ ( $RANDOM % 10 ) + 1 ]m
# 自動續簽 Let's Encrypt 認證
cd /opt/letsencrypt
if ! ./letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
 echo Automated renewal failed: | mail -s "LE renew failed" your@email.com
 cat /var/log/letsencrypt/renew.log
 exit 1
fi
設定指令碼自動執行前要自己先直接運行試試看有沒有錯誤,是否達到預期效果。

要設定該指令碼自動運行,比如每天淩晨 5 點鐘執行,則直接以 root 身份修改 crontab 檔案即可,在其最後添加如下一行並儲存即可,

0 5 * * * root sh /path/to/le-renew.sh > /dev/null 2>&1
注意修改到 le-renew.sh 的路徑 :D

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.