GODADDY域名Lets Encrypt泛域名证书续期
Let's Encrypt免费SSL证书的申请及使用
一文已经提及Let's Encrypt的官方推荐的签发工具certbot 具有renew功能,但对于泛域名因为要验证域名TXT子域名_acme-challenge,直接使用certbot会报以下错误:
The error was: PluginError(‘An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.’,). Skipping.
All renewal attempts failed. The following certs could not be renewed:
因此,针对Let's Encrypt泛域名续期,需要使用certbot插件功能,用法:
certbot-auto renew --manual-auth-hook /usr/bin/certbot-godaddy
网上有一些CERTBOT续期的脚本,但是用大多是SHELL脚本写的,有的还是需要先注册第三方平台。因为GODADDY本身提供了API,所以直接采用GODADDY写了一个脚本完成插件DNS修改功能。
2.GODADDY插件脚本开发
1、GODADDY API KEY申请
Godaddy提供了RESTful API,申请地址https://developer.godaddy.com/keys. 登录账户,点网页右上角的“cereate new API key”,随便命名,环境选择 production.
它会给你一个公钥key,和一个私钥secret,复制下来保存好.
使用PUT /v1/domains/{domain}/records/{type}/{name}进行TXT子域名数据更换。
2、GOLANG脚本开发
为了直接用在linux下,使用go语言进行开发
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"os"
"time"
)
func updateDns() {
data := []map[string]interface{}{}
d := make(map[string]interface{}, 4)
d["data"] = os.Getenv("CERTBOT_VALIDATION") //certbot的TXT域名
d["name"] = "_acme-challenge"
d["ttl"] = 600
d["type"] = "TXT"
data = append(data, d)
d1, _ := json.Marshal(data)
fmt.Println(string(d1))
fmt.Println("new_str", bytes.NewBuffer(d1))
client := &http.Client{}
reqest, err := http.NewRequest("PUT", api_url, bytes.NewBuffer(d1))
reqest.Header.Add("Accept", "application/json")
reqest.Header.Add("Content-Type", "application/json")
reqest.Header.Add("Authorization", "sso-key xxxxxxxxx你的key xxxxxxxxx:xxxxxxxxxx你的secret xxxxxxxxxx")
resp, err := client.Do(reqest)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("response Status:", resp.Status)
fmt.Println("response Headers:", resp.Header)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println("response Body:", string(body))
time.Sleep(time.Duration(60) * time.Second) //休眠,让CERTBOT进行域名校验
}
func main() {
fmt.Println(os.Args)
updateDns()
}
3、编译
放到主机上进行编译
go build certbot-godaddy.go
3.注意事项
certbot的插件,要/usr/local/bin等几个目录,否则会出现无法发现脚本问题。
因为域名生效需要时间,有时需要多执行几次,才能通过certbot域名校验。