Служба обнаружения сертификатов


Я разрабатываю микросервисную архитектуру и уже настроил защиту https, используя сертификаты SSL, созданные с помощью Let's Encrypt и certbot.

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

Чтобы избежать этого, я пытаюсь реализовать набор REST API, который может разрешить службам программно и автоматически получать новые сертификаты и импортировать их в свое собственное хранилище ключей или просто использовать его программно.

Как сказано в названии: что-то вроде «Служба обнаружения сертификатов» или, если хотите, «Удаленное хранилище сертификатов».

Я знаю, что есть пакет java.security. *, Который позволяет мне заниматься подобными вещами, но у меня есть два вопроса ко всем вам:

  1. Считаете ли вы, что с архитектурной точки зрения это лучший подход к решению моей проблемы?
  2. Какой король процесса сериализации / десериализации вы порекомендуете? Есть ли уже какая-нибудь библиотека / фреймворк / инструмент, который делает что-то подобное, что я могу использовать?

Спасибо. Пока-пока

Я бы не возлагал ответственность за эту инфраструктуру на микросервисы. Вместо этого я бы создал специальный сервис для обновления сертификатов и перезапуска, если необходимо, микросервисов.

Constantin Galbenu 19.05.2018 18:46

Спасибо Константин. Я предполагаю, что под «службой» вы подразумеваете системную службу. Хорошо, я понимаю вашу точку зрения, но что, если мои микросервисы распределены на нескольких виртуальных машинах?

sirnino 19.05.2018 20:16

По-разному. Например, если вы используете Docker Swarm, вы можете поместить сертификаты в секреты Docker, а Swarm позаботится о репликации. Вы также можете использовать rsync или scp для копирования сертификатов.

Constantin Galbenu 19.05.2018 20:19

В конкретном случае докер-секрет - лучшее решение. Спасибо

sirnino 22.05.2018 23:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
72
1

Ответы 1

К вашему сведению, это «вопрос мнения», который некоторые люди не одобряют в StackOverflow, но я не один из таких людей, поэтому я дам вам свои 2 цента.

Интегрированное решение против составного решения

Сценарий, который вы описываете, является одной из причин, по которой я создал Greenlock.js (набор клиентской библиотеки ACME / Let's Encrypt, cli и веб-сервера).

Мне нужно было полностью интегрированное решение, которое могло бы автоматически предоставлять сертификаты без ручного вмешательства (кроме того, в то время certbot было очень сложно установить и использовал так много оперативной памяти, что я не мог использовать его на устройствах IoT, с которыми я работал).

В моем случае я создал систему плагинов, позволяющую использовать различные механизмы хранения (fs, redis, sql, aws s3, azure storage и т. д.), А затем другие авторы предоставили большую часть этих механизмов.

Похоже, certbot, вероятно, будет работать для вас как составное решение (обертывание его), но если вы собираетесь столкнуться с проблемой создания хранилищ сертификатов и т. д., Вы также можете интегрироваться с библиотекой Java ACME (просто убедитесь, что он поддерживает ACME draft 11 / Let's Encrypt v02).

Еще одна мысль - использовать что-то вроде Greenlock в качестве интерфейса https, который обращает прокси в ваше приложение (хотя Greenlock может не соответствовать вашим потребностям - решение java или go, если оно существует, может работать лучше для вас из-за звука из него).

(Мне также кажется интересным создание некоторых REST API вокруг Greenlock, чтобы позволить ему функционировать как микросервис для распространения сертификатов, и для этого не потребуется много работы, но мне нужно будет узнать больше о вашем проекте. чтобы лучше понять)

Резюме:

  • составлять (переносить) certbot для каждой службы и синхронизировать файлы с удаленным хранилищем в качестве микросервиса
  • интегрировать собственное решение ACME / Let's Encrypt и синхронизировать с плагином для хранения, чтобы разрешить различные типы существующих служб хранения
  • создать отдельную службу для обработки выдачи сертификатов, использовать rest api для каждой службы

Все они действительны, и в зависимости от того, какой код уже доступен, их все будет довольно легко выполнить.

Единственная проблема с запуском certbot на каждом экземпляре заключается в том, что может быть сложно подключиться к системе, которую он использует для проверки сертификатов, чтобы вместо этого использовать удаленную службу.

Лучший выбор?

Я лично считаю, что второй вариант (интеграция кода ACME в службы и наличие архитектуры плагинов для хранения) является лучшим, потому что в случае сбоя микросервиса, обрабатывающего сертификаты ACME, другие ваши службы по-прежнему могут получить свои собственные ( поиск не выполняется, они получают сертификат, а не используют существующий). Это прогрессивное улучшение. Это также то, для чего неплохо поддается архитектура плагинов Greenlock.

Форматы и пакеты

Кто-то может сказать, что вы хотите иметь хранилище ключей с паролями и т.п., используя P12, и я думаю, что это действительно так.

Однако он уже будет зашифрован при передаче и почти наверняка будет раскрыт таким образом, что, если ваш веб-сервер будет скомпрометирован, кодовая фраза также будет скомпрометирована, поэтому я бы предпочел использовать простые PEM и JWK.

В вашем случае это звучит так, будто вам, вероятно, не нужен JWK, так что это будет означать только PEM.

PEM требует только удаления пробелов и комментариев, а затем декодирования из стандартного Base64, если по какой-либо причине вам нужно было декодировать его в DER вручную. Точно так же его можно преобразовать в Base64URLSafe, удалив комментарии и пробелы, а затем заменив - на _ и / на +.

Также мне очень нравится схема хранения и распределения этих произведений:

  • cert.pem
  • chain.pem
  • privkey.pem

Потому что их легко комбинировать любым способом, который вам нужен, чтобы доставить их на любой тип веб-сервера.

  • fullchain.pem (cert.pem + chain.pem) для Apache, Nginx, Node и т. д.
  • bundle.pem (fullchain.pem + privkey.pem) для HAProxy

Итак, я бы сказал, отправьте объект JSON с помощью PEM:

{ "cert": "..."
, "chain": "..."
, "privkey": "..."
}

А затем позвольте клиенту выполнить response.cert + '\\r\\n' + response.chain и т. д., Чтобы построить fullchain.pem или bundle.pem по мере необходимости.

Лучший выбор?

Все, что является самым простым и переносимым - возможно, PEM, затем JWK, затем, возможно, Base64URLSafe, но не пользовательский формат для какой-либо конкретной библиотеки Java. В будущем вы можете расширить поддержку сервисов, отличных от Java.

Другие вопросы по теме