【问题标题】:AWS: Can not download file from SSE-KMS encrypted bucket using streamAWS:无法使用流从 SSE-KMS 加密存储桶下载文件
【发布时间】:2021-03-28 08:58:13
【问题描述】:

我有一个配置了启用加密的存储桶:

  • 加密密钥类型:AWS Key Management Service 密钥 (SSE-KMS)
  • 使用 AWS 托管密钥 (aws/s3)。 桶加密配置:

我有 nodejs 项目使用流在 S3 存储桶上上传/下载文件。 问题是我可以成功上传,但是当我尝试使用流下载/获取文件时,它只发出一次“数据”事件,然后发出“结束”事件,但仍有数据可以消耗从下面的日志中看到。 你知道为什么会这样吗?

附加信息:

  • 当我上传到未启用加密的存储桶时,它可以正常工作。
  • 我的策略有“kms:Decrypt”
  • 我试过用aws cli上传下载,成功了。
  • 我们使用 s3.getSignedUrl('getObject', params) 创建文件 URL
  • 使用 request.js

下载流:

    async downloadStream() {
        logger.info('Getting download stream...');
        const url = await this.getFileUrl(); // getSignedUrl
    
        const headers = {};
  
        this.downloadStream = request({ url, headers });
        this.downloadStream.on('data', (chunk) => this.emit('data', chunk.length));
        this.downloadStream.on('end', () => this.emit('end'));
        this.downloadStream.on('error', (error = {}) => this.emit('failure', error));
    
        logger.info('Acquired download stream successfully');
    
        this.downloadStream.pipe(this.response);;
    }

日志信息:

完整的转会统计:
传输的字节数:13170 个字节中的 4491 个
左:8679
平均块大小:4491 字节
估计剩余块数:2
平均速度:0.000260375 MB/s 总传输时间:13.127 秒

【问题讨论】:

  • 任何错误信息?
  • 不,没有任何错误,流发出 'end' 事件。

标签: node.js amazon-s3 encryption nodejs-stream amazon-kms


【解决方案1】:

在服务器端使用 KMS 加密的对象在访问它们时需要使用 SigV4 协议。 source: aws forum

创建 AWS.S3 客户端时,在选项中添加 signatureVersion: 'v4':

  return new aws.S3({
        credentials,
        params: {
            bucket,
        },
        region,
        signatureVersion: 'v4',
    });

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2017-02-16
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多