Let's Encrypt 使用教程,免費的SSL證書,讓你的網站擁抱 HTTPS 原 薦

這篇文章主要講的就是如何讓自己的網站免費從HTTP升級爲HTTPS,使用的是 Let's Encrypt的證書。實際上也就是一個Let's Encrypt 免費證書獲取教程 。 爲什麼要上HTTPS,說一個小故事。

從前有個網站,後來有個廣告,沒了

作爲一個博客,自然不想讓在被別人瀏覽的時候,出現莫名的廣告(運營商劫持)。這時候,HTTPS的價值就體現出來了。 HTTPS的好處還有很多,但單單這一條,就夠我花心思去升級了。 (其實主要目的是提升網站Biger :)

Let's Encrypt 簡介

如果要啓用HTTPS,我們就需要從證書授權機構(以下簡稱CA) 處獲取一個證書,Let's Encrypt 就是一個 CA。我們可以從 Let's Encrypt 獲得網站域名的免費的證書。這篇文章也主要講的是通過 Let's Encrypt + Nginx 來讓網站升級到HTTPS。

Certbot 簡介

Certbot 是Let's Encrypt官方推薦的獲取證書的客戶端,可以幫我們獲取免費的Let's Encrypt 證書。Certbot 是支持所有 Unix 內核的操作系統的,個人博客的服務器系統是CentOS 7,這篇教程也是通過在個人博客上啓用HTTPS的基礎上完成的。

獲取免費證書

  1. 安裝Certbot客戶端
yum install certbot
  1. 獲取證書
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com

這個命令會爲 example.com 和 www.example.com 這兩個域名生成一個證書,使用 --webroot 模式會在 /var/www/example 中創建 .well-known 文件夾,這個文件夾裏面包含了一些驗證文件,certbot 會通過訪問 example.com/.well-known/acme-challenge 來驗證你的域名是否綁定的這個服務器。這個命令在大多數情況下都可以滿足需求,

但是有些時候我們的一些服務並沒有根目錄,例如一些微服務,這時候使用 --webroot 就走不通了。certbot 還有另外一種模式 --standalone , 這種模式不需要指定網站根目錄,他會自動啓用服務器的443端口,來驗證域名的歸屬。我們有其他服務(例如nginx)佔用了443端口,就必須先停止這些服務,在證書生成完畢後,再啓用。

certbot certonly --standalone -d example.com -d www.example.com

證書生成完畢後,我們可以在 /etc/letsencrypt/live/ 目錄下看到對應域名的文件夾,裏面存放了指向證書的一些快捷方式。

這時候我們的第一生成證書已經完成了,接下來就是配置我們的web服務器,啓用HTTPS。

Nginx 配置啓用 HTTPS

博客系統使用的是Nginx 服務器來轉發請求,這裏貼一下我的Nginx配置。

    server {
        server_name diamondfsd.com www.diamondfsd.com;
        listen 443;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/diamondfsd.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/diamondfsd.com/privkey.pem;

        location / {
           proxy_pass http://127.0.0.1:3999;
           proxy_http_version 1.1;
           proxy_set_header X_FORWARDED_PROTO https;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;
        }
    }
    server {
        server_name api.diamondfsd.com;
        listen 443;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/api.diamondfsd.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/api.diamondfsd.com/privkey.pem;

        location / {
           proxy_pass http://127.0.0.1:4999;
           proxy_http_version 1.1;
           proxy_set_header X_FORWARDED_PROTO https;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header Host $host;

        }
    }

主要是監聽 443 端口,啓用 SSL,並配置 SSL 的證書路徑(公鑰,私鑰的路徑)。
通過這些配置 我們就已經成功的完成了 Https 的啓用。
現在打開我的博客 https://diamondfsd.com 就可以看到標有 安全 的字樣。

alt

自動更新 SSL 證書

配置完這些過後,我們的工作還沒有完成。 Let's Encrypt 提供的證書只有90天的有效期,我們必須在證書到期之前,重新獲取這些證書,certbot 給我們提供了一個很方便的命令,那就是 certbot renew
通過這個命令,他會自動檢查系統內的證書,並且自動更新這些證書。
我們可以運行這個命令測試一下

certbot renew --dry-run 

我在運行的時候出現了這個錯誤

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.

alt
這是因爲我的api.diamondfsd.com生成證書的時候使用的是 --standalone 模式,驗證域名的時候,需要啓用443端口,這個錯誤的意思就是要啓用的端口已經被佔用了。 這時候我必須把nginx先關掉,纔可以成功。果然,我先運行 service nginx stop 運行這個命令,就沒有報錯了,所有的證書都刷新成功。

證書是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"

--pre-hook 這個參數表示執行更新操作之前要做的事情,因爲我有 --standalone 模式的證書,所以需要 停止 nginx 服務,解除端口占用。
--post-hook 這個參數表示執行更新操作完成後要做的事情,這裏就恢復 nginx 服務的啓用

最後我們用 crontab 來啓動這個定時任務

crontab certbot-auto-renew-cron

至此,整個網站升級到HTTPS就完成了。 總結一下我們需要做什麼

  1. 獲取Let's Encrypt 免費證書
  2. 配置Nginx開啓HTTPS
  3. 定時刷新證書

鳴謝 Let's Encrypt 組織以及所有該組織的貢獻者支持者 爲我們提供 免費的安全證書。

參考: Certbot centosrhel7-nginx
參考: Let's Encrypt getting-startd
參考: Archlinux cron
參考: Nginx configuring-https-servers


我的個人博客

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