Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(deploy_ali_cdn): support Alibaba Cloud CDN deployment #5205

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from

Conversation

Comment on lines +29 to +40
Ali_Key="${Ali_Key:-$(_readaccountconf_mutable Ali_Key)}"
Ali_Secret="${Ali_Secret:-$(_readaccountconf_mutable Ali_Secret)}"
if [ -z "$Ali_Key" ] || [ -z "$Ali_Secret" ]; then
Ali_Key=""
Ali_Secret=""
_err "You don't specify aliyun api key and secret yet."
return 1
fi

#save the api key and secret to the account conf file.
_saveaccountconf_mutable Ali_Key "$Ali_Key"
_saveaccountconf_mutable Ali_Secret "$Ali_Secret"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy from

Ali_Key="${Ali_Key:-$(_readaccountconf_mutable Ali_Key)}"
Ali_Secret="${Ali_Secret:-$(_readaccountconf_mutable Ali_Secret)}"
if [ -z "$Ali_Key" ] || [ -z "$Ali_Secret" ]; then
Ali_Key=""
Ali_Secret=""
_err "You don't specify aliyun api key and secret yet."
return 1
fi
#save the api key and secret to the account conf file.
_saveaccountconf_mutable Ali_Key "$Ali_Key"
_saveaccountconf_mutable Ali_Secret "$Ali_Secret"

Comment on lines +129 to +139
# stdin stdout
_url_encode_upper() {
encoded=$(_url_encode)

for match in $(echo "$encoded" | _egrep_o '%..' | sort -u); do
upper=$(echo "$match" | _upper_case)
encoded=$(echo "$encoded" | sed "s/$match/$upper/g")
done

echo "$encoded"
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alibaba Cloud API signature needs parameters encoded in upper-case.

_url_encode function from acme.sh can only encode with lower-case.

We have an ali_urlencode function from dns_ali.sh but it does not support multi-line strings.

Maybe we can add an argument to _url_encode function to make it support upper-case? (it only needs a very simple change in the *) case).

Copy link
Contributor Author

@PMExtra PMExtra Jul 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

acme.sh/acme.sh

Lines 884 to 887 in 0d8a314

#other hex
*)
printf '%%%s' "$_hex_code"
;;

Can we change it to:

*) 
   case "$1" in
   '[uU]*') # for upper-case
      printf '%%%s' "$_hex_code" | _upper_case
      ;;
   *) # default to lower-case
      printf '%%%s' "$_hex_code"
      ;;
   esac
   ;;

Comment on lines +102 to +127
_ali_urlencode() {
_str="$1"
_str_len=${#_str}
_u_i=1
while [ "$_u_i" -le "$_str_len" ]; do
_str_c="$(printf "%s" "$_str" | cut -c "$_u_i")"
case $_str_c in [a-zA-Z0-9.~_-])
printf "%s" "$_str_c"
;;
*)
printf "%%%02X" "'$_str_c"
;;
esac
_u_i="$(_math "$_u_i" + 1)"
done
}

_ali_nonce() {
#_head_n 1 </dev/urandom | _digest "sha256" hex | cut -c 1-31
#Not so good...
date +"%s%N" | sed 's/%N//g'
}

