From 30de13b4df55837231253ba55120e80af8a3f87f Mon Sep 17 00:00:00 2001 From: neil Date: Fri, 29 Jul 2016 18:07:16 +0800 Subject: [PATCH] support Godaddy domaain api --- README.md | 5 +- acme.sh | 9 +++- dnsapi/README.md | 26 +++++++++++ dnsapi/dns_gd.sh | 118 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 dnsapi/dns_gd.sh diff --git a/README.md b/README.md index 200b5f0..a074c18 100644 --- a/README.md +++ b/README.md @@ -243,8 +243,9 @@ You don't have do anything manually! 1. Cloudflare.com API 2. Dnspod.cn API 3. Cloudxns.com API -4. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65 -5. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api +4. Godaddy.com API +5. AWS Route 53, see: https://github.com/Neilpang/acme.sh/issues/65 +6. lexicon dns api: https://github.com/Neilpang/acme.sh/wiki/How-to-use-lexicon-dns-api (DigitalOcean, DNSimple, DnsMadeEasy, DNSPark, EasyDNS, Namesilo, NS1, PointHQ, Rage4 and Vultr etc.) ##### More APIs are coming soon... diff --git a/acme.sh b/acme.sh index 1149aef..a2cfd9f 100755 --- a/acme.sh +++ b/acme.sh @@ -1,6 +1,6 @@ #!/usr/bin/env sh -VER=2.3.2 +VER=2.3.3 PROJECT_NAME="acme.sh" @@ -640,6 +640,7 @@ _post() { fi _debug $httpmethod _debug "url" "$url" + _debug2 "body" "$body" if _exists "curl" ; then _CURL="$CURL --dump-header $HTTP_HEADER " _debug "_CURL" "$_CURL" @@ -2217,6 +2218,12 @@ _initconf() { # #CX_Secret=\"sADDsdasdgdsf\" +####################### +#Godaddy.com: +#GD_Key=\"sdfdsgdgdfdasfds\" +# +#GD_Secret=\"sADDsdasdfsdfdssdgdsf\" + " > $ACCOUNT_CONF_PATH fi } diff --git a/dnsapi/README.md b/dnsapi/README.md index ec8ce6d..3098e03 100644 --- a/dnsapi/README.md +++ b/dnsapi/README.md @@ -64,6 +64,32 @@ acme.sh --issue --dns dns_cx -d aa.com -d www.aa.com The `CX_Key` and `CX_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use Cloudxns.com api, it will reuse this key. +## Use Godaddy.com domain api to automatically issue cert + +We support Godaddy integeration. + +First you need to login to your Godaddy account to get your api key and api secret. + +https://developer.godaddy.com/keys/ + +Please Create a Production key, instead of a Test key. + + +``` +export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" + +export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd" + +``` + +Ok, let's issue cert now: +``` +acme.sh --issue --dns dns_gd -d aa.com -d www.aa.com +``` + +The `GD_Key` and `GD_Secret` will be saved in `~/.acme.sh/account.conf`, when next time you use cloudflare api, it will reuse this key. + + # Use custom api diff --git a/dnsapi/dns_gd.sh b/dnsapi/dns_gd.sh new file mode 100644 index 0000000..01a2c3d --- /dev/null +++ b/dnsapi/dns_gd.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env sh + +#Godaddy domain api +# +#GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" +# +#GD_Secret="asdfsdfsfsdfsdfdfsdf" + + +GD_Api="https://api.godaddy.com/v1" + +######## Public functions ##################### + +#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" +dns_gd_add(){ + fulldomain=$1 + txtvalue=$2 + + if [ -z "$GD_Key" ] || [ -z "$GD_Secret" ] ; then + _err "You don't specify godaddy api key and secret yet." + _err "Please create you key and try again." + return 1 + fi + + #save the api key and email to the account conf file. + _saveaccountconf GD_Key "$GD_Key" + _saveaccountconf GD_Secret "$GD_Secret" + + _debug "First detect the root zone" + if ! _get_root $fulldomain ; then + _err "invalid domain" + return 1 + fi + _debug _domain_id "$_domain_id" + _debug _sub_domain "$_sub_domain" + _debug _domain "$_domain" + + + _info "Adding record" + if _gd_rest PUT "domains/$_domain/records/TXT/$_sub_domain" "[{\"data\":\"$txtvalue\"}]"; then + if [ "$response" == "{}" ] ; then + _info "Added, sleeping 10 seconds" + sleep 10 + #todo: check if the record takes effect + return 0 + else + _err "Add txt record error." + _err "$response" + return 1 + fi + fi + _err "Add txt record error." + +} + + + + + +#################### Private functions bellow ################################## +#_acme-challenge.www.domain.com +#returns +# _sub_domain=_acme-challenge.www +# _domain=domain.com +# _domain_id=sdjkglgdfewsdfg +_get_root() { + domain=$1 + i=2 + p=1 + while [ '1' ] ; do + h=$(printf $domain | cut -d . -f $i-100) + if [ -z "$h" ] ; then + #not valid + return 1; + fi + + if ! _gd_rest GET "domains/$h" ; then + return 1 + fi + + if printf "$response" | grep '"code":"NOT_FOUND"' >/dev/null ; then + _debug "$h not found" + else + _sub_domain=$(printf $domain | cut -d . -f 1-$p) + _domain=$h + return 0 + fi + p=$i + i=$(expr $i + 1) + done + return 1 +} + +_gd_rest() { + m=$1 + ep="$2" + data="$3" + _debug $ep + + _H1="Authorization: sso-key $GD_Key:$GD_Secret" + _H2="Content-Type: application/json" + + if [ "$data" ] ; then + _debug data "$data" + response="$(_post "$data" "$GD_Api/$ep" "" $m)" + else + response="$(_get "$GD_Api/$ep")" + fi + + if [ "$?" != "0" ] ; then + _err "error $ep" + return 1 + fi + _debug2 response "$response" + return 0 +} + +