Генерация подписи AWS SQS из java

Мне нужно получить сообщение от AWS SQS с использованием Spring RestTemplate(привязанный прокси) вместо обмена сообщениями aws sdk или spring cloud aws из-за некоторых проблем с прокси-сервером компании.

Мне нужно сгенерировать строку заголовка, включающую такую ​​подпись авторизации;

      curl --location --request GET 'https://sqs.us-east-2.amazonaws.com/523535599964/MyAmazingQueue?Action=ReceiveMessage' \
--header 'X-Amz-Date: 20210623T133108Z' \
--header 'Authorization: AWS4-HMAC-SHA256 Credential=AKIAXTZJHJFOEKI4UF45/20210623/us-east-2/sqs/aws4_request, SignedHeaders=host;x-amz-date, Signature=2d926124ce07ca41c0f56af3bdddc81df19444df189b727ff02015f620cdfc6c'

Это сгенерировано Почтальоном.

Мне нужно сгенерировать эту подпись с помощью java и привязать к объекту HttpHeaders.

      HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", <generatedAuthString>);
headers.add("X-Amz-Date", <generatedAnother>);
.
.
HttpEntity<String> entity = new HttpEntity<>(null, headers);

response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

Я предпочел использовать шаблон rest, потому что использование aws sdk при добавлении прокси, как показано ниже, не работает. Я получаю ошибку тайм-аута при запуске приложения.


      public AmazonSQSAsync amazonSQSAsync() {
    ClientConfiguration clientConfiguration= new ClientConfiguration();
    clientConfiguration.setProxyHost(proxyurl);
    clientConfiguration.setProxyPort(proxyport);
    return AmazonSQSAsyncClientBuilder.standard().withRegion(region)
            .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(awsAccessKey, awsSecretKey)))
            .build();
}

Я пробовал каждый элемент в этом вопросе о переполнении стека, но получил исключение AccessDeniedException или SignatureDoesNotMatch, кроме одного.

Как сгенерировать подпись в AWS из Java

Было бы здорово, если бы вы могли помочь. Спасибо.

1 ответ

Решил наконец :)

      AmazonSQSClientBuilder builder = AmazonSQSClientBuilder.standard();
AmazonSQS sqs = builder.withClientConfiguration(
        PredefinedClientConfigurations.defaultConfig()
                .withProxyHost("**")
                .withProxyPort(****).withProxyPassword("***").withProxyUsername("****"))
        .withCredentials(new AWSStaticCredentialsProvider(credentials))
        .withRegion(Regions.US_EAST_2)
        .build();

Я использовал aws sdk, установленный из spring cloud aws. Я использовал PredefinedClientConfigurations, установленный из ClientConfiguration. Спасибо всем!

Другие вопросы по тегам