如何使用certbot自動更新SSL憑證 (CentOS 6,7,8, Ubuntu)
現在Google Chrome以及Firefox等瀏覽器大品牌都很要求網站本身的SSL憑證,只要是非經第三方認證的https網站,輕則顯示驚嘆號『!』,重則顯示
紅色還幫你加上一個斜槓,光看就讓瀏覽者感到不安全!
還好這世界上還有佛心公司 Let’s encrypt 提供免費的SSL憑證申請服務!但是,透過此公司申請到的憑證僅有3個月的有效期限,短短三個月就又要申請一次實在是麻煩!
有鑑於此,本次要介紹 Certbot 自動更新Let’s encrypt核發SSL憑證的步驟,而且本文章一共收錄了CentOS 6, 7, 8 以及 Ubuntu 的做法喔。
Let’s encrypt傳統申請方法:如何申請免費SSL?又要怎麼安裝SSL?(以SSL For Free – Let’s Encrypt為例)
安裝Certbot
CentOS 8
1 2 3 4 |
[andy@www ~]$ wget https://dl.eff.org/certbot-auto [andy@www ~]$ sudo mv certbot-auto /usr/local/bin/certbot-auto [andy@www ~]$ sudo chown root /usr/local/bin/certbot-auto [andy@www ~]$ sudo chmod 0755 /usr/local/bin/certbot-auto |
CentOS 7
1 |
[andy@www ~]$ sudo yum install certbot-apache |
CentOS 6
1 2 |
[andy@www ~]$ wget https://dl.eff.org/certbot-auto [andy@www ~]$ sudo chmod a+x certbot-auto |
Ubuntu
1 2 3 |
[andy@www ~]$ sudo add-apt-repository ppa:certbot/certbot [andy@www ~]$ sudo apt-get update [andy@www ~]$ sudo apt-get install python-certbot-apache |
用Certbot申請SSL憑證
Certbot常指令說明:
- –apache:表示使用apache作為伺服器軟體
- certonly:僅申請憑證,不主動編輯httpd.conf
- -w:網站根目錄所在(發證單位仍然要去驗證ACME Challenge file,所以Certbot必須要把驗證檔放在正確的位置)
- -d:網域名稱,如果是www開頭的話,還得多指定一個去掉“www”的網址(就像本範例這樣)
CentOS 8請參考下列指令:
(下列第2行是只需要申請憑證的指令)
1 2 |
[andy@www ~]$ sudo /usr/local/bin/certbot-auto --apache [andy@www ~]$ sudo /usr/local/bin/certbot-auto certonly --apache |
官方建議中這個版本的 certbot 不需要給網域名稱(-d)和網站根目錄(-w)兩個參數,因為在這個版本中 certbot 會跳出選單給各位選擇,屆時只需要回答要申請所有站台或是只要申請某幾個站台 SSL 憑證。
CentOS 7, Ubuntu請參考下列指令:
1 |
[andy@www ~]$ sudo certbot --apache certonly -w /var/www/html/ -d www.brilliantcode.net -d brilliantcode.net |
CentOS 6,執行sh更新,把執行名稱改一下就可以了!
1 [andy@www ~]$ ./certbot-auto --apache certonly -w /var/www/html/ -d www.brilliantcode.net -d brilliantcode.net
Certbot預設SSL憑證路徑
/etc/letsencrypt/live/domain_name/
修改apache config
如果你跟我一樣,之前都是自己手動申請,那就必須修改config檔!
下方 httpd 路徑是 CentOS 的預設路徑,Ubuntu的設定檔要自己找一下。
1 |
[andy@www ~]$ sudo vim /etc/httpd/conf.d/ssl.conf |
1 2 3 4 |
SSLCertificateFile /etc/letsencrypt/live/brilliantcode.net/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/brilliantcode.net/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/brilliantcode.net/chain.pem SSLCACertificateFile /etc/letsencrypt/live/brilliantcode.net/fullchain.pem |
測試!
讓Apache重新載入設定檔,沒錯!可以免重啟Apache唷~(最近發覺很好用的指令)
CentOS 8
1 |
[andy@www ~]$ sudo httpd -k graceful |
CentOS 7/ CentOS 6
CentOS 7.4 應該要改成這個指令『
sudo apachectl graceful
』
1 |
[andy@www ~]$ sudo apachectl -k graceful |
Ubuntu
1 |
[andy@www ~]$ sudo /etc/init.d/apache2 reload |
這時候就可以用瀏覽器重新整理你的網站,看看憑證有效日期是否已更新!
設定Certbot自動更新
certbot會測試是否能更新成功(只測試,不更新)
CentOS 8
1 |
[andy@www ~]$ sudo /usr/local/bin/certbot-auto renew --dry-run |
CentOS 7, Ubuntu
1 |
[andy@www ~]$ sudo certbot renew --dry-run |
CentOS 6
1 |
[andy@www ~]$ sudo ./certbot-auto renew --dry-run |
設定每2個月更新一次,將更新指令加入cron
corn的詳細用法可以參考這篇:cron(crontab) – Linux常用指令#01
1 |
[andy@www ~]$ sudo crontab -e |
指令說明:
- renew:表示要求更新SSL憑證
- –quiet:不跳出詢問
- –no-self-upgrade:執行程式就好,不要更新Certbot本身!(預設是自動更新喔!)
- –post-hook:指定一串更新完成後要接續著執行的指令,用雙引號將指令框起來!
CentOS 8
1 |
0 0 1 */2 * python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew |
因為 certbot 是以 python 撰寫,因此官方建議直接使用 python 執行更新憑證程式,所以記得要先確認伺服器的 python 版本以及指令是否跟我給的範例一致。
指令的部分:建議試試看 sudo 是否能執行 python,如果使用『sudo python3』找不到的話,請試試『sudo python』。若出現跟下列範例類似的訊息,代表 root 認得這個指令,所以在 crontab 之中就可以直接呼叫使用。
123456 [andy@www ~]$ sudo python3[sudo] password for andy:Python 3.6.8 (default, Jul 1 2019, 16:43:04)[GCC 8.2.1 20180905 (Red Hat 8.2.1-3)] on linuxType "help", "copyright", "credits" or "license" for more information.>>>
如果 root 認不得這個指令,那就只好用 which 找出 python(或python3) 的絕對路徑:
如此一來,你勢必也要將 crontab 指令裡面的 python3 替換成絕對路徑。
12 [andy@www ~]$ which python3/usr/bin/python3
CentOS 7, Ubuntu
1 |
0 0 1 */2 * /usr/bin/certbot renew --quiet --no-self-upgrade --post-hook "apachectl -k graceful" |
建議用 which 先看一下 certbot 的完整路徑是否跟我給的路徑 /usr/bin/certbot 一致
12 [andy@www ~]$ which certbot/usr/bin/certbot
確認SSL是否正確安裝
SSLShopper – SSL checker
把你的網址輸入到此服務,就可以確認SSL是否正確安裝喔。
# sudo yum install certbot-apache
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.uhost.hk
* extras: centos.uhost.hk
* updates: centos.uhost.hk
No package certbot-apache available.
Hi,
我不能用yum安裝certbot,原因是找不到packet,請問有方法嗎?
thanks
PIN
Hi PIN,
如果你的作業系統也是使用CentOS,不妨安裝”certbot”看看!
certbot是包在EPEL這個Repository裡面,如果還是找不到,可以先安裝Repository: EPEL!
下列是certbot的資訊:
Installed Packages
Name : certbot
Arch : noarch
Version : 0.22.2
Release : 1.el7
Size : 23 k
Repo : installed
From repo : epel
Summary : A free, automated certificate authority client
URL : https://pypi.python.org/pypi/certbot
License : ASL 2.0
Description : certbot is a free, automated certificate authority that aims
: to lower the barriers to entry for encrypting all HTTP traffic on the internet.
問題1:關於step 2
-d:網域名稱,如果是www開頭的話,還得多指定一個去掉“www”的網址(就像本範例這樣)
sudo certbot –apache certonly -w /var/www/html/ -d http://www.brilliantcode.net -d brilliantcode.net
—————————————————————————————————————————————
想問
若網址是xoops2.cdps.ntpc.edu.tw的話,在-d後面的指令是這樣嗎?還是?
sudo certbot –apache certonly -w /var/www/html/ -d xoops2.cdps.ntpc.edu.tw -d cdps.ntpc.edu.tw
問題2:關於step 3
修改apache config,如果你跟我一樣,之前都是自己手動申請,那就必須修改config檔!
—————————————————————————————————–
想問,若是第一次申請設定,之前都沒申請過,step3還要做嗎?
謝謝您~
問題1+問題2:假設你的apache站台只會有這個網站『xoops2.cdps.ntpc.edu.tw』,其實短時間內想完成這件事,你可以直接用下列指令來滿足你的需求!
依據上述條件來提供給你的做法是取消『僅申請憑證』選項『certonly』,若不加此選項,certbot預設會自動幫你修改ssl.conf,也就是會自動幫你做“Step 3”!
sudo certbot --apache -w /var/www/html/ -d xoops2.cdps.ntpc.edu.tw
倘若你的伺服器已經有其他站台,同時也存在前人做好的設定,就不建議讓certbot自動幫你做設定!所以要加上『certonly』!
如果對ssl.conf『/etc/httpd/conf.d/ssl.conf』不太了解,建議你可以來看一下這篇:Apache 2.4 https 多網域設定 讓一台伺服器綁定多個網址
或者是看一下這篇:CentOS 7 架站教學彙整 (Apache 2.4 + MySQL 5.7 + php 7 + phpMyAdmin + SSH + sFTP)裡面有一區是『SSL相關教學』 😀