Let's Encrypt 使用教程,免費的SSL證書,讓你的網站擁抱 HTTPS
這篇文章主要講的就是如何讓自己的網站免費從HTTP升級為HTTPS,使用的是 Lets Encrypt的證書。實際上也就是一個Lets Encrypt 免費證書獲取教程 。
為什麼要上HTTPS,說一個小故事。從前有個網站,後來有個廣告,沒了
作為一個博客,自然不想讓在被別人瀏覽的時候,出現莫名的廣告(運營商劫持)。這時候,HTTPS的價值就體現出來了。 HTTPS的好處還有很多,但單單這一條,就夠我花心思去升級了。 (其實主要目的是提升網站Biger :)
Lets Encrypt 簡介
如果要啟用HTTPS,我們就需要從證書授權機構(以下簡稱CA) 處獲取一個證書,Lets Encrypt 就是一個 CA。我們可以從 Lets Encrypt 獲得網站域名的免費的證書。這篇文章也主要講的是通過 Lets Encrypt + Nginx 來讓網站升級到HTTPS。
Certbot 簡介
Certbot 是Lets Encrypt官方推薦的獲取證書的客戶端,可以幫我們獲取免費的Lets Encrypt 證書。Certbot 是支持所有 Unix 內核的操作系統的,個人博客的伺服器系統是CentOS 7,這篇教程也是通過在個人博客上啟用HTTPS的基礎上完成的。
獲取免費證書
- 安裝Certbot客戶端
yum install certbotn
- 獲取證書
$ certbot certonly --webroot -w /var/www/example -d example.com -d www.example.comn
這個命令會為 http://example.com 和 http://www.example.com 這兩個域名生成一個證書,使用 --webroot 模式會在 /var/www/example 中創建 .well-known 文件夾,這個文件夾裡面包含了一些驗證文件,certbot 會通過訪問 http://example.com/.well-known/acme-challenge 來驗證你的域名是否綁定的這個伺服器。這個命令在大多數情況下都可以滿足需求,
但是有些時候我們的一些服務並沒有根目錄,例如一些微服務,這時候使用 --webroot 就走不通了。certbot 還有另外一種模式 --standalone , 這種模式不需要指定網站根目錄,他會自動啟用伺服器的443埠,來驗證域名的歸屬。我們有其他服務(例如nginx)佔用了443埠,就必須先停止這些服務,在證書生成完畢後,再啟用。
certbot certonly --standalone -d example.com -d www.example.comn
證書生成完畢後,我們可以在 /etc/letsencrypt/live/ 目錄下看到對應域名的文件夾,裡面存放了指向證書的一些快捷方式。
這時候我們的第一生成證書已經完成了,接下來就是配置我們的web伺服器,啟用HTTPS。
Nginx 配置啟用 HTTPS
博客系統使用的是Nginx 伺服器來轉發請求,這裡貼一下我的Nginx配置。
server {n server_name diamondfsd.com www.diamondfsd.com;n listen 443;n ssl on;n ssl_certificate /etc/letsencrypt/live/diamondfsd.com/fullchain.pem;n ssl_certificate_key /etc/letsencrypt/live/diamondfsd.com/privkey.pem;nn location / {n proxy_pass http://127.0.0.1:3999;n proxy_http_version 1.1;n proxy_set_header X_FORWARDED_PROTO https;n proxy_set_header X-Real-IP $remote_addr;n proxy_set_header X-Forwarded-For $remote_addr;n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;n proxy_set_header Host $host;n }n }n server {n server_name api.diamondfsd.com;n listen 443;n ssl on;n ssl_certificate /etc/letsencrypt/live/api.diamondfsd.com/fullchain.pem;n ssl_certificate_key /etc/letsencrypt/live/api.diamondfsd.com/privkey.pem;nn location / {n proxy_pass http://127.0.0.1:4999;n proxy_http_version 1.1;n proxy_set_header X_FORWARDED_PROTO https;n proxy_set_header X-Real-IP $remote_addr;n proxy_set_header X-Forwarded-For $remote_addr;n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;n proxy_set_header Host $host;nn }n }n
主要是監聽 443 埠,啟用 SSL,並配置 SSL 的證書路徑(公鑰,私鑰的路徑)。
通過這些配置 我們就已經成功的完成了 Https 的啟用。
現在打開我的博客 村長日記 就可以看到標有 安全 的字樣。自動更新 SSL 證書
配置完這些過後,我們的工作還沒有完成。 Lets Encrypt 提供的證書只有90天的有效期,我們必須在證書到期之前,重新獲取這些證書,certbot 給我們提供了一個很方便的命令,那就是 certbot renew。
通過這個命令,他會自動檢查系統內的證書,並且自動更新這些證書。我們可以運行這個命令測試一下certbot renew --dry-run n
我在運行的時候出現了這個錯誤
這是因為我的http://api.diamondfsd.com生成證書的時候使用的是 --standalone 模式,驗證域名的時候,需要啟用443埠,這個錯誤的意思就是要啟用的埠已經被佔用了。 這時候我必須把nginx先關掉,才可以成功。果然,我先運行 service nginx stop 運行這個命令,就沒有報錯了,所有的證書都刷新成功。Attempting to renew cert from /etc/letsencrypt/renewal/api.diamondfsd.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
證書是90天才過期,我們只需要在過期之前執行更新操作就可以了。 這件事情就可以直接交給定時任務來完成。linux 系統上有 cron 可以來搞定這件事情。
我新建了一個文件 certbot-auto-renew-cron, 這個是一個 cron 計劃,這段內容的意思就是 每隔 兩個月的 凌晨 2:15 執行 更新操作。15 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"n
--pre-hook 這個參數表示執行更新操作之前要做的事情,因為我有 --standalone 模式的證書,所以需要 停止 nginx 服務,解除埠佔用。
--post-hook 這個參數表示執行更新操作完成後要做的事情,這裡就恢復 nginx 服務的啟用最後我們用 crontab 來啟動這個定時任務
crontab certbot-auto-renew-cronn
至此,整個網站升級到HTTPS就完成了。 總結一下我們需要做什麼
- 獲取Lets Encrypt 免費證書
- 配置Nginx開啟HTTPS
- 定時刷新證書
鳴謝 Lets Encrypt 組織以及所有該組織的貢獻者支持者 為我們提供 免費的安全證書。
參考: Certbot centosrhel7-nginx
參考: Lets Encrypt getting-startd參考: Archlinux cron參考: Nginx configuring-https-servers
推薦閱讀:
※理解HTTPS
※為什麼要把網站升級到HTTPS
※浙大博士在阿里:曾想低頭離開,沒想到一干就停不下來……
※酷站推薦 - ssl.do - SSL.DO | SSL證書
※流量劫持背後:Google 在用「看不見」的方式保護你的隱私安全