Настроим сертификат и полноценный доступ по https с валидным сертификатом к опубликованному в виде сайта бакету Yandex S3. Сертификат будем получить на домен, который находится за пределами Yandex.Cloud через Let’s Encrypt.

Что именно происходит

Если мы откроем настройка сайта для бакета, то увидим такую картину:

Настройка бакета для публикации сайта

Как вино ссылка будет указана с протоколом http, так как в название бакета использован домен и в нем присутствует разделитель в виде точки (.). Из-за этого открыть сайт без предупреждений браузера не получится:

1
2
3
4
5
6
7
❯ curl https://some.website.website.yandexcloud.net/
curl: (60) SSL: no alternative certificate subject name matches target hostname 'some.website.website.yandexcloud.net'
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the webpage mentioned above.

browser-ssl-error.png

По этой же причине, если настроить обязательную проверку сертификаты, в Cloudflare сайт так же не будет открываться. Все это связано с тем, что сертификат, который используется для показа бакета в виде сайта имеет только одно доступное для показа имя *.website.yandexcloud.net.

Сертификат

Yandex дает возможность выписывать Let’s Encrypt сертификаты:

Настройка для сертификата

После чего нужно будет выполнить проверку прав. Благо для этого есть возможность указать CNAME запись у своего любимого DNS провайдера, без переноса домена в Yandex.

Настройка CNAME для проверки владения доменом

После чего нужно будет вписать полученный CNAME у своего провайдера и ждать. Процесс совсем не быстрый, в моем случае прошло около 15 минут. Далее сертификат будет обновляться самим Yandex-ом, при условии живой CNAME.

Лог обновления сертификата

Теперь этот сертификат можно смело привязать к сайту в S3:

Привязанный сертификат к S3

Неочевидная польза

Если после этого открыть настройки сайта, то ссылка так и останется http:

Настройка бакета для публикации сайта

Это немного сбивает с толку, видимо это связано с тем, что домен находится вне Yandex-а. Но если попытаться проверить доступность сайта руками. Для этого пригодится параметр --connect-to в curl:

1
2
❯ curl --connect-to some.website:443:some.website.yandexcloud.net:443 https://some.website -s | head -c 32
<!doctype html><html lang=ru dir

То есть S3 понимает, что по домену some.website нужно отдавать вебсайт с бакета, у которого есть сертификат на some.website. Просто это нигде не отображается визуально. Теперь в настройках Cloudflare можно включить проверку сертификата источника и проксировать все через https.

Настройка проверки сертификата в Cloudflare

При этом сертификаты на обоих уровнях теперь будут обновляться автоматически.