mirror of
				https://github.com/hiskang/acme.sh
				synced 2025-10-31 02:17:18 +00:00 
			
		
		
		
	
						commit
						7b8a82ce90
					
				| @ -341,6 +341,7 @@ You don't have to do anything manually! | |||||||
| 1. Hurricane Electric DNS service (https://dns.he.net) | 1. Hurricane Electric DNS service (https://dns.he.net) | ||||||
| 1. UnoEuro API (https://www.unoeuro.com/) | 1. UnoEuro API (https://www.unoeuro.com/) | ||||||
| 1. INWX (https://www.inwx.de/) | 1. INWX (https://www.inwx.de/) | ||||||
|  | 1. Servercow (https://servercow.de) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| And:  | And:  | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								acme.sh
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								acme.sh
									
									
									
									
									
								
							| @ -4308,7 +4308,12 @@ _installcert() { | |||||||
|     if [ -f "$_real_key" ] && [ ! "$IS_RENEW" ]; then |     if [ -f "$_real_key" ] && [ ! "$IS_RENEW" ]; then | ||||||
|       cp "$_real_key" "$_backup_path/key.bak" |       cp "$_real_key" "$_backup_path/key.bak" | ||||||
|     fi |     fi | ||||||
|     cat "$CERT_KEY_PATH" >"$_real_key" |     if [ -f "$_real_key" ]; then | ||||||
|  |       cat "$CERT_KEY_PATH" >"$_real_key" | ||||||
|  |     else | ||||||
|  |       cat "$CERT_KEY_PATH" >"$_real_key" | ||||||
|  |       chmod 700 "$_real_key" | ||||||
|  |     fi | ||||||
|   fi |   fi | ||||||
| 
 | 
 | ||||||
|   if [ "$_real_fullchain" ]; then |   if [ "$_real_fullchain" ]; then | ||||||
|  | |||||||
| @ -635,6 +635,22 @@ acme.sh --issue --dns dns_inwx -d example.com -d www.example.com | |||||||
| 
 | 
 | ||||||
| The `INWX_User` and `INWX_Password` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed. | The `INWX_User` and `INWX_Password` settings will be saved in `~/.acme.sh/account.conf` and will be reused when needed. | ||||||
| 
 | 
 | ||||||
|  | ## 34. User Servercow API v1 | ||||||
|  | 
 | ||||||
|  | Create a new user from the servercow control center. Don't forget to activate **DNS API** for this user. | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | export SERVERCOW_API_Username=username | ||||||
|  | export SERVERCOW_API_Password=password | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Now you cann issue a cert: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | acme.sh --issue --dns dns_servercow -d example.com -d www.example.com | ||||||
|  | ``` | ||||||
|  | Both, `SERVERCOW_API_Username` and `SERVERCOW_API_Password` will be saved in `~/.acme.sh/account.conf` and will be reused when needed. | ||||||
|  | 
 | ||||||
| # Use custom API | # Use custom API | ||||||
| 
 | 
 | ||||||
| If your API is not supported yet, you can write your own DNS API. | If your API is not supported yet, you can write your own DNS API. | ||||||
|  | |||||||
							
								
								
									
										170
									
								
								dnsapi/dns_servercow.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										170
									
								
								dnsapi/dns_servercow.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,170 @@ | |||||||
|  | #!/usr/bin/env sh | ||||||
|  | 
 | ||||||
|  | ########## | ||||||
|  | # Custom servercow.de DNS API v1 for use with [acme.sh](https://github.com/Neilpang/acme.sh) | ||||||
|  | # | ||||||
|  | # Usage: | ||||||
|  | # export SERVERCOW_API_Username=username | ||||||
|  | # export SERVERCOW_API_Password=password | ||||||
|  | # acme.sh --issue -d example.com --dns dns_servercow | ||||||
|  | # | ||||||
|  | # Issues: | ||||||
|  | # Any issues / questions / suggestions can be posted here: | ||||||
|  | # https://github.com/jhartlep/servercow-dns-api/issues | ||||||
|  | # | ||||||
|  | # Author: Jens Hartlep | ||||||
|  | ########## | ||||||
|  | 
 | ||||||
|  | SERVERCOW_API="https://api.servercow.de/dns/v1/domains" | ||||||
|  | 
 | ||||||
|  | # Usage dns_servercow_add _acme-challenge.www.domain.com "abcdefghijklmnopqrstuvwxyz" | ||||||
|  | dns_servercow_add() { | ||||||
|  |   fulldomain=$1 | ||||||
|  |   txtvalue=$2 | ||||||
|  | 
 | ||||||
|  |   _info "Using servercow" | ||||||
|  |   _debug fulldomain "$fulldomain" | ||||||
|  |   _debug txtvalue "$txtvalue" | ||||||
|  | 
 | ||||||
|  |   SERVERCOW_API_Username="${SERVERCOW_API_Username:-$(_readaccountconf_mutable SERVERCOW_API_Username)}" | ||||||
|  |   SERVERCOW_API_Password="${SERVERCOW_API_Password:-$(_readaccountconf_mutable SERVERCOW_API_Password)}" | ||||||
|  |   if [ -z "$SERVERCOW_API_Username" ] || [ -z "$SERVERCOW_API_Password" ]; then | ||||||
|  |     SERVERCOW_API_Username="" | ||||||
|  |     SERVERCOW_API_Password="" | ||||||
|  |     _err "You don't specify servercow api username and password yet." | ||||||
|  |     _err "Please create your username and password and try again." | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # save the credentials to the account conf file | ||||||
|  |   _saveaccountconf_mutable SERVERCOW_API_Username "$SERVERCOW_API_Username" | ||||||
|  |   _saveaccountconf_mutable SERVERCOW_API_Password "$SERVERCOW_API_Password" | ||||||
|  | 
 | ||||||
|  |   _debug "First detect the root zone" | ||||||
|  |   if ! _get_root "$fulldomain"; then | ||||||
|  |     _err "invalid domain" | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   _debug _sub_domain "$_sub_domain" | ||||||
|  |   _debug _domain "$_domain" | ||||||
|  | 
 | ||||||
|  |   if _servercow_api POST "$_domain" "{\"type\":\"TXT\",\"name\":\"$fulldomain\",\"content\":\"$txtvalue\",\"ttl\":20}"; then | ||||||
|  |     if printf -- "%s" "$response" | grep "ok" >/dev/null; then | ||||||
|  |       _info "Added, OK" | ||||||
|  |       return 0 | ||||||
|  |     else | ||||||
|  |       _err "add txt record error." | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  |   _err "add txt record error." | ||||||
|  | 
 | ||||||
|  |   return 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Usage fulldomain txtvalue | ||||||
|  | # Remove the txt record after validation | ||||||
|  | dns_servercow_rm() { | ||||||
|  |   fulldomain=$1 | ||||||
|  |   txtvalue=$2 | ||||||
|  | 
 | ||||||
|  |   _info "Using servercow" | ||||||
|  |   _debug fulldomain "$fulldomain" | ||||||
|  |   _debug txtvalue "$fulldomain" | ||||||
|  | 
 | ||||||
|  |   SERVERCOW_API_Username="${SERVERCOW_API_Username:-$(_readaccountconf_mutable SERVERCOW_API_Username)}" | ||||||
|  |   SERVERCOW_API_Password="${SERVERCOW_API_Password:-$(_readaccountconf_mutable SERVERCOW_API_Password)}" | ||||||
|  |   if [ -z "$SERVERCOW_API_Username" ] || [ -z "$SERVERCOW_API_Password" ]; then | ||||||
|  |     SERVERCOW_API_Username="" | ||||||
|  |     SERVERCOW_API_Password="" | ||||||
|  |     _err "You don't specify servercow api username and password yet." | ||||||
|  |     _err "Please create your username and password and try again." | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   _debug "First detect the root zone" | ||||||
|  |   if ! _get_root "$fulldomain"; then | ||||||
|  |     _err "invalid domain" | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   _debug _sub_domain "$_sub_domain" | ||||||
|  |   _debug _domain "$_domain" | ||||||
|  | 
 | ||||||
|  |   if _servercow_api DELETE "$_domain" "{\"type\":\"TXT\",\"name\":\"$fulldomain\"}"; then | ||||||
|  |     if printf -- "%s" "$response" | grep "ok" >/dev/null; then | ||||||
|  |       _info "Deleted, OK" | ||||||
|  |       _contains "$response" '"message":"ok"' | ||||||
|  |     else | ||||||
|  |       _err "delete txt record error." | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ####################  Private functions below ################################## | ||||||
|  | 
 | ||||||
|  | # _acme-challenge.www.domain.com | ||||||
|  | # returns | ||||||
|  | #  _sub_domain=_acme-challenge.www | ||||||
|  | #  _domain=domain.com | ||||||
|  | _get_root() { | ||||||
|  |   fulldomain=$1 | ||||||
|  |   i=2 | ||||||
|  |   p=1 | ||||||
|  | 
 | ||||||
|  |   while true; do | ||||||
|  |     _domain=$(printf "%s" "$fulldomain" | cut -d . -f $i-100) | ||||||
|  | 
 | ||||||
|  |     _debug _domain "$_domain" | ||||||
|  |     if [ -z "$_domain" ]; then | ||||||
|  |       # not valid | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if ! _servercow_api GET "$_domain"; then | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if ! _contains "$response" '"error":"no such domain in user context"' >/dev/null; then | ||||||
|  |       _sub_domain=$(printf "%s" "$fulldomain" | cut -d . -f 1-$p) | ||||||
|  |       if [ -z "$_sub_domain" ]; then | ||||||
|  |         # not valid | ||||||
|  |         return 1 | ||||||
|  |       fi | ||||||
|  | 
 | ||||||
|  |       return 0 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     p=$i | ||||||
|  |     i=$(_math "$i" + 1) | ||||||
|  |   done | ||||||
|  | 
 | ||||||
|  |   return 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | _servercow_api() { | ||||||
|  |   method=$1 | ||||||
|  |   domain=$2 | ||||||
|  |   data="$3" | ||||||
|  | 
 | ||||||
|  |   export _H1="Content-Type: application/json" | ||||||
|  |   export _H2="X-Auth-Username: $SERVERCOW_API_Username" | ||||||
|  |   export _H3="X-Auth-Password: $SERVERCOW_API_Password" | ||||||
|  | 
 | ||||||
|  |   if [ "$method" != "GET" ]; then | ||||||
|  |     _debug data "$data" | ||||||
|  |     response="$(_post "$data" "$SERVERCOW_API/$domain" "" "$method")" | ||||||
|  |   else | ||||||
|  |     response="$(_get "$SERVERCOW_API/$domain")" | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   if [ "$?" != "0" ]; then | ||||||
|  |     _err "error $domain" | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  |   _debug2 response "$response" | ||||||
|  |   return 0 | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user