HTTPS 簡介及使用官方工具 Certbot 配置 SSL 安全證書詳細教程

Homepage » 教程 » HTTPS 簡介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全證書詳細教程
HTTPS 簡介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全證書詳細教程
POST TAGS
SHARE THIS
PRETTY POSTS
BY 聞其詳 - 十一月, 13TH 2016
本文內容較長,因爲涵蓋背景知識、基本概念和完整的實操過程,如果一步步照着做的話,應該就可以一次配置成功。不想要了解背景知識的同學可以直接跳到實操過程,六步即可使用 Let’s Encrypt 官方工具 Certbot 配置 SSL 安全證書。

♦背景知識
已經瞭解過的同學或計算機相關專業的同學直接略過,跳到第三節。
1、http 和 https 是什麼?
簡單來說,http 是一個傳輸網頁內容的協議,比如你看到的 http 開頭的網站 http://www.163.com,其網頁上的文字、圖片、 CSS 、 JS 等文件都是通過 http 協議傳輸到我們的瀏覽器,然後被我們看到。
而 https 可以理解爲“ HTTP over SSL/TLS ”,好端端的 http 爲什麼需要“ over SSL/TLS ”呢,因爲 http 是明文傳輸的,通過 http 協議傳輸的內容很容易被偷看和篡改,爲了安全(你肯定不想被人偷看或者篡改網頁內容吧,比如網站銀行密碼什麼的。)就爲 http 協議再加上了一層 SSL/TLS 安全協議,所以就有了 https 。
2、SSL/TLS 是什麼?
“ HTTP over SSL/TLS ”字面意思就是帶“安全套接層”的 http 協議,內心純潔的同學也可以理解爲“帶安全套的 http ”,因爲帶了安全套,所以當然會比較安全(/(ㄒoㄒ)/~~)。其中 SSL 是“ Secure Sockets Layer ” 的縮寫,是“安全套接層”的意思。 TLS 是 “Transport Layer Security” 的縮寫,是 ” 傳輸層安全協議 ” 的意思。 SSL 和 TLS 是同一個東西的不同階段,理解爲同一個東西也行,都是安全協議就對了。
3、爲什麼要部署 https?
說到底,就是 https 更安全。甚至爲了安全,一個專業可靠的網站, https 是必須的。 Firefox 和 Chrome 都計劃將沒有配置 SSL 加密的 http 網站標記爲不安全(貌似 Firefox 50 已經這麼幹了),目前它們也正在聯合其他相關的基金會與公司推動整個互聯網 https 化,現在大家訪問的一些主要的網站。如 Google 多年前就已經全部啓用 https ,國內的淘寶、搜狗、知乎、百度等等也全面 https 了。甚至 Google 的搜索結果也正在給予 https 的網站更高的排名和優先收錄權。
4、怎麼部署 https 呢?
你只需要有一張被信任的 CA ( Certificate Authority )也就是證書授權中心頒發的 SSL 安全證書,並且將它部署到你的網站服務器上。一旦部署成功後,當用戶訪問你的網站時,瀏覽器會在顯示的網址前加一把小綠鎖,表明這個網站是安全的,當然同時你也會看到網址前的前綴變成了 https ,不再是 http 了。
5、怎麼獲得 SSL 安全證書呢?
理論上,我們自己也可以簽發 SSL 安全證書,但是我們自己簽發的安全證書不會被主流的瀏覽器信任,所以我們需要被信任的證書授權中心( CA )簽發的安全證書。而一般的 SSL 安全證書籤發服務都比較貴,比如 Godaddy 、 GlobalSign 等機構簽發的證書一般都需要20美金一年甚至更貴,不過爲了加快推廣 https 的普及, EEF 電子前哨基金會、 Mozilla 基金會和美國密歇根大學成立了一個公益組織叫 ISRG ( Internet Security Research Group ),這個組織從 2015 年開始推出了 Let’s Encrypt 免費證書。這個免費證書不僅免費,而且還相當好用,所以我們就可以利用 Let’s Encrypt 提供的免費證書部署 https 了。那麼怎麼獲得 Let’s Encrypt 安全證書,並且將它部署在自己的網站服務器上呢?這就是這篇文章要講的內容了。
注:對 https  、數字證書及 CA 的工作原理感興趣的同學可以閱讀編程隨想的系列文章
♦ Let’s Encrypt 及 Certbot 簡介
前面已經介紹過, Let’s Encrypt 是 一個叫 ISRG ( Internet Security Research Group ,互聯網安全研究小組)的組織推出的免費安全證書計劃。參與這個計劃的組織和公司可以說是互聯網頂頂重要的先驅,除了前文提到的三個牛氣哄哄的發起單位外,後來又有思科(全球網絡設備製造商執牛耳者)、 Akamai 加入,甚至連 Linux 基金會也加入了合作,這些大牌組織的加入保證了這個項目的可信度和可持續性。
儘管項目本身以及有該項目簽發的證書很可信,但一開始 Let’s Encrypt 的安全證書配置起來比較麻煩,需要手動獲取及部署。存在一定的門檻,沒有一些技術底子可能比較難搞定。然後有一些網友就自己做了一些腳本來優化和簡化部署過程。其中有一個網友 xdtianyu 做了一個可以快速獲取及更新證書的 letsencrypt.sh 腳本被廣泛使用,地址如下:
1 https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
首先要感謝 xdtianyu 同學的努力付出。我之前用的也是這個腳本,不知道是不是姿勢不對,雖然順利地按照流程裝上了,但用 SSLlabs 檢測我配的網站還是不太安全,在很多瀏覽器上都被標註爲“不安全”。當時因爲忙也沒有太多時間折騰和細究,不過後來 ISRG 的發起者 EFF (電子前哨基金會)爲 Let’s Encrypt 項目發佈了一個官方的客戶端 Certbot ,利用它可以完全自動化的獲取、部署和更新安全證書。這真是非常容易、方便呀,所以我們就可以直接使用官方客戶端,不需要再使用第三方的工具了。雖然第三方工具也可以使用,但是官方工具更權威,風險也更小,而且遇到問題也更容易解決,畢竟有官方的支持。何況 Certbot 確實非常方便,也比所有的第三方工具都更方便,何樂而不用呢?
♦官方客戶端 Certbot 使用方法
Certbot 的官方網站是 https://certbot.eff.org/ ,打開這個鏈接選擇自己使用的 web server 和操作系統,EFF 官方會給出詳細的使用方法,如下圖,不過我覺得這樣還是太複雜,太麻煩,所以建議讀者朋友可以不用看這個網站,按照我的方法走一遍即可。我自己的個人網站( https://wenqixiang.com )和本站( https://linuxstory.org )都是按此方法配置,以下以本網站域名( linuxstory.org )舉例。
假定運行環境:Debian 8.0 64 位(本教程同樣適用於 Debian 、 Ubuntu 、 CentOS 、 Arch Linux 、), Web 服務器是 Nginx 1.10 ,當前工作目錄爲 /home/linuxstory 家目錄。如果是從零開始配置服務器,推薦使用 Debian 8 + lnmp 作爲網站環境。
1、獲取 Certbot 客戶端
1
2
3
wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
./certbot-auto --help
2、配置 nginx 、驗證域名所有權
在虛擬主機配置文件( /usr/local/nginx/conf/vhost/linuxstory.org.conf )中添加如下內容,這一步是爲了通過 Let’s Encrypt 的驗證,驗證 linuxstory.org 這個域名是屬於我的管理之下。(具體解釋可見下一章“一些補充說明”的“ certbot 的兩種工作方式”)
1
2
3
4
5
6
7
8
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /home/wwwroot/linuxstory.org/;
}

