Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
В предыдущей статье мы включили TLS на стороне сервера, а в этом блоге мы рассмотрим, как включить взаимный TLS, он же двусторонний TLS. Для этого мы создадим клиентские сертификаты и включим взаимный TLS между клиентом и сервером.
ПРИМЕЧАНИЕ: Это продолжение предыдущего блога, где мы рассмотрели, как включить TLS на стороне сервера. Поэтому, пожалуйста, сначала ознакомьтесь с нижеследующим постом, прежде чем продолжить этот пост, так как этот пост является продолжением первой части.
Как включить TLS в gRPC клиенте и сервере: 1
Клиент и сервер аутентифицируют друг друга, чтобы убедиться, что обе стороны, участвующие в коммуникации, являются доверенными. Обе стороны передают друг другу свои публичные сертификаты, а затем на их основе выполняется проверка/валидация.
mTLS Process FlowТеперь, когда у нас есть понимание процесса mTLS, давайте испачкаем руки!!! 💻
Прежде чем начать, давайте сначала проверим, что происходит, когда мы пытаемся подключить нашего клиента к серверу с включенным mTLS. Чтобы включить mTLS на сервере, нам нужно установить clientAuth в TlsServerCredentials в REQUIRE.
Теперь, с включенным mTLS на сервере, когда наш клиент пытается подключиться, он терпит неудачу с javax.net.ssl.SSLException: error:1000045c:SSL routines:OPENSSL_internal:TLSV1_ALERT_CERTIFICATE_REQUIRED
Но почему❓
✅ Это происходит из-за того, что серверу также необходимо подтвердить клиента. Мы можем добиться этого, передав клиенту 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
2. Создадим хранилище ключей и передадим его объекту ChannelCredentials в gRPC-клиенте:
Нам нужно предоставить нашему клиенту keyStore, содержащий клиентский ключ и сертификат, и создать ChannelCredentials с ним, как показано ниже:
Теперь, когда у нас настроено хранилище ключей для клиента, давайте попробуем подключиться к серверу... 🤞
Почему снова 😥❓
✅ Мы предоставили клиентские сертификаты, но это самоподписанные сертификаты, которые не являются глобальным доверенным центром сертификации. Нам нужно указать серверу доверять сертификатам, подписанным нашим rootCA. Этого можно добиться, передав серверу самоподписанный сертификат rootCA в Trust Store.
И, теперь !!! 👍
Нам удалось успешно включить взаимный TLS между клиентом и сервером gRPC. Вот краткий снимок этого
Это все для этого поста.
Надеюсь, вам понравилось. Если да, пожалуйста, похлопайте 👏 и напишите свои мысли в разделе 💬 комментариев.
Пожалуйста, следите за другими подобными материалами.
До тех пор, спасибо и счастливого обучения!!! 📚
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.