Amazon S3: одновременное использование псевдонима DNS в bucket + HTTPS

Я хочу создать ведро S3 во Франкфуртской зоне и сделать файлы доступными с URL: https://files.stample.co/filename

Таким образом, я хочу одновременно использовать HTTPS и собственный псевдоним DNS (CNAME).

В соответствии с тем, что я понимаю, Amazon имеет подстановочный сертификат для URL https://*.s3.amazonaws.com.

HTTPS/SSL

Итак, этот шаблон будет:

  • Работа для https://stample-files.s3.amazonaws.com
  • Не работает для https://files.stample.co.s3.amazonaws.com

Итак, то, что я понимаю и подтверждено другими сообщениями StackOverflow , заключается в том, что если я хочу, чтобы SSL работал, я должен использовать имя ведра без точки, иначе сертификат Amazon с подстановочный знак не будет соответствовать домену ведра.

Использование псевдонима DNS/CNAME

В этой документации S3 в разделе Customizing Amazon S3 URLs with CNAMEs:

В зависимости от ваших потребностей вы можете не захотеть, чтобы "s3.amazonaws.com" появлялся на вашем веб-сайте или в сервисе. Например, если вы размещаете изображения своего сайта на Amazon S3, вы можете предпочесть http://images.johnsmith.net/ вместо http://johnsmith-images.s3.amazonaws.com/.

Имя ведра должно совпадать с именем CNAME. Итак http://images.johnsmith.net/filename будет таким же, как http://images.johnsmith.net.s3.amazonaws.com/filename если CNAME был создан для сопоставления images.johnsmith.net с изображениями .johnsmith.net.s3.amazonaws.com.

Это, по-видимому, по техническим причинам, потому что в противном случае Amazon не может знать ведро, к которому мы стремимся:

Поскольку Amazon S3 видит только исходное имя узла www.example.com и не знает о сопоставлении CNAME, используемом для разрешения запроса, имя CNAME и имя ведра должны быть одинаковыми.

Итак, я понимаю, что для работы CNAME мы должны использовать точки в bucketname.

Оба вместе?

Если я использую точки в имени ведра:

  • SSL не будет работать.
  • CNAME будет работать

Если я не использую точки в имени ведра:

  • SSL будет работать
  • CNAME не будет работать

Я тестировал оба случая и не мог заставить SSL и CNAME работать вместе.

Что я могу сделать, чтобы обе работали? Мне кажется, что я хочу добиться не очень-то...

Ответ 1

Кажется, что в настоящее время это невозможно сделать, используя только S3, но это возможно с CloudFront, поскольку он поддерживает настраиваемые сертификаты.

CloudFront не очень дорогой и даже может быть дешевле, чем S3 в некоторых случаях. Он бесплатно поддерживает пользовательские сертификаты при использовании SNI (однако он не поддерживается более старыми браузерами, такими как < IE7, < Chrome6, < Firefox 2.0)

HOWTO с CloudFront

Я возьму в качестве примера, что вы хотите использовать https://files.mydomain.com для указания на ведро S3 с именем mydomain-files (имя ведра не имеет значения и может содержать точки).

Пользовательский сертификат требуется

В соответствии с анкетом "Michael - sqlbot" требуется использовать специальный сертификат. Мое первоначальное предположение заключалось в том, что использование CNAME позволит использовать сертификат подстановки Amazon S3 при использовании моего настраиваемого домена, но это было неверно: пользовательский сертификат абсолютно необходим, и его можно настроить только с CloudFront, а не с S3.

Получить бесплатный сертификат

Вы можете использовать любой поставщик сертификатов, который вам нужен, но здесь я беру StartSSL (StartCom), которые предоставляют бесплатные SSL-сертификаты (только для одного поддомена и еще 1 год).

  • Подтвердите право собственности на домен mydomain.com
  • Создать сертификат с доменом files.mydomain.com
  • Загрузите сертификат (files.crt) и закрытый ключ (files.key, зашифрованный вашим пользовательским паролем): они находятся в формате PEM
  • Расшифровать закрытый ключ: openssl rsa -in files.key -out files.key
  • Создать цепочку сертификатов с файлами StartSSL из здесь: cat sub.class1.server.ca.pem ca.pem >> chain.crt

