Как включить 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 Официальные док-ты

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

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

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

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

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?

03.02.2023 09:34

Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому дизайну, а размер сборки просто крошечный.

LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу

03.02.2023 08:15

Увеличение подматриц на единицу - LeetCode

Переключение светлых/темных тем
Переключение светлых/темных тем

02.02.2023 09:04

В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно использовать для установки светлых/темных стилей и добавления интерактивных функций с помощью JavaScript. Следуйте инструкциям, и вы готовы к работе!

Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения

02.02.2023 07:39

Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой статье мы расскажем, как создавать и управлять отношениями "многие ко многим" в Laravel с помощью методов присоединения и отсоединения вместо...

В PHP
В PHP

02.02.2023 07:16

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

Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel

01.02.2023 11:27

Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку приложений, такие как маршрутизация, ORM (Object-Relational Mapping), шаблонизация и аутентификация. Laravel имеет архитектуру на основе...