免費https證書

這是搭建 docker registry 的前置文章,用來描述如何簡單獲取一個安全、可靠、免費的 https 證書。html

雖然你可使用自簽署證書來提供 https,可是因爲自簽署證書的不可靠性,真實用起來受到重重限制,特別是谷歌瀏覽器對於自簽署證書的限制很是大。所以,簡單獲取免費、可靠 https 證書的手段你必須具有。nginx

近幾年來,各大互聯網巨頭都在推動 https 的使用,谷歌瀏覽器更是將非 https 網站標記爲不安全,可見其決心。可是證書申請也是一筆不小的費用,有些創業公司還不知道能活多久呢,能省則省,這個費用天然不肯意花。git

並且就算你申請到一個證書,一旦谷歌認爲你證書的 CA(證書頒發機構)不符合它的要求,你即便是 https,它照樣給你標記爲不安全。github

基於這樣或那樣的緣由,免費、可靠的 https 證書勢在必行。因而互聯網安全研究小組(縮寫 ISRG)於 2015 年三季度推出 Let's Encrypt 這樣的數字證書認證機構(其實就一 CA),爲你免費頒發證書。web

這個小組的背後站着電子前哨基金會、Mozilla 基金會、Akamai 以及思科這些大佬,所以絕對安全可靠。docker

如何作

既然有這種機構了,我應該怎麼申請證書呢?會不會很麻煩啊?放心,用起來很是簡單。首先,Let's Encrypt 本身確定是有一個根證書的,由於只有根證書才能給你簽發證書。shell

而後呢,你須要發送簽署請求給它,它驗證 ok 以後就給你發證書了,這一切 Let's Encrypt 內部都經過自動化來完成。因爲須要自動化完成,因此證書的申請、續期以及銷燬都是經過精心設計的 ACME 協議來完成,這個協議你不須要懂,由於客戶端工具會自動幫你發起。apache

你們應該都清楚,你申請證書的時候是要提供主機名的,好比 www.ntpstat.com,由於主機名是須要寫進證書中的。還有一個種是隻提供通配主機名而非具體主機名的,好比 *.ntpstat.com,這種叫泛域名證書或者通配符證書,也就是隻要是這個域下的全部二級域名均可以使用這個證書。json

好比說我只要申請了 *.ntpstat.com 這個泛域名證書,那麼我下面的 www.ntpstat.com、mail.ntpstat.com、file.ntpstat.com 等二級域名均可以使用這個證書了。相對來講,泛域名證書用起來更爽。vim

具體怎麼作呢?先拿具體的主機名證書申請爲例,咱們先將證書籤署請求發送到 Let's Encrypt,發送請求很簡單,有客戶端工具能夠給你完成(下面會提到)。咱們要作的就是提供給它驗證的方式,Let's Encrypt 得驗證你就是申請這個主機名的人。

這個你們應該能理解吧,不能說你要簽署個什麼證書它就籤給你對吧。驗證有兩種方式,假如我如今申請的主機名是 www.ntpstat.com:

  • 第一種驗證方式:Let's Encrypt 會經過訪問 http://www.ntpstat.com/.well-known/acme-challenge 由客戶端工具生成的驗證文件,驗證經過會在服務器上生成證書文件。所以你在使用客戶端時須要指定你 web 服務器的根目錄,這樣它纔可以在相應目錄下生成驗證文件;
  • 第二種驗證方式:若是你申請的主機名並不對外,只是內部使用,或者你申請的是泛域名證書時,就可使用第二個驗證方式了。你須要在公網的 dns 域下面添加一條 TXT 記錄,好比我就要在 *.ntpstat.com 這個域下添加一個 TXT 記錄,記錄的內容客戶端工具會給出。Let's Encrypt 解析出來的 TXT 記錄若是和客戶端工具給出的一致,那麼一樣生成證書文件。

我的感受第二種用的比較多,由於它可使用泛域名證書以及內部使用。可是無論哪種,申請下來的證書的有效期只有 90 天,到期就要續期了。可是不用擔憂,你寫個定時任務就能夠了,客戶端工具會自動幫你續期。

客戶端工具

說到這裏,想必你對 Let's Encrypt 有了個大體的瞭解了,接下來就要提到它的客戶端工具了。Let's Encrypt 官方的客戶端工具是 certbot,用起來挺簡單;另外一種是國人寫的 acme.sh,聽說比官方工具更好用。

只要你懂得 ACME 協議,也能夠寫一個客戶端工具,因此可能還有另外的工具,可是這裏就很少提了。

certbot

官方的客戶端工具。