Загрузить сертификат AWS

  • Установите AWS CLI для загрузки сертификата (обратите внимание, что ключ должен быть незашифрованным, сертификат должен быть в формате PEM, а цепочка сертификатов требуется для CloudFront). Вы должны выбрать имя и путь (выберите то, что хотите, но путь должен начинаться с /cloudfront/
  • Загрузите свой сертификат в AWS для использования Cloudfront, например документально зарегистрированный здесь: aws iam upload-server-certificate --server-certificate-name CUSTOM_CERTIFICATE_NAME --certificate-body file://files.crt --private-key file://files.key --certificate-chain file://chain.crt --path /cloudfront/CUSTOM_PATH/

Настройка CloudFront

  • Создание нового веб-дистрибутива
  • Используйте CNAME: files.mydomain.com
  • Выберите переключатель "Пользовательский сертификат SSL" и выберите свой сертификат (CUSTOM_CERTIFICATE_NAME, который вы выбираете при загрузке)
  • Выберите свой ведро S3 в качестве источника распространения CloudFront
  • Подтвердите и дождитесь завершения развертывания: вы должны получить доступ к файлам вашего ведра с помощью URL-адреса, например https://xyzxyzxyz.cloudfront.net/file

Настройка DNS

  • Откройте конфигурацию DNS mydomain.com
  • Добавьте CNAME: files IN CNAME xyzxyzxyz.cloudfront.net
  • Подождите, пока DNS будет распространяться (см. DNS TTL) (может быть быстро, если новая запись DNS)

End

Теперь вы можете получить доступ к своим файлам с помощью https://files.mydomain.com/file. Сертификатом будет ваш собственный сертификат, сгенерированный для files.mydomain.com, поэтому все будет работать нормально.

Ответ 2

Вы можете сделать и то и другое, в зависимости от того, что вы имеете в виду, но это требует изменения вашего подхода и понимания некоторых внутренних компонентов S3 или понимания того, почему то, что вы пытаетесь,.

Во-первых, чтобы уточнить, когда я говорю, что вы можете сделать то и другое, я предполагаю, что вы не ожидаете, что сможете создать ведро с именем "example.com", а затем сможете получить доступ к ведру как https://example.com.

Если это то, что вы хотите или ожидаете, вы упустили некоторые основы SSL.

Для веб-сервера, предлагающего SSL, он должен иметь сертификат SSL, подписанный доверенным центром сертификации. Этот сертификат не только содержит открытый ключ, используемый для шифрования, но также содержит имя хоста, для которого он действителен, и не будет работать для другого имени хоста. SSL не только обеспечивает шифрование, но также гарантирует, что веб-сайт, который вы достигли, действительно является веб-сайтом, которым вы его считаете. Для s3 имя хоста в сертификате *.s3.amazonaws.com и некоторые региональные варианты, которые я объясню ниже. Правила сопоставления имени хоста требуют, чтобы * не соответствовал чему-либо с точкой в ​​нем, поэтому *.s3.amazonaws.com соответствует example-bucket.s3.amazonaws.com (без точки в компоненте имени хоста, который выравнивается с *), но он не соответствует example.com.s3.amazonaws.com, потому что * не соответствует example.com, так как содержит точку. Эти правила накладываются браузерами, и это не является ограничением в S3.

Теперь, если вы пытаетесь использовать https://example.com для доступа к вашему ведру, S3 самостоятельно не включит это, потому что example.com сам по себе даже не удаленно похож на имя хоста в сертификате S3 SSL, который равен *.s3.amazonaws.com. Вам не только нужно приобрести сертификат SSL из центра сертификации, который был подписан для использования с "example.com", но вам также необходимо установить его на веб-сервере... который в этом случае является S3.. и S3 не поддерживает это.

Amazon CloudFront, однако, делает. Вы можете настроить дистрибутив CloudFront как front-end для вашего ведра и установить собственный SSL-сертификат на CloudFront, получив доступ к ведро через HTTPS. В этой конфигурации не имеет значения, каково ваше имя в виде ведра - оно даже не должно соответствовать вашему доменному имени, потому что вы можете настроить CloudFront для использования того, что хотите. Браузер извлекает контент через CloudFront, который, в свою очередь, вытягивает содержимое из ведра.

Теперь... предполагая, что это не то, о чем вы просите... предполагая, что вы не ожидаете, что ваш собственный домен будет работать в SSL с сертификатом Amazon... вы можете настроить ведро с точечным именем, что позволяет вы создаете CNAME для размещения вашего контента "example.com"... и по-прежнему обращаетесь к ведру с HTTPS. Однако вы не можете получить к нему доступ с помощью SSL с помощью CNAME по причинам, описанным выше... потому что ваше имя хоста не совпадает с сертификатом S3 SSL.

Однако, если вы хотите получить доступ к ведру с точками в имени по SSL, вы можете сделать это, используя региональную конечную точку, в которой было зарезервировано ваше ведро.

Ведро "example.com" в регионе us-west-2 будет устранено путем размещения имени ведра в первой части, если путь вместо этого, если начало имени хоста... вот так:

https://s3-us-west-2.amazonaws.com/example.com/path/to/file.jpg

Каждая область S3 имеет по крайней мере одну региональную конечную точку, которая работает именно так. Для региона "США-Стандарт" конечными точками являются "s3.amazonaws.com", который географически направляется на главный сайт в Вирджинии или на зеркальный сайт в Орегоне, "s3-external-1.amazonaws.com", который направляется только на Вирджиния, или "s3-external-2.amazonaws.com", который в значительной степени недокументирован, но направляется к зеркалу в Орегоне.

Таким образом, можно получить доступ к ресурсам в ведре с точками в имени по HTTPS, но вам нужно знать область ведра... хотя вы не можете просто получить к нему доступ с помощью https://your-cname.example.com из-за способа SSL работает вообще.