給網站添加Let's Encrypt的免費ssl證書


概要

目前很多瀏覽器默認都會標記http訪問的網站為不安全,https部署已經稱為大趨勢,我之前利用業余時間搭建了一個網站,本文就以這個域名為基礎說明如何給網站加上證書。本文使用的操作系統centos、軟件使用nginx、域名是bingimg.cn

什么是 Let's Encrypt

當我們要為網站加上https的訪問時,我們必須申請https證書,證書的申請一般是要去有證書頒發資質的機構(CA)去申請,並且在CA申請的證書一般需要按年繳一定的維護費用,作為個人搭建的學習型網站,我們找到了一個免費的證書頒發組織,Let's Encrypt 就是一個由非營利性組織 互聯網安全研究小組(ISRG)提供的免費、自動化和開放的證書頒發機構(CA)。

簡單的說,借助 Let's Encrypt 頒發的證書可以為我們的網站免費啟用 HTTPS(SSL/TLS) 。Let's Encrypt免費證書的簽發/續簽都是腳本自動化的,官方提供了幾種證書的申請方式方法,點擊此處 快速瀏覽。官方推薦使用 Certbot 客戶端來簽發證書,這種方式可參考文檔自行嘗試,不做評價。我這里直接使用第三方客戶端 acme.sh 申請,據了解這種方式可能是目前 Let's Encrypt 免費證書客戶端最簡單、最智能的 shell 腳本,可以自動發布和續訂 Let's Encrypt 中的免費證書。

為了實現自動化證書管理Let's Encryp制訂了ACME 協議,這個協議是 Let's Encrypt 實現證書簽發流程自動化的根本。目前ACME 協議已正式成為 IETF 標准(RFC 8555)。而acme.sh是一個第三方的腳本工具,其實現了ACME協議的內容。本文我們將使用這個工具來下載,安裝,部署證書。

安裝 acme.sh

首先我們需要將acme.sh工具安裝在在系統上,安裝很簡單,一條命令:

curl https://get.acme.sh | sh

整個安裝過程進行了以下幾步(這是安裝命令自動完成的),了解一下即可:

1. 把 acme.sh 安裝到當前用戶的主目錄$HOME下的.acme.sh文件夾中,即~/.acme.sh/之后所有生成的證書也會放在這個目錄下;

2. 創建了一個指令別名alias acme.sh=~/.acme.sh/acme.sh這樣我們可以通過acme.sh命令方便快速地使用 acme.sh 腳本;

3. 自動創建cronjob定時任務, 每天 0:00 點自動檢測所有的證書,如果快過期了,則會自動更新證書。

安裝命令執行完畢后,執行acme.sh --version確認是否能正常使用acme.sh命令。

https://github.com/Neilpang/acme.sh
v2.7.9

如有版本信息輸出則表示環境正常;如果提示命令未找到,執行source ~/.bashrc命令重載一下環境配置文件。

整個安裝過程不會污染已有的系統任何功能和文件,所有的修改都限制在安裝目錄~/.acme.sh/中,這個腳本被安裝之后,會自動往crontab中添加一條定時任務,我的機器上看到的是下面這條:

48 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

生成證書

據 acme.sh 官方文檔介紹,其實現了 acme 協議支持的所有驗證協議,一般有兩種方式驗證:http 和 dns 驗證。

也就是我們有兩種選擇簽發證書,這里我直接選擇 http 驗證方式,另外一種方式本篇不做介紹,可參考文檔自行嘗試。

簽發證書也很簡單,一條命令:

acme.sh --issue -d bingimg.cn -d www.bingimg.cn -w /data/bingimg/static

簡單解釋下這條命令涉及的幾個參數:

  • --issue是 acme.sh 腳本用來頒發證書的指令;
  • -d是--domain的簡稱,其后面須填寫已備案的域名;
  • -w是--webroot的簡稱,其后面須填寫網站的根目錄

最后一個 -w 參數其實不一定非要是網站的根目錄,只不過指定的這個目錄,隨后acme.sh會將一個文件放到這個目錄下,並且嘗試去訪問這個目錄的這個文件,只要我們配置nginx讓他能夠訪問到就可以,不一定非要是根目錄。不過我經過上面的設置之后,報錯了:

按照提示我們添加一個  --debug 選項之后繼續運行這個命令,以便能看到詳細的報錯信息:

acme.sh --issue -d bingimg.cn -d www.bingimg.cn -w /data/bingimg/static --debug

其提示從網站根目錄訪問他生成的文件路徑訪問不到,因為我們指定的目錄是 /data/bingimg/static 這個並不是網站根目錄,我們只需配置一下nginx讓他能夠訪問到這個文件即可,重新配置nginx之后再次運行上面的acme.sh命令,輸出沒有任何報錯,知道最后成功,最后的輸出如下:

生成好之后如果發現少了一個域名,需要另外在生成一個域名,因為之前已經生成過兩個域名,在生成會報錯,我們可以加上參數 --force 強制重新生成:

acme.sh --issue -d bingimg.cn -d www.bingimg.cn -d pc.bingimg.cn -w /data/bingimg/static --debug --force