對於第一種驗證方式,certbot 自己會使用 nginx/apache 啓動一個 web 服務器,並自動生成驗證文件,對外提供服務。看官方的意思是這個 web 服務器只提供服務於驗證請求,其餘請求一律不響應。固然我沒有看它的 nginx 配置文件,不知道是否是真的如此,這種模式稱爲 Standalone。若是你要使用這種模式,那麼只須要在第一次請求證書以及在後續續期期間將 web 服務器啓動便可,平時徹底能夠處於關閉狀態。而且你得確保系統的 80 和 443 端口沒有被其餘服務監聽。

固然對於一些我的服務器來說,可能就一臺服務器,而且 80 端口正在提供服務,不可能爲了申請證書就直接將服務關了。即便你如今無所謂,後面續期你又得關,總之是很麻煩的。因此 certbot 容許你使用當前的 web 服務進行驗證,只不過你要指定你 web 服務器的根目錄,它會建立 .well-known 目錄,並在其下生成驗證文件。這種模式稱爲 Webroot

這兩種模式都屬於第一種驗證方式,只不過有兩種實現方式而已。

certbot 依賴 Python2.7 或者 Python3.4+,因此確保你的系統符合要求。

OK,咱們先下載。咱們不直接下載 certbot,而是下載 certbot-auto,它是一個 shell 腳本,對 certbot 作了一層封裝,它用起來和 certbot 同樣,可是執行的時候它會檢測本地的 certbot 版本,若是本地沒有就安裝;本地有可是不是最新版本的話,它會自動將其升級。安裝或升級以後,會將傳遞給 certbot-auto 的全部參數都傳遞給 certbot 執行。

本人使用的系統是 CentOS7:

# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
複製代碼

由於客戶端工具須要聯網給 Let's Encrypt 發送證書籤署請求,所以請確保操做系統有網絡鏈接。假如沒有,能夠參考我以前的搭建代理服務讓內網上網,經過在一臺能上網的服務器上搭建代理服務讓其餘服務器經過它來上網。

# wget https://dl.eff.org/certbot-auto
# chmod a+x ./certbot-auto
# ./certbot-auto --help
複製代碼

你能夠檢測這個腳本的完整性:

# wget -N https://dl.eff.org/certbot-auto.asc
# gpg2 --keyserver pool.sks-keyservers.net --recv-key A2CFB51FA275A7286234E7B24D17C995CD9775F2
# gpg2 --trusted-key 4D17C995CD9775F2 --verify certbot-auto.asc certbot-auto
複製代碼

最後一個命令的輸出應該是這樣:

gpg: Signature made Wed 02 May 2018 05:29:12 AM IST
gpg:                using RSA key A2CFB51FA275A7286234E7B24D17C995CD9775F2
gpg: key 4D17C995CD9775F2 marked as ultimately trusted
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   2  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: depth: 1  valid:   2  signed:   0  trust: 2-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2027-11-22
gpg: Good signature from "Let's Encrypt Client Team <letsencrypt-client@eff.org>" [ultimate]
複製代碼

第一種驗證方式

第一種驗證方式是直接在已存在的 web 服務器上生成驗證文件讓 Let's Encrypt 訪問驗證,所以你的服務器必需要有外網 ip,且你申請 https 證書的域名可以解析到這個 ip。好比我如今要申請 www.ntpstat.com 的證書,Let's Encrypt 會訪問 www.ntpstat.com/.well-known/acme-challenge 進行驗證。

這裏只介紹使用 Webroot 的方式,Standalone 就很少提了,我也沒有弄過。

我如今安裝一個 nginx 來表示我本地已經存在 web 服務器了:

# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

# yum install -y nginx
# systemctl enable nginx
# systemctl start nginx
複製代碼

由於我用於簽署證書的域名是 www.ntpstat.com,此時能夠直接訪問了。

訪問 ok,而且還被瀏覽器標記爲了避免安全,嗯,立刻它就安全了。使用客戶端工具發出證書籤署請求:

# ./certbot-auto certonly --webroot -w /usr/share/nginx/html -d www.ntpstat.com
複製代碼

參數說明:

  • certonly:表示只生成證書而不安裝 web 服務器,雖然它也能夠經過 nginx 插件來提供 web 服務,可是仍是本身安裝來的放心;
  • --webroot:使用 webroot 插件,這是配合 certonly 使用的;
  • -w--webroot-path 的縮寫,用來指定 web 服務器的根目錄,nginx 默認根目錄是 /usr/share/nginx/html;
  • -d:指定用於訪問的主機名。

