Как включить TLS в gRPC-клиенте и сервере : 2

RedDeveloper
18.01.2023 08:41
Как включить TLS в gRPC-клиенте и сервере : 2

Как включить TLS в gRPC-клиенте и сервере : 2

Введение

Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.

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

ПРИМЕЧАНИЕ: Это продолжение предыдущего блога, где мы рассмотрели, как включить TLS на стороне сервера. Поэтому, пожалуйста, сначала ознакомьтесь с нижеследующим постом, прежде чем продолжить этот пост, так как этот пост является продолжением первой части.

Как включить TLS в gRPC клиенте и сервере: 1

Взаимный TLS (двусторонний TLS)

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

mTLS Process Flow

Теперь, когда у нас есть понимание процесса mTLS, давайте испачкаем руки!!! 💻

Включите mTLS на сервере:

Прежде чем начать, давайте сначала проверим, что происходит, когда мы пытаемся подключить нашего клиента к серверу с включенным mTLS. Чтобы включить mTLS на сервере, нам нужно установить clientAuth в TlsServerCredentials в REQUIRE.

Прежде чем начать давайте сначала проверим что происходит когда мы пытаемся подключитьEnable ClientAuth on Server

Теперь, с включенным mTLS на сервере, когда наш клиент пытается подключиться, он терпит неудачу с javax.net.ssl.SSLException: error:1000045c:SSL routines:OPENSSL_internal:TLSV1_ALERT_CERTIFICATE_REQUIRED

Теперь с включенным mTLS на сервере когда наш клиент пытается подключиться он терпитSSL Exception on client

Но почему❓

✅ Это происходит из-за того, что серверу также необходимо подтвердить клиента. Мы можем добиться этого, передав клиенту keyStore.

1. Создайте клиентский ключ и сертификат:

Итак, давайте создадим клиентские сертификаты, которые будут самоподписаны нашими учетными данными rootCA (rootCA был создан в предыдущем посте).

# create client key
openssl genrsa -des3 -out client.key 2048
# create client certificate request using the client key
openssl req -new -sha256 -key client.key -out client.csr
# create client.pem using rootCA credentials
openssl x509 -req -in client.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out client.pem -days 365 -sha256
Итак давайте создадим клиентские сертификаты которые будут самоподписаны нашими учетнымиopenssl outputИтак давайте создадим клиентские сертификаты которые будут самоподписаны нашими учетнымиcreate client.pem

2. Создадим хранилище ключей и передадим его объекту ChannelCredentials в gRPC-клиенте:

Нам нужно предоставить нашему клиенту keyStore, содержащий клиентский ключ и сертификат, и создать ChannelCredentials с ним, как показано ниже:

Нам нужно предоставить нашему клиенту keyStore содержащий клиентский ключ и сертификат иCreate keyStore using client credentials

Теперь, когда у нас настроено хранилище ключей для клиента, давайте попробуем подключиться к серверу... 🤞

Теперь когда у нас настроено хранилище ключей для клиента давайте попробуем подключиться

Почему снова 😥❓

✅ Мы предоставили клиентские сертификаты, но это самоподписанные сертификаты, которые не являются глобальным доверенным центром сертификации. Нам нужно указать серверу доверять сертификатам, подписанным нашим rootCA. Этого можно добиться, передав серверу самоподписанный сертификат rootCA в Trust Store.

✅ Мы предоставили клиентские сертификаты но это самоподписанные сертификаты которые неAdd ca.crt to server’s trustStore

И, теперь !!! 👍

И теперь !!! 👍mTLS Successfully Enabled.

Резюме:

Нам удалось успешно включить взаимный TLS между клиентом и сервером gRPC. Вот краткий снимок этого

  1. Включите mTLS на стороне сервера.
  2. Создайте клиентский ключ и сертификат.
  3. Передайте хранилище ключей клиенту через TlsChannelCredentials.keyManager(новый файл("certs/server.crt"), новый файл("certs/server.pem")).
  4. Передайте хранилище доверия, содержащее сертификат самоподписывающегося центра, серверу через TlsServerCredentials.trustManager(new File("certs/ca.crt"))

Ссылки:

  • Двухсторонний SSL
  • gRPG hello-world с примером TLS
  • gRPC Официальные док-ты

Это все для этого поста.

Надеюсь, вам понравилось. Если да, пожалуйста, похлопайте 👏 и напишите свои мысли в разделе 💬 комментариев.

Пожалуйста, следите за другими подобными материалами.

До тех пор, спасибо и счастливого обучения!!! 📚

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.