-
-
Notifications
You must be signed in to change notification settings - Fork 5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
154 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
#!/usr/bin/env sh | ||
|
||
#export DEPLOY_TENCENT_SSL_SECRET_ID="AKIDz81d2cd22cdcdc2dcd1cc1d1A" | ||
#export DEPLOY_TENCENT_SSL_SECRET_KEY="Gu5t9abcabcaabcbabcbbbcbcbbccbbcb" | ||
|
||
tencent_ssl_deploy() { | ||
_cdomain="$1" | ||
_ckey="$2" | ||
_cfullchain="$5" | ||
|
||
_debug _cdomain "$_cdomain" | ||
_debug _ckey "$_ckey" | ||
_debug _cfullchain "$_cfullchain" | ||
|
||
_getdeployconf DEPLOY_TENCENT_SSL_SECRET_ID | ||
_getdeployconf DEPLOY_TENCENT_SSL_SECRET_KEY | ||
if [ -z "${DEPLOY_TENCENT_SSL_SECRET_ID}" ]; then | ||
_err "Please define DEPLOY_TENCENT_SSL_SECRET_ID." | ||
return 1 | ||
fi | ||
if [ -z "${DEPLOY_TENCENT_SSL_SECRET_KEY}" ]; then | ||
_err "Please define DEPLOY_TENCENT_SSL_SECRET_KEY." | ||
return 1 | ||
fi | ||
_savedeployconf DEPLOY_TENCENT_SSL_SECRET_ID "$DEPLOY_TENCENT_SSL_SECRET_ID" | ||
_savedeployconf DEPLOY_TENCENT_SSL_SECRET_KEY "$DEPLOY_TENCENT_SSL_SECRET_KEY" | ||
|
||
# https://cloud.tencent.com/document/api/400/41665 | ||
_payload="{\"CertificatePublicKey\":\"$(_json_encode <"$_cfullchain")\",\"CertificatePrivateKey\":\"$(_json_encode <"$_ckey")\",\"Alias\":\"acme.sh $_cdomain\"}" | ||
if ! cert_id="$(tencent_api_request_ssl "UploadCertificate" "$_payload" "CertificateId" )"; then | ||
return 1 | ||
fi | ||
_debug cert_id "$cert_id" | ||
|
||
_getdeployconf DEPLOY_TENCENT_SSL_CURRENT_CERTIFICATE_ID | ||
old_cert_id="$DEPLOY_TENCENT_SSL_CURRENT_CERTIFICATE_ID" | ||
# https://cloud.tencent.com/document/api/400/91649 | ||
# NOTE: no new cert id returned from UpdateCertificateInstance+cert_data | ||
# so it's necessary to upload cert first then UpdateCertificateInstance+new_cert_id | ||
if [ -n "${old_cert_id}" ]; then | ||
_payload="{\"OldCertificateId\":\"$old_cert_id\",\"CertificateId\":\"$cert_id\",\"ResourceTypes\":[\"clb\",\"cdn\",\"waf\",\"live\",\"ddos\",\"teo\",\"apigateway\",\"vod\",\"tke\",\"tcb\",\"tse\"]}" | ||
if ! tencent_api_request_ssl "UpdateCertificateInstance" "$_payload" "RequestId"; then | ||
return 1 | ||
fi | ||
_payload="{\"CertificateId\":\"$old_cert_id\"}" | ||
if ! tencent_api_request_ssl "DeleteCertificate" "$_payload" "RequestId"; then | ||
_err "Can not delete old certificate: $old_cert_id" | ||
# NOTE: non-exist old cert id will not break from UpdateCertificateInstance | ||
# break it here | ||
return 1 | ||
fi | ||
fi | ||
_savedeployconf DEPLOY_TENCENT_SSL_CURRENT_CERTIFICATE_ID "$cert_id" | ||
|
||
return 0 | ||
} | ||
|
||
tencent_api_request_ssl() { | ||
action=$1 | ||
payload=$2 | ||
response_field=$3 | ||
|
||
if ! response="$(tencent_api_request "ssl" "2019-12-05" "$action" "$payload")"; then | ||
_err "Error <$1>" | ||
return 1 | ||
fi | ||
|
||
err_message="$(echo "$response" | _egrep_o "\"Message\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")" | ||
if [ "$err_message" ]; then | ||
_err "$err_message" | ||
return 1 | ||
fi | ||
|
||
_debug response "$response" | ||
|
||
value="$(echo "$response" | _egrep_o "\"$response_field\":\"[^\"]*\"" | cut -d : -f 2 | tr -d \")" | ||
if [ -z "$value" ]; then | ||
_err "$response_field not found" | ||
return 1 | ||
fi | ||
echo "$value" | ||
} | ||
|
||
# shell client for tencent cloud api v3 | @author: rehiy | ||
# copy from dns_tencent.sh | ||
tencent_sha256() { | ||
printf %b "$@" | _digest sha256 hex | ||
} | ||
|
||
tencent_hmac_sha256() { | ||
k=$1 | ||
shift | ||
hex_key=$(printf %b "$k" | _hex_dump | tr -d ' ') | ||
printf %b "$@" | _hmac sha256 "$hex_key" hex | ||
} | ||
|
||
tencent_hmac_sha256_hexkey() { | ||
k=$1 | ||
shift | ||
printf %b "$@" | _hmac sha256 "$k" hex | ||
} | ||
|
||
tencent_signature_v3() { | ||
service=$1 | ||
action=$(echo "$2" | _lower_case) | ||
payload=${3:-'{}'} | ||
timestamp=${4:-$(date +%s)} | ||
|
||
domain="$service.tencentcloudapi.com" | ||
secretId="$DEPLOY_TENCENT_SSL_SECRET_ID" | ||
secretKey="$DEPLOY_TENCENT_SSL_SECRET_KEY" | ||
|
||
algorithm='TC3-HMAC-SHA256' | ||
date=$(date -u -d "@$timestamp" +%Y-%m-%d 2>/dev/null) | ||
[ -z "$date" ] && date=$(date -u -r "$timestamp" +%Y-%m-%d) | ||
|
||
canonicalUri='/' | ||
canonicalQuery='' | ||
canonicalHeaders="content-type:application/json\nhost:$domain\nx-tc-action:$action\n" | ||
_debug2 payload "$payload" | ||
|
||
signedHeaders='content-type;host;x-tc-action' | ||
canonicalRequest="POST\n$canonicalUri\n$canonicalQuery\n$canonicalHeaders\n$signedHeaders\n$(printf %s "$payload" | _digest sha256 hex)" | ||
_debug2 canonicalRequest "$canonicalRequest" | ||
|
||
credentialScope="$date/$service/tc3_request" | ||
stringToSign="$algorithm\n$timestamp\n$credentialScope\n$(tencent_sha256 "$canonicalRequest")" | ||
_debug2 stringToSign "$stringToSign" | ||
|
||
secretDate=$(tencent_hmac_sha256 "TC3$secretKey" "$date") | ||
secretService=$(tencent_hmac_sha256_hexkey "$secretDate" "$service") | ||
secretSigning=$(tencent_hmac_sha256_hexkey "$secretService" 'tc3_request') | ||
signature=$(tencent_hmac_sha256_hexkey "$secretSigning" "$stringToSign") | ||
|
||
echo "$algorithm Credential=$secretId/$credentialScope, SignedHeaders=$signedHeaders, Signature=$signature" | ||
} | ||
|
||
tencent_api_request() { | ||
service=$1 | ||
version=$2 | ||
action=$3 | ||
payload=${4:-'{}'} | ||
timestamp=${5:-$(date +%s)} | ||
|
||
token=$(tencent_signature_v3 "$service" "$action" "$payload" "$timestamp") | ||
|
||
_H1="Authorization: $token" | ||
_H2="X-TC-Version: $version" | ||
_H3="X-TC-Timestamp: $timestamp" | ||
_H4="X-TC-Action: $action" | ||
_H5="X-TC-Language: en-US" | ||
|
||
_post "$payload" "https://$service.tencentcloudapi.com" "" "POST" "application/json" | ||
} |