location = /.well-known/acme-challenge/ {
return 404;
}
3、重載 nginx
配置好 Nginx 配置文件,重載使修改生效(如果是其他系統 nginx 重載方法可能不同)
1 sudo nginx -s reload
4、生成證書
1 ./certbot-auto certonly --webroot -w /home/wwwroot/linuxstory.org -d linuxstory.org
中間會有一些自動運行及安裝的軟件,不用管,讓其自動運行就好,有一步要求輸入郵箱地址的提示,照着輸入自己的郵箱即可,順利完成的話,屏幕上會有提示信息。
此處有坑!如果順利執行請直接跳到第五步,我在自己的服務器上執行多次都提示
1 connection :: The server could not connect to the client for DV :: DNS query timed out
發現問題出在 DNS 服務器上,我用的是 DNSpod ,無法通過驗證,最後是將域名的 DNS 服務器臨時換成 Godaddy 的才解決問題,通過驗證,然後再換回原來的 DNSpod 。
證書生成成功後,會有 Congratulations 的提示,並告訴我們證書放在 /etc/letsencrypt/live 這個位置
1
2
3
4
5
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/linuxstory.org/fullchain.pem. Your cert
will expire on 2017-02-011. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
5、配置 Nginx(修改 /usr/local/nginx/conf/vhost/linuxstory.org.conf),使用 SSL 證書
1
2
3
4
5
6
7
listen 443 ssl;
server_name linuxstory.org www.linuxstory.org;
index index.html index.htm index.php;
root /home/wwwroot/linuxstory.org;