第一次執行上面的命令它會幫你安裝 certbot,安裝完成以後開始執行,下面是它的輸出信息:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): # 讓你輸入郵箱地址,這個郵箱用來發送續期和安裝通知類的郵件,固然你能夠輸入 c 來取消

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A # 讓你贊成註冊 ACME server,贊成就是了

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n # 是否共享你的郵箱,後面會發一些周邊的郵件之類的,這個看須要了
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.ntpstat.com
Using the webroot path /usr/share/nginx/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.ntpstat.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.ntpstat.com/privkey.pem
   Your cert will expire on 2019-04-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 複製代碼

OK,這就簽署完成了,證書在 /etc/letsencrypt/live/www.ntpstat.com/fullchain.pem,對應的私鑰文件爲 /etc/letsencrypt/live/www.ntpstat.com/privkey.pem。上面還介紹了這個證書的有效期,而且還告訴你須要只須要執行 certbot-auto renew 就能夠了。

既然證書都有了,那就 https 搞起唄。

修改 nginx 配置文件:

# vim /etc/nginx/conf.d/ssl.conf
server {
    listen   *:443;
    server_name  www.ntpstat.com;

    ssl on;
    ssl_certificate      /etc/letsencrypt/live/www.ntpstat.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/www.ntpstat.com/privkey.pem;

    location / {
        root /usr/share/nginx/html;
    }
}
複製代碼

瀏覽器使用 https 訪問就能夠看到鏈接是安全的。

固然,你可能想要 http 訪問直接跳轉到 https,很簡單,在 http 訪問中加個跳轉就能夠了。

# vim /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  www.ntpstat.com;

    # 新增一行,強制跳轉 https
    rewrite ^(.*)$ https://$host$1 permanent;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
複製代碼

驗證完成後,生成的驗證目錄都會自動刪除掉。

第二種驗證方式

能夠看到,很簡單就完成了針對單個域名的 https 證書獲取。這可能在你建本身的網站方面有用,由於你對外提供了 web 服務。可是當你的證書只是內部使用,並無對外提供 web 服務,let's encrypt 服務器根本訪問不到,好比 docker registry、ldap https 等等這樣的,又或者是簽署泛域名證書這樣的場景,第一種驗證方式就不可用了。固然,Let's Encrypt 確定是瞭解你們需求的,所以如今就來說講它的第二種驗證方式。

前面也提到了,第二種驗證方式就是經過添加 dns 的 TXT 記錄來完成。這就要求你的域名必須可以在公網上面被解析,所以你的一級域必須是 com、cn、net、pro 等公網上可以買的到域,不然 Let's Encrypt 發起個 TXT 記錄的解析不可能收到結果的。

本身內部搭建的 DNS 就不用想了,由於外部訪問不到。

以前的域名咱們先無論,從新簽署一個泛域名的吧,這樣好驗證。

# ./certbot-auto certonly --manual --preferred-challenges dns
複製代碼

先說說選項:

  • certonly:這個前面也提到了,只簽署證書不須要 http 服務;
  • --manual:用於當前這種經過 dns 驗證的方式,它還提供另外一種 http 的方式驗證,好比你如今運行 certbot 命令的機器並非你提供 web 服務的那一臺,固然這不重要;
  • --preferred-challenges:配合 --manual 使用的,由於我們要經過 dns 驗證,因此選擇 dns。

這個命令的執行須要花點時間,多是用在檢測本地的 certbot 版本。

如下是命令的輸出內容:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): *.ntpstat.com # 讓你輸入你的域,由於簽署的是泛域名證書,所以須要加上 *
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for ntpstat.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Cleaning up challenges
Must agree to IP logging to proceed
[root@host ~]# ./certbot-auto certonly --manual --preferred-challenges dns
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): ntpstat.com
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for ntpstat.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y # 意思是這個機器的 ip 已經被公開記錄爲請求這個證書,有點沒搞懂。但你只能輸入 y,不然命令執行終止

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.ntpstat.com with the following value: # 給出了 TXT 記錄的名稱和對應的值

me0g64A6vImOjdeC0yyG26m_LLxtQPELWXdInzqynVk

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
複製代碼

先別急着回車,咱們先添加它的 dns 記錄。你須要登陸你的域名運營商,而且你的域名下面添加一條記錄。根據我上面生成的信息,我須要在個人 ntpstat.com 這個域下面增長一個 TXT 記錄,名稱是 _acme-challenge(後面的 .ntpstat.com 不要加上去),值爲 me0g64A6vImOjdeC0yyG26m_LLxtQPELWXdInzqynVk

而後使用 dig 命令檢測一把:

