这是一个 S3 问题,因此我将其发布在此处,而不是在 Salesforce stackexchange 中。
基本上,我的 Salesforce 代码会为 S3 生成预签名的 url。这些被前端用于上传和下载文件。
这是完美的工作。现在我们需要指定 SSE(服务器端加密)。根据文档,SSE-S3 不适用于预签名的 url。
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html
所以我必须将 SSE 与客户生成的密钥一起使用。 http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html
这里的文字是这样说的: 创建预签名 URL 时,您必须在签名计算中使用 x-amz-server-side-encryption-customer-algorithm 指定算法。
这就是我计算签名的方式,并且在没有加密的情况下将文件上传和下载到存储桶中可以正常工作。
public string getStringToSign() {
// ==== CONSTRUCT THE STRING TO SIGN ====
string stringToSign = S3Connection.AWS_HEADER_ENCRYPTION_SCHEME + '\n'
+ this.dateStampISO + '\n'
+ this.dateStampYYYYMMDD + '/' + this.awsRegion + '/s3/aws4_request' + '\n'
+ EncodingUtil.convertToHex(Crypto.generateDigest(S3Connection.AWS_ENCRYPTION_SCHEME, blob.valueOf(this.getRequestString())));
return stringToSign;
}
public blob getSigningKey() {
// ==== GENERATE THE SIGNING KEY ====
Blob dateKey = Crypto.generateMac('hmacSHA256', Blob.valueOf(this.dateStampYYYYMMDD), Blob.valueOf('AWS4' + this.accessSecret));
Blob dateRegionKey = Crypto.generateMac('hmacSHA256', Blob.valueOf(this.awsRegion), dateKey);
Blob dateRegionServiceKey = Crypto.generateMac('hmacSHA256', blob.valueOf(this.awsServiceName), dateRegionKey);
Blob signingKey = Crypto.generateMac('hmacSHA256', blob.valueOf('aws4_request'), dateRegionServiceKey);
//Blob signingKey2 = Crypto.generateMac('hmacSHA256', blob.valueOf('x-amz-server-side-encryption-customer-algorithm'), signingKey);
return signingKey;
}
public string getSignature() {
// ==== GENERATE THE SIGNATURE ====
return this.generateSignature(this.getStringToSign(), this.getSigningKey());
}
public string generateSignature(string stringToSign, blob signingKey) {
blob signatureBlob = Crypto.generateMac('hmacSHA256', blob.valueOf(stringToSign), signingKey);
return EncodingUtil.convertToHex(signatureBlob);
}
所以我的问题是如何在这个签名计算中添加“x-amz-server-side-encryption-customer-algorithm”。
提前致谢!