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

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проблемы с генерацией подписанных URL-адресов с использованием облачного интерфейса с закрытым ключом... для объектов S3

Сообщение Anonymous »

У меня возникли проблемы с созданием подписанных URL-адресов для объектов S3 с использованием Python 3.7. В частности, URL-адреса объектов с пробелами в ключах приводят к ошибке «Доступ запрещен», тогда как URL-адреса объектов без пробелов обычно работают нормально. Однако не все объекты без пробелов работают правильно, а объекты с пробелами постоянно выходят из строя.

Код: Выделить всё

from datetime import datetime ,timedelta
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
from botocore.signers import CloudFrontSigner

class SecuringCloudFront:
def __init__(self):
pass

def rsa_signer(self, message):
try:
with open('private_key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
return private_key.sign(message, padding.PKCS1v15(), hashes.SHA1())
except Exception as e:
print(f"Error loading or signing with private key: {e}")
return None

def get_document_images_from_s3(self, images_keys, images_to_get=None):
"""
Description: creates signed CloudFront URLs for document images

Attributes:
- images_keys: list of keys
- images_to_get: list of images index

Result: list of URLs
"""
CLOUDFRONT_URL = "https://***********.cloudfront.net"
KEY_PAIR_ID = "********" #id of stored key

images_urls = []
keys = (
images_to_get
if images_to_get is not None
else list(range(len(images_keys)))
)
for key in keys:
try:
if key >= len(images_keys) or len(images_keys[key]["name"]) == 0:
continue

s3_key = images_keys[key]["name"]
url = f"{CLOUDFRONT_URL}/{s3_key}"
expire_date = datetime.utcnow() + timedelta(hours=24)

cloudfront_signer = CloudFrontSigner(KEY_PAIR_ID, self.rsa_signer)
signed_url = cloudfront_signer.generate_presigned_url(
url, date_less_than=expire_date
)
url = {"url": signed_url} if signed_url else {"url": ""}
except Exception as e:
url = {"url": ""}
print(f"Error generating signed URL: {e}")

images_urls.append(url)

return images_urls

if __name__ == "__main__":
securing_cloud_front = SecuringCloudFront()
images_keys = [
{"name": "imageIns3.jpg"}
]
signed_urls = securing_cloud_front.get_document_images_from_s3(images_keys)
print("Signed URLs:", signed_urls)
Замена пробелов на %20 и +:
Я попытался заменить пробелы в ключах объекта на %20 и + в URL-адресе. Этот подход не решил проблему, и я по-прежнему получал ошибки «Доступ запрещен».
Интеграция пользовательской политики:
Я пытался интегрировать пользовательскую политику для создания подписанных URL-адресов, но не смог понять. как правильно его применить. Несмотря на различные попытки, мне не удалось решить проблему с помощью этого метода.
Другая информация: при попытке открыть объект непосредственно из s3, который не может получить действительный URL-адрес от CloudFront, он классифицируется как «jpg_files». Объект, успешно полученный из CloudFront, относится к категории «jpg_images

Подробнее здесь: https://stackoverflow.com/questions/787 ... key-for-s3
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»