Как изменить формат S3Client.getURL

Я использую AWS Java SDK в своем приложении Spring Boot. В настоящее время, когда я хочу вернуть URL-адрес объекта s3, который я использую:

s3Client.putObject(new PutObjectRequest(S3_BUCKET_NAME, key,fileToUpload));
URL signedUrl = s3Client.getUrl(S3_BUCKET_NAME, key);

И signedUrl выглядит так:

https://<my_bucket_name>.s3.eu-central-1.amazonaws.com/<my_key>

Проблема в том, что этот URL-адрес недействителен (возвращает ошибку HTTPS при подключении). Прямо сейчас я не могу настроить свой личный домен и решить проблему с помощью конфигурации CloudFront.

Итак, моя идея состоит в том, чтобы принудительно использовать другой формат в SDK. Что-то вроде этого:

https://s3.eu-central-1.amazonaws.com/<my_bucket_name>/<my_key>

Может ли кто-нибудь указать мне в правильном направлении?

PS: я знаю, что могу просто заменить URL-адрес, но это не элегантное решение.


person TheKalin    schedule 30.12.2017    source источник
comment
Какую ошибку HTTPS вы получили? Как вы думаете, почему использование другого формата URL уменьшит проблему с HTTPS?   -  person Anuruddha    schedule 30.12.2017
comment
Он кричит, Код ошибки: SSL_ERROR_BAD_CERT_DOMAIN. my_bucket_name.s3.eu-central-1.amazonaws.com использует недействительный сертификат безопасности. С помощью ttps://s3.eu-central-1.amazonaws.com я могу решить эту проблему.   -  person TheKalin    schedule 30.12.2017
comment
Вы пытаетесь получить доступ к этому URL-адресу в Firefox? вы пробовали URL в Chrome? Похоже, что в Firefox есть ошибка support.mozilla.org/en-US/questions/1049026.   -  person Anuruddha    schedule 30.12.2017
comment
Chrome сообщает о той же ошибке https. Странно, что coursera_assets_example отлично работает в обоих браузерах. Похоже, моя конфигурация корзины вызывает проблему.   -  person TheKalin    schedule 30.12.2017
comment
@Anuruddha - Проверьте мой ответ, это была моя глупая ошибка. Поэтому спасибо за беседу, она помогла мне разобраться.   -  person TheKalin    schedule 30.12.2017
comment
Вы можете попробовать заменить _ на - в имени корзины. Также вы можете ознакомиться с полным примером, представленным в docs.aws.amazon. com/AmazonS3/latest/dev/ при подписании URL-адреса S3 и посмотрите, не упустили ли вы что-то.   -  person Anuruddha    schedule 30.12.2017


Ответы (1)


Хорошо, проблема была с именем ведра. Точка в имени ведра вызывала все проблемы.

foo-bar-com в качестве имени корзины работает, как и ожидалось. foo.bar.cam.s3. имя ведра вызывает исключение https.

person TheKalin    schedule 30.12.2017
comment
URL-адрес S3 в форме https://bucket.s3.region.amazonaws.com/key называется доступом в виртуальном стиле, а https://s3.region.amazonaws.com/bucket/key называется доступом в стиле пути. Последний поддерживает точки в имени корзины, а первый — нет из-за того, как работает проверка SSL-сертификата с подстановочными знаками. Я не разработчик Java, но см. isPathStyleAccess для того, что, как мне кажется, могло быть вашим альтернативным решением. - person Michael - sqlbot; 31.12.2017
comment
Также кажется, что предпочтительный подход с Java SDK претерпел несколько итераций за эти годы, c.f. stackoverflow.com/a/24012996/1695906. - person Michael - sqlbot; 31.12.2017
comment
Также обратите внимание, что замена строки для переформатирования URL-адреса из одного стиля в другой может использоваться только с Signature V2, потому что алгоритм подписи использует на входе фактическое имя корзины; Напротив, Signature V4 использует полное имя хоста в URL-адресе в качестве входных данных для алгоритма подписи, поэтому замена строки в URL-адресе, которая обязательно изменит имя хоста, также сделает подпись недействительной ... так что, вероятно, хорошо, что вы этого не сделали. не идти по этому пути. Одно заметное визуальное различие между ними заключается в том, что URL-адреса Sig V2 включают AWSAccessKeyId, а URL-адреса Sig V4 включают X-Amz-Credential. - person Michael - sqlbot; 31.12.2017