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 работает вообще.