Amazon CloudFront 能否接受 KMS 加密的 URL?

Can Amazon CloudFront accept KMS encrypted URLs?

如有任何帮助,我们将不胜感激,我对 Amazon CloudFront 还很陌生,但我会告诉您到目前为止我做了什么。我有一个显示 S3 存储桶内容的 CloudFront 分配,我已停止从浏览器访问 S3 存储桶。

我已将 CF 行为关联到 Lambda 函数,我将请求 URI 重新路由到 S3 存储桶位置,因此最终用户不知道该位置在 S3 存储桶中的哪个位置。一切都运行良好,所以我接下来要实现的目标是:

同样,在测试 Lambda 函数和检查 CloudWatch Logs 时,以上两点工作得非常好。我现在在浏览器中查看它时遇到问题,因为它一直给我一个 404 错误,但日志显示该功能在测试时正在运行。

URL 的显示方式:

我只是想知道过去是否有人遇到过这个问题,或者 CF 是否允许从浏览器请求加密的 URLs?通过研究,我了解到 Amazon 提供了一项名为 API Gateway 的服务,我是否必须使用 API Gateway 才能实现此目的?

抱歉,如果我写了很多来描述我的问题,我将不胜感激。

代码片段:

'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);
    });
}

我以前做过,运行 遇到过同样的问题。

lfjeroqgo2747453/shuh+sdkfjirogvoniuhreg3974 -- 如果您注意到 url 中的 /,它会被视为路径的不同部分。您需要进行 URL 编码并进行 URL 解码并执行解密。

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

希望对您有所帮助。