AWS S3Client работает, но S3EncryptionClient FAILS - NoSuchKey: указанный ключ не существует - PullRequest
0 голосов
/ 01 марта 2019

Это может быть ошибка в C ++ AWS SDK.Я могу загружать, перечислять, а затем загружать элементы из моего ведра просто отлично.Я также могу загрузить с клиентом шифрования, список и скачать с ванильным клиентом просто отлично.Естественно, файлы зашифрованы на этом этапе ... НО, если я пытаюсь составить список и загрузить его с помощью клиента шифрования, он говорит, что такого ключа нет!

    std::vector<std::string> files = GetList(); // uses s3 list object
    Aws::Client::ClientConfiguration config;
    config.region = '{region}'

    const size_t keyLen = keyFile->GetKeyLength();
    const auto key = std::string(keyFile->GetKey(), keyLen);

    char to_uchar[keyLen];
    std::copy(key.begin(), key.end(), to_uchar);
    to_uchar[keyLen] = 0;

    // AES256
    auto encryption = Aws::MakeShared<Aws::S3Encryption::Materials::SimpleEncryptionMaterials>(to_uchar, keyLen);

    #ifdef UNDER_MACOS
        CryptoConfiguration cryptoConfiguration(StorageMethod::METADATA, CryptoMode::ENCRYPTION_ONLY);
    #else
        CryptoConfiguration cryptoConfiguration(StorageMethod::METADATA, CryptoMode::STRICT_AUTHENTICATED_ENCRYPTION);
    #endif

    //Aws::S3::S3Client s3(config); // <--- this works!
    Aws::S3Encryption::S3EncryptionClient s3(encryption, cryptoConfiguration, config); // <-- this doesn't work!

    for(auto key : files) {
        Aws::S3::Model::GetObjectRequest req;
        req.WithBucket("{BUCKET}");
        req.WithKey(key.c_str());
        auto res = s3.GetObject(req);

        if(res.IsSuccess()) {
            Aws::OFStream local_file;
            std::string loc = "outputdir/"+key;
            local_file.open(loc.c_str(), std::ios::out | std::ios::binary);
            local_file << res.GetResult().GetBody().rdbuf();
        } else {
            std::cout << "S3 get `" + key + "` request failed with error (" << res.GetError().GetExceptionName() << "): \"" << res.GetError().GetMessage() << "\"" << std::endl;
        }
    }

Опять же, с обычным клиентом S3 это нормально.С S3EncryptionClient, это мой вывод для каждого файла:

S3 get `fake_file_XYZ` request failed with error (NoSuchKey): "The specified key does not exist."

Но мой CLI aws показывает, что это так!

...