Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
В предыдущей статье мы включили 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. Вот краткий снимок этого
Это все для этого поста.
Надеюсь, вам понравилось. Если да, пожалуйста, похлопайте 👏 и напишите свои мысли в разделе 💬 комментариев.
Пожалуйста, следите за другими подобными материалами.
До тех пор, спасибо и счастливого обучения!!! 📚
03.02.2023 09:34
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому дизайну, а размер сборки просто крошечный.
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. Следуйте инструкциям, и вы готовы к работе!
02.02.2023 07:39
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой статье мы расскажем, как создавать и управлять отношениями "многие ко многим" в Laravel с помощью методов присоединения и отсоединения вместо...
02.02.2023 07:16
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и затруднить понимание того, на какой компонент ссылаются в том или ином контексте.
01.02.2023 11:27
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку приложений, такие как маршрутизация, ORM (Object-Relational Mapping), шаблонизация и аутентификация. Laravel имеет архитектуру на основе...