GODADDY域名Lets Encrypt泛域名证书续期 GODADDY-API

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.
godaddy API-key
它会给你一个公钥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域名校验。

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据