可以看出我們加了一個域名  pc.bingimg.cn 但是報錯,看報錯的意思是,沒有找到這個域名的dns記錄,所以我們只需要在域名解析服務那里為這個域名添加一條dns記錄,在重新運行上面的命令就可以了。到此證書下載成功,我們生成的證書可以給 bingimg.cn、www.bingimg.cn、pc.bingimg.cn 這3個域名使用,證書被放在  /root/.acme.sh/bingimg.cn/ 目錄下。另外我們可以通過下面的命令查看和刪除已經生成的證書:

# 查看證書列表
acme.sh --list 

# 刪除證書
acme.sh remove <SAN_Domains>

安裝證書

下面我們就將下載下來的證書安裝到網站上,這里主要說明如何將證書安裝到nginx上,其他 webserver 請參考 acme.sh 文檔自行實踐。廢話不多說,進入本節正題。

 上一小節,生成的證書放在了 /root/.acme.sh/bingimg.cn 目錄,因為這是 acme.sh 腳本的內部使用目錄,而且目錄結構可能會變化,所以我們不能讓 Nginx 的配置文件直接讀取該目錄下的證書文件。

正確的做法就是使用 --installcert 命令,指定目標位置,然后證書文件會被 copy 到相應的位置。一條命令即可解決:

acme.sh  --installcert -d bingimg.cn  \
         --key-file /etc/nginx/certinfo/bingimg.cn.key \
         --fullchain-file /etc/nginx/certinfo/fullchain.cer \
         --reloadcmd "service nginx force-reload"

我們之前生成的證書是在目錄/root/.acme.sh/bingimg.cn 下面,從上面的截圖可以看到,這個目錄下有4個文件,我們在生成證書的時候指定了3個域名,生成的這個證書可以被用在這3個域名上,並且生成證書的時候第一個 -d bingimg.cn 表示的是主域名,后面的是 SAN 域名。如果需要用一個證書保護多個域名的情況,有2種辦法,第一種辦法就是使用SAN證書,就像我們這里生成的證書一樣,可以在生成證書的時候指定多個域名,其中第一個是主域名,后面的是需要被保護的SAN域名,一個SAN證書最多可以保護500個域名,這這些域名之間可以沒有關系,例如 abc.com    222.com 這兩個域名可以被放在一個 SAN 證書中。另一種是使用泛域名證書例如 *.abc.com 的證書可以被用來保護主域名和無數個 abc.com 的二級子域名。安裝之后成功輸出下面內容:

 

這里我將證書放到了/etc/nginx/certinfo/目錄,這個目錄本身沒有,我們需要手工創建,當然也可以自行指定。

 最后一步就是,修改 Nginx 配置文件啟用 ssl,修改完成后需要重啟下 Nginx,這一塊不再詳述。Nginx 配置請參考: 

# 監聽80端口,對所有 http://bingimg.cn 和 http://www.bingimg.cn 的請求都301轉向到 https://www.bingimg.cn 上
server { listen 80; server_name bingimg.cn,www.bingimg.cn; return 301 https://www.bingimg.cn$request_uri; } # 監聽443端口,對所有 https://bingimg.cn 的請求301轉向到 https://www.bingimg.cn 上,這個不用配置ssl證書 server { listen 443 ; server_name bingimg.cn; # 這個跳轉的https的server塊里面不需要配置證書,不知道為什么,當請求上來之后第一步不是建立ssl連接嗎,那就應該需要證書才對吧,然而確實不需要 return 301 https://www.bingimg.cn$request_uri; } # 監聽443端口,接受所有 https://www.bingimg.cn 的請求 server { listen 443 default_server ssl; # 這里必須要加上 default_server server_name www.bingimg.cn; ssl on; ssl_certificate /etc/nginx/certinfo/fullchain.cer; # 這里配置上證書的路徑 ssl_certificate_key /etc/nginx/certinfo/bingimg.cn.key; ..... other config ..... }

我們上面不僅僅對http的請求配置了跳轉到https上,並且對bingimg.cn的https請求也跳轉到www.bingimg.cn的https上,最后所有的請求都會落到www.bingimg.cn域名的https服務上,這樣做首先將所有http請求跳轉成https,其次講所有bingimg.cn的請求跳轉到www.bingimg.cn域名上,因為本質上這是兩個不同的域名,都落到www.bingigm.cn域名上有利於SEO,另外要注意的是,上面的配置中最后一個 server 塊中的listern命令需要添加  default_server 參數,否則跳轉不正常,在nginx的error log 中會找到如下錯誤:

完成證書部署后可以通過如下站點檢測網站的安全級別:

更新證書

目前 Let's Encrypt 的證書有效期是90天,時間到了會自動更新,您無需任何操作。 今后有可能會縮短這個時間, 不過都是自動的,不需要您關心。但是,您也可以手工運行命令強制續簽證書:

acme.sh --renew -d example.com --force

更新 acme.sh 腳本

目前由於 acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步。升級 acme.sh 到最新版:

acme.sh --upgrade

如果您不想手動升級,,可以開啟自動升級:

acme.sh  --upgrade  --auto-upgrade

您也可以隨時關閉自動更新:

acme.sh --upgrade  --auto-upgrade  0

以下關於acme.sh的資料參考:

到此關於部署免費ssl證書到網站的記錄就說完了,可以點擊連接查看效果  必應壁紙|必應美圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM