|
@@ -139,6 +139,7 @@ __red() {
|
|
|
}
|
|
|
|
|
|
_printargs() {
|
|
|
+ _exitstatus="$?"
|
|
|
if [ -z "$NO_TIMESTAMP" ] || [ "$NO_TIMESTAMP" = "0" ]; then
|
|
|
printf -- "%s" "[$(date)] "
|
|
|
fi
|
|
@@ -148,6 +149,8 @@ _printargs() {
|
|
|
printf -- "%s" "$1='$2'"
|
|
|
fi
|
|
|
printf "\n"
|
|
|
+ # return the saved exit status
|
|
|
+ return "$_exitstatus"
|
|
|
}
|
|
|
|
|
|
_dlg_versions() {
|
|
@@ -183,6 +186,7 @@ _dlg_versions() {
|
|
|
|
|
|
#class
|
|
|
_syslog() {
|
|
|
+ _exitstatus="$?"
|
|
|
if [ "${SYS_LOG:-$SYSLOG_LEVEL_NONE}" = "$SYSLOG_LEVEL_NONE" ]; then
|
|
|
return
|
|
|
fi
|
|
@@ -196,6 +200,7 @@ _syslog() {
|
|
|
fi
|
|
|
fi
|
|
|
$__logger_i -t "$PROJECT_NAME" -p "$_logclass" "$(_printargs "$@")" >/dev/null 2>&1
|
|
|
+ return "$_exitstatus"
|
|
|
}
|
|
|
|
|
|
_log() {
|
|
@@ -1188,7 +1193,7 @@ _ss() {
|
|
|
|
|
|
if _exists "netstat"; then
|
|
|
_debug "Using: netstat"
|
|
|
- if netstat -h 2>&1 | grep "\-p proto" >/dev/null; then
|
|
|
+ if netstat -help 2>&1 | grep "\-p proto" >/dev/null; then
|
|
|
#for windows version netstat tool
|
|
|
netstat -an -p tcp | grep "LISTENING" | grep ":$_port "
|
|
|
else
|
|
@@ -1822,23 +1827,29 @@ _send_signed_request() {
|
|
|
nonceurl="$ACME_NEW_NONCE"
|
|
|
if _post "" "$nonceurl" "" "HEAD" "$__request_conent_type"; then
|
|
|
_headers="$(cat "$HTTP_HEADER")"
|
|
|
+ _debug2 _headers "$_headers"
|
|
|
+ _CACHED_NONCE="$(echo "$_headers" | grep -i "Replay-Nonce:" | _head_n 1 | tr -d "\r\n " | cut -d ':' -f 2)"
|
|
|
fi
|
|
|
fi
|
|
|
- if [ -z "$_headers" ]; then
|
|
|
+ if [ -z "$_CACHED_NONCE" ]; then
|
|
|
_debug2 "Get nonce with GET. ACME_DIRECTORY" "$ACME_DIRECTORY"
|
|
|
nonceurl="$ACME_DIRECTORY"
|
|
|
_headers="$(_get "$nonceurl" "onlyheader")"
|
|
|
+ _debug2 _headers "$_headers"
|
|
|
+ _CACHED_NONCE="$(echo "$_headers" | grep -i "Replay-Nonce:" | _head_n 1 | tr -d "\r\n " | cut -d ':' -f 2)"
|
|
|
fi
|
|
|
-
|
|
|
+ if [ -z "$_CACHED_NONCE" ] && [ "$ACME_NEW_NONCE" ]; then
|
|
|
+ _debug2 "Get nonce with GET. ACME_NEW_NONCE" "$ACME_NEW_NONCE"
|
|
|
+ nonceurl="$ACME_NEW_NONCE"
|
|
|
+ _headers="$(_get "$nonceurl" "onlyheader")"
|
|
|
+ _debug2 _headers "$_headers"
|
|
|
+ _CACHED_NONCE="$(echo "$_headers" | grep -i "Replay-Nonce:" | _head_n 1 | tr -d "\r\n " | cut -d ':' -f 2)"
|
|
|
+ fi
|
|
|
+ _debug2 _CACHED_NONCE "$_CACHED_NONCE"
|
|
|
if [ "$?" != "0" ]; then
|
|
|
_err "Can not connect to $nonceurl to get nonce."
|
|
|
return 1
|
|
|
fi
|
|
|
-
|
|
|
- _debug2 _headers "$_headers"
|
|
|
-
|
|
|
- _CACHED_NONCE="$(echo "$_headers" | grep "Replay-Nonce:" | _head_n 1 | tr -d "\r\n " | cut -d ':' -f 2)"
|
|
|
- _debug2 _CACHED_NONCE "$_CACHED_NONCE"
|
|
|
else
|
|
|
_debug2 "Use _CACHED_NONCE" "$_CACHED_NONCE"
|
|
|
fi
|
|
@@ -1882,29 +1893,34 @@ _send_signed_request() {
|
|
|
_err "Can not post to $url"
|
|
|
return 1
|
|
|
fi
|
|
|
- _debug2 original "$response"
|
|
|
- response="$(echo "$response" | _normalizeJson)"
|
|
|
|
|
|
responseHeaders="$(cat "$HTTP_HEADER")"
|
|
|
-
|
|
|
_debug2 responseHeaders "$responseHeaders"
|
|
|
- _debug2 response "$response"
|
|
|
+
|
|
|
code="$(grep "^HTTP" "$HTTP_HEADER" | _tail_n 1 | cut -d " " -f 2 | tr -d "\r\n")"
|
|
|
_debug code "$code"
|
|
|
|
|
|
- _CACHED_NONCE="$(echo "$responseHeaders" | grep "Replay-Nonce:" | _head_n 1 | tr -d "\r\n " | cut -d ':' -f 2)"
|
|
|
-
|
|
|
- _body="$response"
|
|
|
- if [ "$needbase64" ]; then
|
|
|
- _body="$(echo "$_body" | _dbase64 | tr -d '\0')"
|
|
|
- _debug3 _body "$_body"
|
|
|
+ _debug2 original "$response"
|
|
|
+ if echo "$responseHeaders" | grep -i "Content-Type: application/json" >/dev/null 2>&1; then
|
|
|
+ response="$(echo "$response" | _normalizeJson)"
|
|
|
fi
|
|
|
+ _debug2 response "$response"
|
|
|
|
|
|
- if _contains "$_body" "JWS has invalid anti-replay nonce" || _contains "$_body" "JWS has an invalid anti-replay nonce"; then
|
|
|
- _info "It seems the CA server is busy now, let's wait and retry. Sleeping $_sleep_retry_sec seconds."
|
|
|
- _CACHED_NONCE=""
|
|
|
- _sleep $_sleep_retry_sec
|
|
|
- continue
|
|
|
+ _CACHED_NONCE="$(echo "$responseHeaders" | grep -i "Replay-Nonce:" | _head_n 1 | tr -d "\r\n " | cut -d ':' -f 2)"
|
|
|
+
|
|
|
+ if ! _startswith "$code" "2"; then
|
|
|
+ _body="$response"
|
|
|
+ if [ "$needbase64" ]; then
|
|
|
+ _body="$(echo "$_body" | _dbase64 multiline)"
|
|
|
+ _debug3 _body "$_body"
|
|
|
+ fi
|
|
|
+
|
|
|
+ if _contains "$_body" "JWS has invalid anti-replay nonce" || _contains "$_body" "JWS has an invalid anti-replay nonce"; then
|
|
|
+ _info "It seems the CA server is busy now, let's wait and retry. Sleeping $_sleep_retry_sec seconds."
|
|
|
+ _CACHED_NONCE=""
|
|
|
+ _sleep $_sleep_retry_sec
|
|
|
+ continue
|
|
|
+ fi
|
|
|
fi
|
|
|
break
|
|
|
done
|
|
@@ -2050,6 +2066,7 @@ _clearcaconf() {
|
|
|
_startserver() {
|
|
|
content="$1"
|
|
|
ncaddr="$2"
|
|
|
+ _debug "content" "$content"
|
|
|
_debug "ncaddr" "$ncaddr"
|
|
|
|
|
|
_debug "startserver: $$"
|
|
@@ -2076,8 +2093,14 @@ _startserver() {
|
|
|
SOCAT_OPTIONS="$SOCAT_OPTIONS,bind=${ncaddr}"
|
|
|
fi
|
|
|
|
|
|
+ _content_len="$(printf "%s" "$content" | wc -c)"
|
|
|
+ _debug _content_len "$_content_len"
|
|
|
_debug "_NC" "$_NC $SOCAT_OPTIONS"
|
|
|
- $_NC $SOCAT_OPTIONS SYSTEM:"sleep 1; echo HTTP/1.0 200 OK; echo ; echo $content; echo;" &
|
|
|
+ $_NC $SOCAT_OPTIONS SYSTEM:"sleep 1; \
|
|
|
+echo 'HTTP/1.0 200 OK'; \
|
|
|
+echo 'Content-Length\: $_content_len'; \
|
|
|
+echo ''; \
|
|
|
+printf '$content';" &
|
|
|
serverproc="$!"
|
|
|
}
|
|
|
|
|
@@ -2919,42 +2942,38 @@ _clearup() {
|
|
|
|
|
|
_clearupdns() {
|
|
|
_debug "_clearupdns"
|
|
|
- _debug "dnsadded" "$dnsadded"
|
|
|
- _debug "vlist" "$vlist"
|
|
|
- #dnsadded is "0" or "1" means dns-01 method was used for at least one domain
|
|
|
- if [ -z "$dnsadded" ] || [ -z "$vlist" ]; then
|
|
|
+ _debug "dns_entries" "$dns_entries"
|
|
|
+
|
|
|
+ if [ -z "$dns_entries" ]; then
|
|
|
_debug "skip dns."
|
|
|
return
|
|
|
fi
|
|
|
_info "Removing DNS records."
|
|
|
- ventries=$(echo "$vlist" | tr ',' ' ')
|
|
|
- _alias_index=1
|
|
|
- for ventry in $ventries; do
|
|
|
- d=$(echo "$ventry" | cut -d "$sep" -f 1)
|
|
|
- keyauthorization=$(echo "$ventry" | cut -d "$sep" -f 2)
|
|
|
- vtype=$(echo "$ventry" | cut -d "$sep" -f 4)
|
|
|
- _currentRoot=$(echo "$ventry" | cut -d "$sep" -f 5)
|
|
|
- txt="$(printf "%s" "$keyauthorization" | _digest "sha256" | _url_replace)"
|
|
|
- _debug txt "$txt"
|
|
|
- if [ "$keyauthorization" = "$STATE_VERIFIED" ]; then
|
|
|
- _debug "$d is already verified, skip $vtype."
|
|
|
- _alias_index="$(_math "$_alias_index" + 1)"
|
|
|
- continue
|
|
|
- fi
|
|
|
|
|
|
- if [ "$vtype" != "$VTYPE_DNS" ]; then
|
|
|
- _debug "Skip $d for $vtype"
|
|
|
- continue
|
|
|
+ for entry in $dns_entries; do
|
|
|
+ d=$(_getfield "$entry" 1)
|
|
|
+ txtdomain=$(_getfield "$entry" 2)
|
|
|
+ aliasDomain=$(_getfield "$entry" 3)
|
|
|
+ txt=$(_getfield "$entry" 5)
|
|
|
+ d_api=$(_getfield "$entry" 6)
|
|
|
+ _debug "d" "$d"
|
|
|
+ _debug "txtdomain" "$txtdomain"
|
|
|
+ _debug "aliasDomain" "$aliasDomain"
|
|
|
+ _debug "txt" "$txt"
|
|
|
+ _debug "d_api" "$d_api"
|
|
|
+ if [ "$d_api" = "$txt" ]; then
|
|
|
+ d_api=""
|
|
|
fi
|
|
|
|
|
|
- d_api="$(_findHook "$d" dnsapi "$_currentRoot")"
|
|
|
- _debug d_api "$d_api"
|
|
|
-
|
|
|
if [ -z "$d_api" ]; then
|
|
|
_info "Not Found domain api file: $d_api"
|
|
|
continue
|
|
|
fi
|
|
|
|
|
|
+ if [ "$aliasDomain" ]; then
|
|
|
+ txtdomain="$aliasDomain"
|
|
|
+ fi
|
|
|
+
|
|
|
(
|
|
|
if ! . "$d_api"; then
|
|
|
_err "Load file $d_api error. Please check your api file and try again."
|
|
@@ -2967,24 +2986,6 @@ _clearupdns() {
|
|
|
return 1
|
|
|
fi
|
|
|
|
|
|
- _dns_root_d="$d"
|
|
|
- if _startswith "$_dns_root_d" "*."; then
|
|
|
- _dns_root_d="$(echo "$_dns_root_d" | sed 's/*.//')"
|
|
|
- fi
|
|
|
-
|
|
|
- _d_alias="$(_getfield "$_challenge_alias" "$_alias_index")"
|
|
|
- _alias_index="$(_math "$_alias_index" + 1)"
|
|
|
- _debug "_d_alias" "$_d_alias"
|
|
|
- if [ "$_d_alias" ]; then
|
|
|
- if _startswith "$_d_alias" "$DNS_ALIAS_PREFIX"; then
|
|
|
- txtdomain="$(echo "$_d_alias" | sed "s/$DNS_ALIAS_PREFIX//")"
|
|
|
- else
|
|
|
- txtdomain="_acme-challenge.$_d_alias"
|
|
|
- fi
|
|
|
- else
|
|
|
- txtdomain="_acme-challenge.$_dns_root_d"
|
|
|
- fi
|
|
|
-
|
|
|
if ! $rmcommand "$txtdomain" "$txt"; then
|
|
|
_err "Error removing txt for domain:$txtdomain"
|
|
|
return 1
|
|
@@ -3074,6 +3075,7 @@ _on_before_issue() {
|
|
|
_info "Standalone mode."
|
|
|
if [ -z "$Le_HTTPPort" ]; then
|
|
|
Le_HTTPPort=80
|
|
|
+ _cleardomainconf "Le_HTTPPort"
|
|
|
else
|
|
|
_savedomainconf "Le_HTTPPort" "$Le_HTTPPort"
|
|
|
fi
|
|
@@ -3281,7 +3283,7 @@ _regAccount() {
|
|
|
fi
|
|
|
|
|
|
_debug2 responseHeaders "$responseHeaders"
|
|
|
- _accUri="$(echo "$responseHeaders" | grep "^Location:" | _head_n 1 | cut -d ' ' -f 2 | tr -d "\r\n")"
|
|
|
+ _accUri="$(echo "$responseHeaders" | grep -i "^Location:" | _head_n 1 | cut -d ' ' -f 2 | tr -d "\r\n")"
|
|
|
_debug "_accUri" "$_accUri"
|
|
|
if [ -z "$_accUri" ]; then
|
|
|
_err "Can not find account id url."
|
|
@@ -3447,12 +3449,119 @@ __trigger_validation() {
|
|
|
_t_vtype="$3"
|
|
|
_debug2 _t_vtype "$_t_vtype"
|
|
|
if [ "$ACME_VERSION" = "2" ]; then
|
|
|
- _send_signed_request "$_t_url" "{\"keyAuthorization\": \"$_t_key_authz\"}"
|
|
|
+ _send_signed_request "$_t_url" "{}"
|
|
|
else
|
|
|
_send_signed_request "$_t_url" "{\"resource\": \"challenge\", \"type\": \"$_t_vtype\", \"keyAuthorization\": \"$_t_key_authz\"}"
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
+#endpoint domain type
|
|
|
+_ns_lookup() {
|
|
|
+ _ns_ep="$1"
|
|
|
+ _ns_domain="$2"
|
|
|
+ _ns_type="$3"
|
|
|
+ _debug2 "_ns_ep" "$_ns_ep"
|
|
|
+ _debug2 "_ns_domain" "$_ns_domain"
|
|
|
+ _debug2 "_ns_type" "$_ns_type"
|
|
|
+
|
|
|
+ response="$(_H1="accept: application/dns-json" _get "$_ns_ep?name=$_ns_domain&type=$_ns_type")"
|
|
|
+ _ret=$?
|
|
|
+ _debug2 "response" "$response"
|
|
|
+ if [ "$_ret" != "0" ]; then
|
|
|
+ return $_ret
|
|
|
+ fi
|
|
|
+ _answers="$(echo "$response" | tr '{}' '<>' | _egrep_o '"Answer":\[[^]]*]' | tr '<>' '\n\n')"
|
|
|
+ _debug2 "_answers" "$_answers"
|
|
|
+ echo "$_answers"
|
|
|
+}
|
|
|
+
|
|
|
+#domain, type
|
|
|
+_ns_lookup_cf() {
|
|
|
+ _cf_ld="$1"
|
|
|
+ _cf_ld_type="$2"
|
|
|
+ _cf_ep="https://cloudflare-dns.com/dns-query"
|
|
|
+ _ns_lookup "$_cf_ep" "$_cf_ld" "$_cf_ld_type"
|
|
|
+}
|
|
|
+
|
|
|
+#domain, type
|
|
|
+_ns_purge_cf() {
|
|
|
+ _cf_d="$1"
|
|
|
+ _cf_d_type="$2"
|
|
|
+ _debug "Cloudflare purge $_cf_d_type record for domain $_cf_d"
|
|
|
+ _cf_purl="https://1.1.1.1/api/v1/purge?domain=$_cf_d&type=$_cf_d_type"
|
|
|
+ response="$(_post "" "$_cf_purl")"
|
|
|
+ _debug2 response "$response"
|
|
|
+}
|
|
|
+
|
|
|
+#txtdomain, alias, txt
|
|
|
+__check_txt() {
|
|
|
+ _c_txtdomain="$1"
|
|
|
+ _c_aliasdomain="$2"
|
|
|
+ _c_txt="$3"
|
|
|
+ _debug "_c_txtdomain" "$_c_txtdomain"
|
|
|
+ _debug "_c_aliasdomain" "$_c_aliasdomain"
|
|
|
+ _debug "_c_txt" "$_c_txt"
|
|
|
+ _answers="$(_ns_lookup_cf "$_c_aliasdomain" TXT)"
|
|
|
+ _contains "$_answers" "$_c_txt"
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+#txtdomain
|
|
|
+__purge_txt() {
|
|
|
+ _p_txtdomain="$1"
|
|
|
+ _debug _p_txtdomain "$_p_txtdomain"
|
|
|
+ _ns_purge_cf "$_p_txtdomain" "TXT"
|
|
|
+}
|
|
|
+
|
|
|
+#wait and check each dns entries
|
|
|
+_check_dns_entries() {
|
|
|
+ _success_txt=","
|
|
|
+ _end_time="$(_time)"
|
|
|
+ _end_time="$(_math "$_end_time" + 1200)" #let's check no more than 20 minutes.
|
|
|
+
|
|
|
+ while [ "$(_time)" -le "$_end_time" ]; do
|
|
|
+ _left=""
|
|
|
+ for entry in $dns_entries; do
|
|
|
+ d=$(_getfield "$entry" 1)
|
|
|
+ txtdomain=$(_getfield "$entry" 2)
|
|
|
+ aliasDomain=$(_getfield "$entry" 3)
|
|
|
+ txt=$(_getfield "$entry" 5)
|
|
|
+ d_api=$(_getfield "$entry" 6)
|
|
|
+ _debug "d" "$d"
|
|
|
+ _debug "txtdomain" "$txtdomain"
|
|
|
+ _debug "aliasDomain" "$aliasDomain"
|
|
|
+ _debug "txt" "$txt"
|
|
|
+ _debug "d_api" "$d_api"
|
|
|
+ _info "Checking $d for $aliasDomain"
|
|
|
+ if _contains "$_success_txt" ",$txt,"; then
|
|
|
+ _info "Already success, continue next one."
|
|
|
+ continue
|
|
|
+ fi
|
|
|
+
|
|
|
+ if __check_txt "$txtdomain" "$aliasDomain" "$txt"; then
|
|
|
+ _info "Domain $d '$aliasDomain' success."
|
|
|
+ _success_txt="$_success_txt,$txt,"
|
|
|
+ continue
|
|
|
+ fi
|
|
|
+ _left=1
|
|
|
+ _info "Not valid yet, let's wait 10 seconds and check next one."
|
|
|
+ _sleep 10
|
|
|
+ __purge_txt "$txtdomain"
|
|
|
+ if [ "$txtdomain" != "$aliasDomain" ]; then
|
|
|
+ __purge_txt "$aliasDomain"
|
|
|
+ fi
|
|
|
+ done
|
|
|
+ if [ "$_left" ]; then
|
|
|
+ _info "Let's wait 10 seconds and check again".
|
|
|
+ _sleep 10
|
|
|
+ else
|
|
|
+ _info "All success, let's return"
|
|
|
+ break
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
#webroot, domain domainlist keylength
|
|
|
issue() {
|
|
|
if [ -z "$2" ]; then
|
|
@@ -3776,6 +3885,7 @@ $_authorizations_map"
|
|
|
done
|
|
|
_debug vlist "$vlist"
|
|
|
#add entry
|
|
|
+ dns_entries=""
|
|
|
dnsadded=""
|
|
|
ventries=$(echo "$vlist" | tr "$dvsep" ' ')
|
|
|
_alias_index=1
|
|
@@ -3806,8 +3916,10 @@ $_authorizations_map"
|
|
|
else
|
|
|
txtdomain="_acme-challenge.$_d_alias"
|
|
|
fi
|
|
|
+ dns_entries="${dns_entries}${_dns_root_d}${dvsep}_acme-challenge.$_dns_root_d$dvsep$txtdomain$dvsep$_currentRoot"
|
|
|
else
|
|
|
txtdomain="_acme-challenge.$_dns_root_d"
|
|
|
+ dns_entries="${dns_entries}${_dns_root_d}${dvsep}_acme-challenge.$_dns_root_d$dvsep$dvsep$_currentRoot"
|
|
|
fi
|
|
|
_debug txtdomain "$txtdomain"
|
|
|
txt="$(printf "%s" "$keyauthorization" | _digest "sha256" | _url_replace)"
|
|
@@ -3816,7 +3928,9 @@ $_authorizations_map"
|
|
|
d_api="$(_findHook "$_dns_root_d" dnsapi "$_currentRoot")"
|
|
|
|
|
|
_debug d_api "$d_api"
|
|
|
-
|
|
|
+ dns_entries="$dns_entries$dvsep$txt${dvsep}$d_api
|
|
|
+"
|
|
|
+ _debug2 "$dns_entries"
|
|
|
if [ "$d_api" ]; then
|
|
|
_info "Found domain api file: $d_api"
|
|
|
else
|
|
@@ -3870,15 +3984,21 @@ $_authorizations_map"
|
|
|
|
|
|
fi
|
|
|
|
|
|
- if [ "$dnsadded" = '1' ]; then
|
|
|
+ if [ "$dns_entries" ]; then
|
|
|
if [ -z "$Le_DNSSleep" ]; then
|
|
|
- Le_DNSSleep="$DEFAULT_DNS_SLEEP"
|
|
|
+ _info "Let's check each dns records now. Sleep 20 seconds first."
|
|
|
+ _sleep 20
|
|
|
+ if ! _check_dns_entries; then
|
|
|
+ _err "check dns error."
|
|
|
+ _on_issue_err "$_post_hook"
|
|
|
+ _clearup
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
else
|
|
|
_savedomainconf "Le_DNSSleep" "$Le_DNSSleep"
|
|
|
+ _info "Sleep $(__green $Le_DNSSleep) seconds for the txt records to take effect"
|
|
|
+ _sleep "$Le_DNSSleep"
|
|
|
fi
|
|
|
-
|
|
|
- _info "Sleep $(__green $Le_DNSSleep) seconds for the txt records to take effect"
|
|
|
- _sleep "$Le_DNSSleep"
|
|
|
fi
|
|
|
|
|
|
NGINX_RESTORE_VLIST=""
|
|
@@ -4099,28 +4219,74 @@ $_authorizations_map"
|
|
|
der="$(_getfile "${CSR_PATH}" "${BEGIN_CSR}" "${END_CSR}" | tr -d "\r\n" | _url_replace)"
|
|
|
|
|
|
if [ "$ACME_VERSION" = "2" ]; then
|
|
|
+ _info "Lets finalize the order, Le_OrderFinalize: $Le_OrderFinalize"
|
|
|
if ! _send_signed_request "${Le_OrderFinalize}" "{\"csr\": \"$der\"}"; then
|
|
|
_err "Sign failed."
|
|
|
_on_issue_err "$_post_hook"
|
|
|
return 1
|
|
|
fi
|
|
|
if [ "$code" != "200" ]; then
|
|
|
- _err "Sign failed, code is not 200."
|
|
|
+ _err "Sign failed, finalize code is not 200."
|
|
|
_err "$response"
|
|
|
_on_issue_err "$_post_hook"
|
|
|
return 1
|
|
|
fi
|
|
|
- Le_LinkCert="$(echo "$response" | tr -d '\r\n' | _egrep_o '"certificate" *: *"[^"]*"' | cut -d '"' -f 4)"
|
|
|
+ Le_LinkOrder="$(echo "$responseHeaders" | grep -i '^Location.*$' | _tail_n 1 | tr -d "\r\n" | cut -d " " -f 2)"
|
|
|
+ if [ -z "$Le_LinkOrder" ]; then
|
|
|
+ _err "Sign error, can not get order link location header"
|
|
|
+ _err "responseHeaders" "$responseHeaders"
|
|
|
+ _on_issue_err "$_post_hook"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ _savedomainconf "Le_LinkOrder" "$Le_LinkOrder"
|
|
|
+
|
|
|
+ _link_cert_retry=0
|
|
|
+ _MAX_CERT_RETRY=5
|
|
|
+ while [ -z "$Le_LinkCert" ] && [ "$_link_cert_retry" -lt "$_MAX_CERT_RETRY" ]; do
|
|
|
+ if _contains "$response" "\"status\":\"valid\""; then
|
|
|
+ _debug "Order status is valid."
|
|
|
+ Le_LinkCert="$(echo "$response" | tr -d '\r\n' | _egrep_o '"certificate" *: *"[^"]*"' | cut -d '"' -f 4)"
|
|
|
+ _debug Le_LinkCert "$Le_LinkCert"
|
|
|
+ if [ -z "$Le_LinkCert" ]; then
|
|
|
+ _err "Sign error, can not find Le_LinkCert"
|
|
|
+ _err "$response"
|
|
|
+ _on_issue_err "$_post_hook"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ break
|
|
|
+ elif _contains "$response" "\"processing\""; then
|
|
|
+ _info "Order status is processing, lets sleep and retry."
|
|
|
+ _sleep 2
|
|
|
+ else
|
|
|
+ _err "Sign error, wrong status"
|
|
|
+ _err "$response"
|
|
|
+ _on_issue_err "$_post_hook"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ if ! _send_signed_request "$Le_LinkOrder"; then
|
|
|
+ _err "Sign failed, can not post to Le_LinkOrder cert:$Le_LinkOrder."
|
|
|
+ _err "$response"
|
|
|
+ _on_issue_err "$_post_hook"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ _link_cert_retry="$(_math $_link_cert_retry + 1)"
|
|
|
+ done
|
|
|
|
|
|
- _tempSignedResponse="$response"
|
|
|
- if ! _send_signed_request "$Le_LinkCert" "" "needbase64"; then
|
|
|
+ if [ -z "$Le_LinkCert" ]; then
|
|
|
+ _err "Sign failed, can not get Le_LinkCert, retry time limit."
|
|
|
+ _err "$response"
|
|
|
+ _on_issue_err "$_post_hook"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ _info "Download cert, Le_LinkCert: $Le_LinkCert"
|
|
|
+ if ! _send_signed_request "$Le_LinkCert"; then
|
|
|
_err "Sign failed, can not download cert:$Le_LinkCert."
|
|
|
_err "$response"
|
|
|
_on_issue_err "$_post_hook"
|
|
|
return 1
|
|
|
fi
|
|
|
|
|
|
- echo "$response" | _dbase64 "multiline" >"$CERT_PATH"
|
|
|
+ echo "$response" >"$CERT_PATH"
|
|
|
|
|
|
if [ "$(grep -- "$BEGIN_CERT" "$CERT_PATH" | wc -l)" -gt "1" ]; then
|
|
|
_debug "Found cert chain"
|
|
@@ -4131,7 +4297,7 @@ $_authorizations_map"
|
|
|
_end_n="$(_math $_end_n + 1)"
|
|
|
sed -n "${_end_n},9999p" "$CERT_FULLCHAIN_PATH" >"$CA_CERT_PATH"
|
|
|
fi
|
|
|
- response="$_tempSignedResponse"
|
|
|
+
|
|
|
else
|
|
|
if ! _send_signed_request "${ACME_NEW_ORDER}" "{\"resource\": \"$ACME_NEW_ORDER_RES\", \"csr\": \"$der\"}" "needbase64"; then
|
|
|
_err "Sign failed. $response"
|
|
@@ -4720,7 +4886,7 @@ _installcert() {
|
|
|
export CERT_KEY_PATH
|
|
|
export CA_CERT_PATH
|
|
|
export CERT_FULLCHAIN_PATH
|
|
|
- export Le_Domain
|
|
|
+ export Le_Domain="$_main_domain"
|
|
|
cd "$DOMAIN_PATH" && eval "$_reload_cmd"
|
|
|
); then
|
|
|
_info "$(__green "Reload success")"
|