When I call the API endpoints from the REST client, I got an error regarding the Signature.
Request:
Host : https://xxx.execute-api.ap-southeast-1.amazonaws.com/latest/api/name
Authorization : AWS4-HMAC-SHA256 Credential = {AWSKEY} / 20160314 / ap-southeast-1 / execute-api / aws4_request, SignedHeaders = host; range; x-amz-date, Signature = {signature}
X-Amz-Date : 20160314T102915Z
Answer:
{ "message": "The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. The Canonical String for this request should have been 'xxx' " }
From the Java code, I followed the AWS link on how to generate a signature.
String secretKey = "{mysecretkey}"; String dateStamp = "20160314"; String regionName = "ap-southeast-1"; String serviceName = "execute-api"; byte[] signature = getSignatureKey(secretKey, dateStamp, regionName, serviceName); System.out.println("Signature : " + Hex.encodeHexString(signature)); static byte[] HmacSHA256(String data, byte[] key) throws Exception { String algorithm="HmacSHA256"; Mac mac = Mac.getInstance(algorithm); mac.init(new SecretKeySpec(key, algorithm)); return mac.doFinal(data.getBytes("UTF8")); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception { byte[] kSecret = ("AWS4" + key).getBytes("UTF8"); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }
Can I find out that I was mistaken in creating the Signature?
Link how to generate a signature: http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-java
source share