Amazon CloudFront可以接受KMS加密的URL吗?

时间:2017-09-05 20:49:59

标签: node.js amazon-web-services amazon-s3 aws-lambda amazon-cloudfront

请欣赏任何帮助,我对Amazon CloudFront相当新,但我会告诉你到目前为止我做了什么。我有一个CloudFront发行版,显示来自S3 Bucket的内容,并且我已停止从浏览器访问S3存储桶。

我已将CF行为与Lambda函数相关联,我将请求URI重新路由到S3 Bucket位置,因此最终用户不知道S3存储桶位于何处。一切都工作得非常好,所以我接下来想要实现的目标:

  • 在PHP级别使用KMS加密加密CF请求URI
  • 在NodeJS中使用Lambda函数解密请求URI并将其重新路由到S3存储桶位置

同样,在测试Lambda函数和检查CloudWatch Logs时,上述两点完全正常。我现在面临着从浏览器中查看它的问题,因为它一直给我404错误,但是日志说测试时该功能正在运行。

如何显示网址:

我只是想知道过去是否有其他人遇到过这个问题,或者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);
    });
}

1 个答案:

答案 0 :(得分:1)

之前我已经做过并遇到过同样的问题。

lfjeroqgo2747453 / shuh + sdkfjirogvoniuhreg3974 - 如果您注意到网址中的/,则会将其视为路径的其他部分。您需要执行URL编码并执行URL解码并执行解密。

加密字符串包含/导致问题。 此外,当您解密时,您可以检查解密结果是否是预期的文件名。如果不是,请在解密之前和加密之后打印字符串,以确保在将其提供给应用程序时它们是相同的。

希望这有帮助。

相关问题