# dig -t TXT _acme-challenge.ntpstat.com

; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t TXT _acme-challenge.ntpstat.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64655
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1452
;; QUESTION SECTION:
;_acme-challenge.ntpstat.com.	IN	TXT

# 看 ANSWER SECTION 這個字段
;; ANSWER SECTION:
_acme-challenge.ntpstat.com. 3582 IN	TXT	"me0g64A6vImOjdeC0yyG26m_LLxtQPELWXdInzqynVk"

;; Query time: 5 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Sun Jan 13 00:22:13 EST 2019
;; MSG SIZE  rcvd: 112
複製代碼

能夠查看解析 OK,而後就能夠回車了。

Press Enter to Continue
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ntpstat.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ntpstat.com/privkey.pem
   Your cert will expire on 2019-04-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 複製代碼

簽署成功!證書的路徑也已給出了。那麼泛域名證書就簽署完畢了,那麼這個域下面的任何三級域均可以使用這個證書,好比 blog.ntpstat.com、www.ntpstat.com、file.ntpstat.com 等。

咱們如今就能夠修改 nginx 配置文件,將證書換成新證書進行測試。

# vim /etc/nginx/conf.d/ssl.conf
server {
    listen   *:443;
    server_name  www.ntpstat.com;

    ssl on;
    ssl_certificate      /etc/letsencrypt/live/ntpstat.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/ntpstat.com/privkey.pem;

    location / {
        root /usr/share/nginx/html;
    }
}
複製代碼

只須要換個證書便可,其餘什麼都不須要改。reload nginx 以後,直接訪問 https://www.ntpstat.com。固然,你須要換成你的域名。

能夠看到,照樣是安全的。你其實能夠添加個三級域名的 A 記錄,好比 file.DOMAIN.com(或者本地修改 hosts 文件),而後使用這個域名進行 https 訪問看是否存在問題,這也就可以驗證泛域名證書是否有效了。

證書續期

證書默認三個月到期,certbot 提供了證書續期的方法,使用 renew 子命令。

./certbot-auto renew
複製代碼

簡單的不行!以前使用的插件和選項它會沿用,它不一樣於 certonly,它會檢查當前機器上使用 certbot 申請的全部證書是否過時,而不是單單隻針對一個。

只有當證書有效期不足 30 天后這個命令才工做,所以你能夠寫個定時任務執行這個命令,能夠天天執行也能夠每週或每個月執行,隨便你了。你如今執行的話,它會提示證書還未到失效期,直接就跳過了。

使用 crontab 執行續期命令的話,必定要注意環境變量的問題,所以你執行的最好將命令寫入到一個腳本中,在執行這個腳本時將腳本的輸出全重定向到一個文件,這樣你就能知道這個腳本的執行狀況了。

就像這樣:

1 1 * * * sh -x /PATH/TO/certbot-renew.sh &>/tmp/certbot-auto.log
複製代碼

renew 這個子命令提供了鉤子,能夠在執行這個命令以前和以後執行某些命令。好比對於 Standalone 模式續期以前須要啓動 web 服務,在驗證以後又想關掉時就能夠這麼用。

./certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"
複製代碼

可是這種證書續期方式只適用於普通的域名,對於泛域名證書,因爲須要修改 TXT 記錄,這個涉及到域名提供商,Let's Encrypt 就無能爲力了,好比下面的錯誤提示。

Processing /etc/letsencrypt/renewal/ntpstat.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',)
Attempting to renew cert (ntpstat.com) from /etc/letsencrypt/renewal/ntpstat.com.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping.
複製代碼

固然,如今的域名運營商基本都提供了 api 供你調用來完成自動化操做,就有人提供了對熱門域名運營商的 Let's Encrypt 續期操做,Github 地址在此,按照上面的說明進行操做就行。

有個問題就是,證書續期以後證書文件的內容確定會發生改變(還將來得及測試,但應該如此),若是這個證書文件在其餘服務器上使用的話,不知道在續期後要不要進行替換。

證書撤銷

若是你私鑰被盜用,或者你就是想撤銷證書的話可使用 revoke 子命令。

certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem
複製代碼

注意它要指定的是證書的路徑,而非域名。

好了,certbot 要講到的內容就這麼多了,關於 certbot 命令的使用還有不少內容,有興趣的話能夠自行查看官方文檔。

acme.sh

acme.sh GitHub star 已經 10k 多了,仍是很是值得一用的。有須要的話,能夠自行查看使用,反正有中文文檔,看起來一點不費事。這裏就很少提了,想必有了前面的基礎,使用它應該沒有任何問題。這裏只是告訴你們有這麼個東西,其實我也沒有用過 :)

