這篇文章主要講的就是如何讓自己的網(wǎng)站免費從HTTP升級為HTTPS衙四,使用的是 Let's Encrypt的證書。實際上也就是一個Let's Encrypt 免費證書獲取教程 己沛。
為什么要上HTTPS,說一個小故事距境。
從前有個網(wǎng)站申尼,后來有個廣告,沒了
作為一個博客垫桂,自然不想讓在被別人瀏覽的時候师幕,出現(xiàn)莫名的廣告(運營商劫持)。這時候伪货,HTTPS的價值就體現(xiàn)出來了们衙。 HTTPS的好處還有很多,但單單這一條碱呼,就夠我花心思去升級了蒙挑。 (其實主要目的是提升網(wǎng)站Biger :)
Let's Encrypt 簡介
如果要啟用HTTPS,我們就需要從證書授權機構(以下簡稱CA) 處獲取一個證書愚臀,Let's Encrypt 就是一個 CA忆蚀。我們可以從 Let's Encrypt 獲得網(wǎng)站域名的免費的證書。這篇文章也主要講的是通過 Let's Encrypt + Nginx 來讓網(wǎng)站升級到HTTPS。
Certbot 簡介
Certbot 是Let's Encrypt官方推薦的獲取證書的客戶端馋袜,可以幫我們獲取免費的Let's Encrypt 證書男旗。Certbot 是支持所有 Unix 內(nèi)核的操作系統(tǒng)的,個人博客的服務器系統(tǒng)是CentOS 7欣鳖,這篇教程也是通過在個人博客上啟用HTTPS的基礎上完成的察皇。
獲取免費證書
- 安裝Certbot客戶端
yum install certbot
- 獲取證書
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
這個命令會為 example.com 和 www.example.com 這兩個域名生成一個證書,使用
--webroot
模式會在/var/www/example
中創(chuàng)建.well-known
文件夾泽台,這個文件夾里面包含了一些驗證文件什荣,certbot 會通過訪問 example.com/.well-known/acme-challenge 來驗證你的域名是否綁定的這個服務器。這個命令在大多數(shù)情況下都可以滿足需求怀酷,
但是有些時候我們的一些服務并沒有根目錄稻爬,例如一些微服務,這時候使用 --webroot
就走不通了蜕依。certbot 還有另外一種模式 --standalone
桅锄, 這種模式不需要指定網(wǎng)站根目錄,他會自動啟用服務器的443端口样眠,來驗證域名的歸屬友瘤。我們有其他服務(例如nginx)占用了443端口,就必須先停止這些服務吹缔,在證書生成完畢后商佑,再啟用。
certbot certonly --standalone -d example.com -d www.example.com
證書生成完畢后厢塘,我們可以在 /etc/letsencrypt/live/
目錄下看到對應域名的文件夾茶没,里面存放了指向證書的一些快捷方式。
這時候我們的第一生成證書已經(jīng)完成了晚碾,接下來就是配置我們的web服務器抓半,啟用HTTPS。
Nginx 配置啟用 HTTPS
博客系統(tǒng)使用的是Nginx 服務器來轉發(fā)請求格嘁,這里貼一下我的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;
}
}
主要是監(jiān)聽 443
端口,啟用 SSL糕簿,并配置 SSL 的證書路徑(公鑰探入,私鑰的路徑)。
自動更新 SSL 證書
配置完這些過后懂诗,我們的工作還沒有完成蜂嗽。 Let's Encrypt 提供的證書只有90天的有效期,我們必須在證書到期之前殃恒,重新獲取這些證書植旧,certbot 給我們提供了一個很方便的命令辱揭,那就是 certbot renew
。
通過這個命令病附,他會自動檢查系統(tǒng)內(nèi)的證書问窃,并且自動更新這些證書。
我們可以運行這個命令測試一下
certbot renew --dry-run
我在運行的時候出現(xiàn)了這個錯誤
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.
這是因為我的api.diamondfsd.com生成證書的時候使用的是 --standalone
模式完沪,驗證域名的時候域庇,需要啟用443端口,這個錯誤的意思就是要啟用的端口已經(jīng)被占用了丽焊。 這時候我必須把nginx
先關掉较剃,才可以成功。果然技健,我先運行 service nginx stop
運行這個命令,就沒有報錯了惰拱,所有的證書都刷新成功雌贱。
證書是90天才過期,我們只需要在過期之前執(zhí)行更新操作就可以了偿短。 這件事情就可以直接交給定時任務來完成欣孤。linux 系統(tǒng)上有 cron
可以來搞定這件事情。
我新建了一個文件 certbot-auto-renew-cron
昔逗, 這個是一個 cron
計劃降传,這段內(nèi)容的意思就是 每隔 兩個月的 凌晨 2:15 執(zhí)行 更新操作。
15 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
--pre-hook
這個參數(shù)表示執(zhí)行更新操作之前要做的事情勾怒,因為我有 --standalone
模式的證書婆排,所以需要 停止 nginx
服務,解除端口占用笔链。
--post-hook
這個參數(shù)表示執(zhí)行更新操作完成后要做的事情段只,這里就恢復 nginx
服務的啟用
最后我們用 crontab
來啟動這個定時任務
crontab certbot-auto-renew-cron
至此,整個網(wǎng)站升級到HTTPS就完成了鉴扫。 總結一下我們需要做什么
- 獲取Let's Encrypt 免費證書
- 配置Nginx開啟HTTPS
- 定時刷新證書