ssl_certificate /etc/letsencrypt/live/linuxstory.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/linuxstory.org/privkey.pem;
上面那一段是配置了 https 的訪問,我們再添加一段 http 的自動訪問跳轉,將所有通過 http://www.linuxstory.org 的訪問請求自動重定向到 https://linuxstory.org
1
2
3
4
5
server {
listen 80;
server_name linuxstory.org www.linuxstory.org;
return 301 https://$server_name$request_uri;
}
6、重載 nginx,大功告成,此時打開網站就可以顯示綠色小鎖了
1 sudo nginx -s reload
♦後續工作
出於安全策略, Let’s Encrypt 簽發的證書有效期只有 90 天,所以需要每隔三個月就要更新一次安全證書,雖然有點麻煩,但是爲了網絡安全,這是值得的也是應該的。好在 Certbot 也提供了很方便的更新方法。
1、測試一下更新,這一步沒有在真的更新,只是在調用 Certbot 進行測試
1 ./certbot-auto renew --dry-run
如果出現類似的結果,就說明測試成功了(總之有 Congratulations 的字眼)
1
2
3
4
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/linuxstory.org/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
2、手動更新的方法
1 ./certbot-auto renew -v
3、自動更新的方法
1 ./certbot-auto renew --quiet --no-self-upgrade
♦一些補充說明解釋
1、certbot-auto 和 certbot
certbot-auto 和 certbot 本質上是完全一樣的;不同之處在於運行 certbot-auto 會自動安裝它自己所需要的一些依賴,並且自動更新客戶端工具。因此在你使用 certbot-auto 情況下,只需運行在當前目錄執行即可
1 ./certbot-auto
2、certbot的兩種工作方式
certbot (實際上是 certbot-auto ) 有兩種方式生成證書:
  • standalone 方式: certbot 會自己運行一個 web server 來進行驗證。如果我們自己的服務器上已經有 web server 正在運行 (比如 Nginx 或 Apache ),用 standalone 方式的話需要先關掉它,以免衝突。
  • webroot 方式: certbot 會利用既有的 web server,在其 web root目錄下創建隱藏文件, Let’s Encrypt 服務端會通過域名來訪問這些隱藏文件,以確認你的確擁有對應域名的控制權。
本文用的是 webroot 方式,也只推薦 webroot 方式,這也是前文第二步驗證域名所有權在 nginx 虛擬主機配置文件中添加 location 段落內容的原因。
嗚呼,安得 SSL 安全證書千萬張,大庇天下網站安全俱歡顏!希望互聯網早日進入 https 普及化。

linux技術交流羣:295294329


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章