監控證書的有效期

雖然咱們可使用定時任務去自動對證書進行續期,而且快到期時 Let's Encrypt 也會發送郵件,可是仍是有些被動,咱們最好可以主動監控它,當證書有效期不足好比 7 天時,發送告警。

d=`openssl x509 -in /etc/letsencrypt/live/ntpstat.com/fullchain.pem -noout -enddate | awk -F= '{print $2}'`
end_timestamp=`date -d "$d" +"%s"`
current_timestamp=`date +"%s"`
echo $((end_timestamp-current_timestamp))
複製代碼

輸出的時間戳表示證書過時時間距離當前時間相差多少秒,你就能夠經過這個時間戳來制定觸發器了,好比 7 天總共 604800 秒,若是上面的時間小於這個值那就表示 7 天后過時,要報警了。

godaddy 續期操做

因爲國內的域名須要備案,所以使用 godaddy 購買域名是個很不錯的選擇。

本人買的就是 godaddy 的域名,且以前申請的 https 泛域名證書快到期了,續期的時候才發現還須要修改 TXT 記錄。雖然有人提供了自動化操做的腳本,可是本身想研究研究。

稍稍看了下 godaddy 的開發者文檔,發現原來修改 TXT 記錄只須要一條 curl 命令就行,簡單的一逼。下面我就將如何使用 curl 命令,以及腳本如何調用的方式寫出來,供你們參考。

首先使用火狐瀏覽器訪問 developer.godaddy.com,注意必定要使用火狐瀏覽器,我以前用谷歌、edge、ie 訪問都不行,這裏不得不吐槽 godaddy,作的真是垃圾。

打開網頁以後,點擊 api keys,登陸以後就能夠生成 key 和 secret 了,環境我選擇的是 production。它們之間的區別不是很瞭解,或許生產環境才能直接生效?不一樣的環境調用的域名不一樣,其餘參數都同樣。

#!/bin/bash 
api_key=""
api_secret=""
record="_acme-challenge" # 固定值
record_ttl="1500" # 單位是秒
record_type="TXT"
record_value=""
domain=""
api_base_url="https://api.godaddy.com/"
api_url=`echo -n "${api_base_url}v1/domains/${domain}/records/${record_type}/${record}"`

curl -X PUT "${api_url}" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: sso-key ${api_key}:${api_secret}" -d "[{\"data\": \"${record_value}\", \"ttl\": ${record_ttl}}]"
複製代碼

一條 curl 命令就 ok 了,很是簡單,你如今就能夠填入對應值測試一把。

接下來就須要使用 certbot-auto 命令進行調用了,它會自動傳遞域名和 TXT 記錄的值到腳本中,因此咱們須要修改下腳本。

#!/bin/bash 
api_key=""
api_secret=""
record="_acme-challenge"
record_ttl="600"
record_type="TXT"
record_value="${CERTBOT_VALIDATION}"
domain="${CERTBOT_DOMAIN}"
api_base_url="https://api.godaddy.com/"
api_url=`echo -n "${api_base_url}v1/domains/${domain}/records/${record_type}/${record}"`

curl -sX PUT "${api_url}" -H "accept: application/json" -H "Content-Type: application/json" -H "Authorization: sso-key ${api_key}:${api_secret}" -d "[{\"data\": \"${record_value}\", \"ttl\": ${record_ttl}}]"
複製代碼

它不會將值做爲參數進行傳遞,而是直接傳遞環境變量,上面兩個環境變量就是它傳遞的。而後咱們將上面的內容貼入到一個文件中,我這裏使用的是 /tmp/test.sh,接着賦予該腳本執行權限。

最後續期:

./certbot-auto renew --preferred-challenges=dns --manual-auth-hook /tmp/test.sh
複製代碼

--preferred-challenges 能夠指定 http 和 dns,咱們是 dns,因此使用 dns。

--manual-auth-hook 會自動傳遞三個環境變量,其中 dns 只有上面咱們用到的兩個,而 http 則會多一個 CERTBOT_TOKEN

你還可使用 --manual-cleanup-hook 指定驗證完成後的操做,一樣是個腳本,而且會自動傳遞 CERTBOT_AUTH_OUTPUT 給腳本。不過這個選項咱們用不上。

當你續期的時候,測試的時候不要太頻繁。若是你剛修改 TXT 記錄,而且時間還未超過 TTL 的時間時就開始續期,那麼驗證會失敗,由於 Let’s Encrypt’s 查到的會是上次的緩存,而不是這次修改的值。

相關文章
相關標籤/搜索