_timestamp() {
date -u +"%Y-%m-%dT%H%%3A%M%%3A%SZ"
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment on lines +69 to +100
# act ign mtd
_ali_rest() {
act="$1"
ign="$2"
mtd="$3"

signature=$(printf "%s" "$mtd&%2F&$(_ali_urlencode "$query")" | _hmac "sha1" "$(printf "%s" "$Ali_Secret&" | _hex_dump | tr -d " ")" | _base64)
signature=$(_ali_urlencode "$signature")
url="$Ali_API?$query&Signature=$signature"

if [ "$mtd" = "GET" ]; then
response="$(_get "$url")"
else
# post payload is not supported yet because of signature
response="$(_post "" "$url")"
fi

_ret="$?"
_debug2 response "$response"
if [ "$_ret" != "0" ]; then
_err "Error <$act>"
return 1
fi

if [ -z "$ign" ]; then
message="$(echo "$response" | _egrep_o "\"Message\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")"
if [ "$message" ]; then
_err "$message"
return 1
fi
fi
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reference https://github.com/acmesh-official/acme.sh/blob/3.0.7/dnsapi/dns_ali.sh

However, the original method was hard coded with the GET method.

So, I made a new argument to specify the method.

Notice that Alibaba Cloud API supports passing the parameters by either query or body. (https://help.aliyun.com/zh/sdk/product-overview/rpc-mechanism#section-9x3-wo3-8l9)

But we must sign with all the parameters, in alphabetical order, regardless of where they come from.

So, I didn't support the post-payload yet.

@PMExtra
Copy link
Contributor Author

PMExtra commented Jul 17, 2024

Solve #1461

@iflamed
Copy link

iflamed commented Jul 17, 2024

Solve #1461

How to use this deploy script?

@PMExtra
Copy link
Contributor Author

PMExtra commented Jul 18, 2024

@iflamed

# This deployment required following variables
# export Ali_Key="ALIACCESSKEY"
# export Ali_Secret="ALISECRETKEY"
# export DEPLOY_ALI_CDN_DOMAIN="cdn.example.com"
# If you have more than one domain, just
# export DEPLOY_ALI_CDN_DOMAIN="cdn1.example.com cdn2.example.com"
#
# The credentials are shared with all domains, also shared with dns_ali api

For example:

export Ali_Key=xxxx
export Ali_Secret=xxxx
export DEPLOY_ALI_CDN_DOMAIN=cdn.example.com # default to the certificate domain if not specified
acme.sh --deploy --deploy-hook ali_cdn -d example.com

or using docker:

docker exec \
  -e Ali_Key=xxxx \
  -e Ali_Secret=xxxx \
  -e DEPLOY_ALI_CDN_DOMAIN=cdn.example.com \
  acme.sh --deploy --deploy-hook ali_cdn -d example.com

@PMExtra
Copy link
Contributor Author

PMExtra commented Jul 18, 2024

@iflamed wiki: https://github.com/acmesh-official/acme.sh/wiki/deployhooks#33-deploy-your-certificate-to-alibaba-cloud-cdn-aliyun

@iflamed
Copy link

iflamed commented Jul 18, 2024

@iflamed wiki: https://github.com/acmesh-official/acme.sh/wiki/deployhooks#33-deploy-your-certificate-to-alibaba-cloud-cdn-aliyun

Hope this PR merged ASAP.

@jtwangfos
Copy link

jtwangfos commented Jul 26, 2024

Great job man, thanks a lot. <3

@ShirasawaSama
Copy link

ShirasawaSama commented Aug 2, 2024

@PMExtra Can DCDN be supported? Thanks.

Great job.

是否可以支持DCDN?

@PMExtra
Copy link
Contributor Author

PMExtra commented Aug 2, 2024

@ShirasawaSama 目前没有支持,但只要把这一行代码的 Cdn 改成 Dcdn 应该就行了,你暂且可以复制一份改一下先用着,回头我考虑下加个设置来控制。

query=$query'&Action=SetCdnDomainSSLCertificate'

@PMExtra
Copy link
Contributor Author

PMExtra commented Aug 2, 2024

@ShirasawaSama 哦,还漏了API版本,一共改两处,一个是 CdnDcdn,另一个是 2018-05-102018-01-15

acme.sh/deploy/ali_cdn.sh

Lines 142 to 157 in 945b7de

_set_cdn_domain_ssl_certificate_query() {
query=''
query=$query'AccessKeyId='$Ali_Key
query=$query'&Action=SetCdnDomainSSLCertificate'
query=$query'&CertType=upload'
query=$query'&DomainName='$1
query=$query'&Format=json'
query=$query'&SSLPri='$3
query=$query'&SSLProtocol=on'
query=$query'&SSLPub='$2
query=$query'&SignatureMethod=HMAC-SHA1'
query=$query"&SignatureNonce=$(_ali_nonce)"
query=$query'&SignatureVersion=1.0'
query=$query'&Timestamp='$(_timestamp)
query=$query'&Version=2018-05-10'
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants