这可能是由于密钥或日期不正确导致的。请确保使用正确的密钥和日期生成签名。另外,还要检查所选的区域是否正确,并确保使用正确的HTTP方法(如GET或POST)和端点。
下面是一个示例代码,用于实现AWS SigV4签名,并避免出现此问题:
import hashlib
import hmac
import datetime
import requests
# AWS认证信息
access_key = 'YOUR_ACCESS_KEY_ID'
secret_key = 'YOUR_SECRET_ACCESS_KEY'
# AWS区域信息
region = 'YOUR_AWS_REGION'
service = 's3'
# HTTP请求信息
url = 'https://s3.amazonaws.com/YOUR_BUCKET_NAME/YOUR_FILE_NAME'
method = 'GET'
# 生成签名
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def getSignatureKey(key, dateStamp, regionName, serviceName):
kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'aws4_request')
return kSigning
def get_signed_url(url):
# 生成时间戳和日期字符串
t = datetime.datetime.utcnow()
amz_date = t.strftime('%Y%m%dT%H%M%SZ')
datestamp = t.strftime('%Y%m%d')
# 构造认证信息
canonical_uri = '/'
canonical_querystring = ''
canonical_headers = 'host:' + service + '.' + region + '.amazonaws.com\nx-amz-date:' + amz_date + '\n'
signed_headers = 'host;x-amz-date'
payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest()
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
algorithm = 'AWS4-HMAC-SHA256'