На прошлых выходных Аня столкнулась с рекламой в моем http приложении bill-splitter. Так как решать проблему с обнаглевшими провайдерами долго и малоэффективно было решено получить сертификат и включить https что исключит возможность незаметно подменять содержимое сайта провайдером.
Я решил особо не париться и использовать раскрученный бесплатный центр сертификации: «Let’s Encrypt» и их утилиту: «Certbot«. Получение сертификата и переключение сайта, который крутится на Apache, прошла, на удивление, гладко и быстро. А вот с сервером для bill-splitter пришлось повозиться. Дальше немного подробностей о том как получить сертификат и о моих приключениях с spring-boot проектом в docker контейнере и сертификате.
Для начала о том как переключить свой сайт на https используя Certbot. Просто идем на https://certbot.eff.org/instructions выбираем в выпадающих списках OS, используемую на вашем сервере и собственно софт, на котором крутится ваш сайт. Если сайт крутится на каком-нибудь стороннем сервисе и у вас нет доступа к ssh, проверьте настройки этого сервиса, возможно у него есть какая-нибудь интеграция с Certbot.
Далее просто следуйте инструкциям для вашей комбинации OS и софта. Все. Этот бот может даже автоматически переконфигурировать Apache/Nginx чтобы переадресовывать все обращения на https версию сайта, которую он сам же и создаст и сконфигурирует. Но, в случае, если у вас используются сторонние сервисы, к которым идет обращение через http (например, из JS), лучше перед переключением всего сайта на https поправить эти ссылки.
Я большую часть ссылок поправил до запуска бота и переключения на https, но bill-splitter решил править позже. И это вышло мне боком. Бот, с моего позволения, переключил сайт на https и настроил редиректы. Но в bill-splitter есть обращение из JS к серверу на том же домене, к которому еще не подключен сертификат. Соотвественно загрузка/сохранение сломались.
Я, долго не думая, пошел гуглить как подключить сертификат к spring-boot проекту. Большая часть инструкций была про то, как подключить PKCS12 store (объединенные сертификат и ключ), а Certbot генерирует отдельно сертификат, отдельно ключи. Использую openssl сгенерировал PKCS12 store и начал думать как его пробросить в docker-container. Напрямую его размещать в коде нельзя, тк у меня публичный репозиторий, поэтому начал гуглить как пробросить файл с хоста в контейнер. И вот здесь меня поджидала проблема.
В общем, нашел 1 способ как пробросить файлы/папки в контейнер: при запуске контейнера используем ключ -v, который позволяет подключить папку как shared volume. Перед этим я решил поправить docker-file и создавать эту папку при создании контейнера.
Далее поправил конфиг spring-boot проекта, чтобы он работал по https и ждал запросы от https версии сервиса и пошел пересобирать контейнер и проверять. Но тут меня ждала неприятность: при запуске контейнера он ругался на проблемы с автоматическим определением размера памяти, которую займет контейнер от java buildpack. И, не вдаваясь особо в детали, я загуглил текст ошибки и начал пытаться ее исправить.
Пару часов спустя, даже после конфигурации всех возможных параметров для java buildpack, так ничего и не заработало. И я решил зайти с другой стороны. До меня дошло что раньше этих проблем не было, на работе таких проблем я тоже не встречал, а значит проблема в чем то другом. Я еще раз проверил логи создания контейнера, и… Да, проблема оказалась в том, что я изменил версию проекта, при билде создался новый jar файл и docker-file перестал быть валидным, он пытался скопировать 1 jar файл из папки билда, а там их было уже 5.
Да, такая нелепая проблема съела часа 3. После исправления этой проблемы, снова собрал новый контейнер, запустил его, и все, наконец, завелось! Теперь весь zavedyaev.ru работает по https 🙂
Что делать с наглыми провайдерами так и не понятно. Хорошо что мои провайдеры пока такой ерундой не страдают.