Получение ошибки при создании предопределенного URL для SSE-C

Я сделал еще одну минималистическую оболочку с только 20 строками кода, чтобы разрешить ее использовать, как и должно:

localStorage.set('myKey',{a:[1,2,5], b: 'ok'});
localStorage.has('myKey');   // --> true
localStorage.get('myKey');   // --> {a:[1,2,5], b: 'ok'}
localStorage.keys();         // --> ['myKey']
localStorage.remove('myKey');

https://github.com/zevero/simpleWebstorage

0
задан Ashish 22 March 2019 в 06:53
поделиться

2 ответа

Вы не можете вызывать предварительно подписанный URL-адрес напрямую через браузер.

Вам необходимо передавать заголовки в запросе

  1. x-amz-server-side-encryption- алгоритм клиента

  2. x-amz-шифрование на стороне сервера-ключ клиента

  3. шифрование на стороне сервера x-amz -Customer-key-MD5

Пожалуйста, проверьте документ для получения дополнительной информации https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html

При использовании предварительно назначенного URL-адреса для загрузки нового объекта, извлечения существующего объекта или извлечения только метаданных объекта необходимо предоставить все заголовки шифрования в клиентском приложении.

Пожалуйста, проверьте пример кода, вызывающего подписанный URL через библиотеку Unirest https://github.com/pavanpawar4591/s3signurlwith-sse-c

public static void getPreSignedURL() throws URISyntaxException {
        java.util.Date expiration = new java.util.Date();
        long expTimeMillis = expiration.getTime();
        expTimeMillis += 1000 * 60 * 60;
        expiration.setTime(expTimeMillis);

        System.out.println("Generating pre-signed URL.");
        GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName)
                .withMethod(HttpMethod.GET).withExpiration(expiration).withSSECustomerKey(SSE_KEY);

        // generatePresignedUrlRequest.setContentType("video/mp4");
        generatePresignedUrlRequest.setSSECustomerKeyAlgorithm(SSEAlgorithm.AES256);

        URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);

        System.out.println("Pre-Signed URL: " + url.toURI() + " With key: " + SSE_KEY);

        System.out.println("------------------------------");
        //https://aws.amazon.com/blogs/developer/generating-amazon-s3-pre-signed-urls-with-sse-c-part-4/ 
        // refer to above doc
        try {
            HttpResponse<String> response = Unirest.get(url.toURI().toString())
                    .header(Headers.SERVER_SIDE_ENCRYPTION_CUSTOMER_ALGORITHM, SSEAlgorithm.AES256.getAlgorithm())
                    .header(Headers.SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY, Base64.encodeAsString(SECRET_KEY.getEncoded()))
                    .header(Headers.SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5,
                            Md5Utils.md5AsBase64(SECRET_KEY.getEncoded()))
                    .header("cache-control", "no-cache").header("postman-token", "d3453c38-1b59-a12e-fd97-dbe2150eadf5")
                    .asString();

            System.out.println(response.getStatus());
            System.out.println(response.getStatusText());
            System.out.println(response.getBody());
        } catch (UnirestException e) {

            e.printStackTrace();
        }

    }
0
ответ дан marc_s 22 March 2019 в 06:53
поделиться

Спасибо @pavan

Любой клиент, которому нужно использовать SSE-C, должен иметь возможность отправки заголовков ниже.

enter image description here

При использовании предварительно назначенного URL-адреса для извлечения существующего объекта или извлечения только метаданных объекта нам необходимо предоставить все заголовки шифрования в ваше клиентское приложение.

  • Для шифрования на стороне сервера, управляемого S3 или KMS, мы можем создать предварительно заданный URL-адрес и напрямую вставить его в браузер или проигрыватель.

  • Однако это не относится к объектам SSE-C, поскольку в дополнение к предварительно назначенному URL-адресу также необходимо включить заголовки HTTP, специфичные для объектов SSE-C. Следовательно, вы можете использовать предварительно назначенный URL-адрес для объектов SSE-C только программно.

Загрузка:

Я выбрал управляемые ключи S3 вместо предоставленного клиентом клиентского ключа.

        FileInputStream fin = new FileInputStream(uploadFileName);

        byte fileContent[] = new byte[(int) uploadFileName.length()];

        // Reads up to certain bytes of data from this input stream into an array of
        // bytes.
        fin.read(fileContent);
        // create string from byte array

        // Specify server-side encryption.
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentLength(fileContent.length);
        objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
        PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName,
                new ByteArrayInputStream(fileContent), objectMetadata);

        // Upload the object and check its encryption status.
        PutObjectResult putResult = s3Client.putObject(putRequest);
        System.out.println("Object \"" + keyName + "\" uploaded with SSE.");

GET Предназначенный URL:

    java.util.Date expiration = new java.util.Date();
    long expTimeMillis = expiration.getTime();
    expTimeMillis += 1000 * 60 * 60;
    expiration.setTime(expTimeMillis);

    System.out.println("Generating pre-signed URL.");
    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName)
            .withMethod(HttpMethod.GET).withExpiration(expiration);

    URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
    System.out.println("Pre-Signed URL: " + url.toURI());

Ссылка: https://docs.aws.amazon.com/AmazonS3/latest/dev /ServerSideEncryptionCustomerKeys.html

0
ответ дан Ashish 22 March 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: