请欣赏任何帮助,我对Amazon CloudFront相当新,但我会告诉你到目前为止我做了什么。我有一个CloudFront发行版,显示来自S3 Bucket的内容,并且我已停止从浏览器访问S3存储桶。
我已将CF行为与Lambda函数相关联,我将请求URI重新路由到S3 Bucket位置,因此最终用户不知道S3存储桶位于何处。一切都工作得非常好,所以我接下来想要实现的目标:
同样,在测试Lambda函数和检查CloudWatch Logs时,上述两点完全正常。我现在面临着从浏览器中查看它的问题,因为它一直给我404错误,但是日志说测试时该功能正在运行。
如何显示网址:
使用KMS加密我在PHP端加密了文件名,因此hello.jpg是加密字符串,例如lfjeroqgo2747453 / shuh + sdkfjirogvoniuhreg3974
当我尝试从浏览器访问输入为https://domain.cloudfront.net/image/lfjeroqgo2747453/shuh+sdkfjirogvoniuhreg3974的CF URL时,它没有显示图像或文件
我只是想知道过去是否有其他人遇到过这个问题,或者CF是否允许从浏览器请求加密的URL?从研究中我发现亚马逊提供了一种名为API Gateway的服务,我是否必须使用API网关来实现这一目标?
道歉,如果我写了很多来描述我的问题,我会非常感谢你们的帮助。
代码段:
'use strict';
var AWS = require('aws-sdk');
var kms = new AWS.KMS();
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const uri_orig = request.uri;
if( request.uri.match('/documents_property/') ){
decryptValue( request, uri_orig.replace('/documents_property/', '') , 'UpLoaDs/documents/property/', callback );
return;
}
if( request.uri.match('/inspection_report/') ){
request.uri = uri_orig.replace('/inspection_report/', 'UpLoaDs/files/inspection/');
}
callback(null, request);
};
function decryptValue( request, encrypted, destination_path, callback ){
encrypted = unescape(encrypted);
kms.decrypt({CiphertextBlob: new Buffer(encrypted, 'base64')}, (err, data) => {
if( err ){
console.log('Decrypt error:', err);
return callback(err);
}
var decrypted = data.Plaintext.toString('ascii');
request.uri = destination_path + decrypted;
callback(null, request);
});
}
答案 0 :(得分:1)
之前我已经做过并遇到过同样的问题。
lfjeroqgo2747453 / shuh + sdkfjirogvoniuhreg3974 - 如果您注意到网址中的/,则会将其视为路径的其他部分。您需要执行URL编码并执行URL解码并执行解密。
加密字符串包含/导致问题。 此外,当您解密时,您可以检查解密结果是否是预期的文件名。如果不是,请在解密之前和加密之后打印字符串,以确保在将其提供给应用程序时它们是相同的。
希望这有帮助。