Серия Netty: зашифровать чат

Java Netty

Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Введение

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

Конечно, описанная выше работа в netty не требует от нас реализации вручную. Netty предоставила нам на выбор канал, поддерживающий SSL. Давайте посмотрим.

Стандарт PKI

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

Фактически стандарт PKI включает два поколения протоколов.

Первое поколение стандартов PKI в основном состоит из стандарта шифрования с открытым ключом PKCS компании RSA в США, ITU-T X.509 Международного союза электросвязи, X.509 IETF, WAP и WPKI и других стандартов. Но поскольку стандарт PKI первого поколения закодирован на основе абстрактной синтаксической нотации ASN.1, его сложнее реализовать, поэтому создается стандарт PKI второго поколения.

Стандарт PKI второго поколения представляет собой спецификацию управления ключами на основе XML, также известную как XKMS, выпущенную Microsoft, VeriSign и webMethods в 2001 году.

На самом деле наиболее распространенными спецификациями, используемыми центром CA, являются серии X.509 и серии PKCS.

Серия X.509 в основном состоит из X.209, X.500 и X.509, из которых X.509 является стандартом цифровых сертификатов, разработанным Международным союзом электросвязи (ITU-T). Расширенные функции на основе X.500, X.509 был выпущен в 1988 году. Сертификат X.509 состоит из открытого ключа пользователя и идентификатора пользователя. Кроме того, он также включает такую ​​информацию, как номер версии, серийный номер сертификата, идентификатор ЦС, идентификатор алгоритма подписи, имя издателя и срок действия сертификата.

PKCS — это стандарт шифрования с открытым ключом компании RSA в США, включающий ряд связанных протоколов с точки зрения применения сертификата, продления сертификата, выпуска таблицы отзыва сертификата, расширенного содержимого сертификата, цифровой подписи и формата цифрового конверта. Он определяет серию стандартов от PKCS#1 до PKCS#15.

Наиболее часто используются PKCS#7, PKCS#12 и PKCS#10. PKCS#7 — это синтаксис запроса сообщения, обычно используемый для цифровой подписи и шифрования, а PKCS#12 — это синтаксис обмена и упаковки личных сообщений, который в основном используется для создания открытых и закрытых ключей. PKCS#10 — это синтаксис запроса сертификата.

Суффикс и преобразование различных сертификатов

Друзья, которые работали с сертификатами, могут быть ослеплены суффиксами сертификатов, вообще говоря, это суффиксы сертификатов DER, CRT, CER и PEM.

DER указывает, что содержимое сертификата закодировано в двоичном формате.

Файл PEM представляет собой текстовый файл, содержимое которого начинается с «-BEGIN-», символов в кодировке Base64.

CRT и CER в основном эквивалентны.Они оба являются расширениями сертификатов и текстовых файлов.Разница в том, что CRT обычно используется в системах Linux и Unix, а CER обычно используется в системе Windows. А в системе Windows файл CER будет распознан командой MS cryptoAPI, которая может напрямую отображать диалоговое окно для импорта и/или просмотра содержимого сертификата.

Файл KEY в основном используется для сохранения открытых и закрытых ключей стандарта PKCS#8.

Для просмотра содержимого текстового сертификата можно использовать следующую команду:

openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout

Для просмотра содержимого двоичного сертификата можно использовать следующую команду:

openssl x509 -in cert.der -inform der -text -noout

Ниже приведены распространенные преобразования PEM и DER:

PEM到DER

openssl x509 -in cert.crt -outform der-out cert.der

DER到PEM

openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

Запустить SSL-сервер в netty

На самом деле заголовок неверный.Сервер, запущенный в netty, остается исходным сервером, но отправляемое сообщение шифруется и расшифровывается. То есть добавляется обработчик, предназначенный для операций SSL.

Класс, представляющий процессор ssl в netty, называется SslHandler, который является внутренним классом инженерного класса SslContext, поэтому нам нужно только создать SslContext, чтобы вернуть SslHandler, вызвав метод newHandler.

Код для поддержки SSL сервером:

 ChannelPipeline p = channel.pipeline();
   SslContext sslCtx = SslContextBuilder.forServer(...).build();
   p.addLast("ssl", sslCtx.newHandler(channel.alloc()));

Код, чтобы клиент поддерживал SSL:

ChannelPipeline p = channel.pipeline();
   SslContext sslCtx = SslContextBuilder.forClient().build();
   p.addLast("ssl", sslCtx.newHandler(channel.alloc(), host, port));

Существует два способа реализации SSL в netty: по умолчанию используется OpenSSL, если OpenSSL недоступен, будет использоваться реализация JDK.

Чтобы создать SslContext, вызовите методы SslContextBuilder.forServer или SslContextBuilder.forClient.

Возьмите сервер в качестве примера, чтобы увидеть процесс создания. SslContextBuilder имеет множество методов forServer, вот самый простой для анализа:

    public static SslContextBuilder forServer(File keyCertChainFile, File keyFile) {
        return new SslContextBuilder(true).keyManager(keyCertChainFile, keyFile);
    }

Этот метод принимает два параметра: keyCertChainFile — это файл сертификата X.509 в формате PEM, а keyFile — файл закрытого ключа PKCS#8.

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

Конкретные операции openssl можно найти в других моих статьях, которые здесь подробно объясняться не будут.

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

Если посмотреть на имя этого класса, это означает, что это класс самоподписанного сертификата, а файл сертификата и файл закрытого ключа будут автоматически сгенерированы во временной папке системы, поэтому этот класс не рекомендуется использовать в производственной среде. По умолчанию этот класс будет использовать OpenJDK X.509 для создания закрытого ключа сертификата, если это невозможно, вместо него будет использоваться Bouncy Castle.

Запустите SSL-клиент в netty

Точно так же поддержка SSL в клиенте также требует создания обработчика. Код создания SslContext клиента выглядит следующим образом:

// 配置 SSL.
        final SslContext sslCtx = SslContextBuilder.forClient()
                .trustManager(InsecureTrustManagerFactory.INSTANCE).build();

В приведенном выше коде мы используем InsecureTrustManagerFactory.INSTANCE в качестве trustManager. Что такое TrustManager?

Когда клиент и сервер устанавливают соединение SSL, клиент должен проверить правильность сертификата, отправленного сервером.Обычно эта проверка выполняется на сервере ЦС, но для этого требуется реальная среда сертификатов ЦС.Так что в тесте , мы используем InsecureTrustManagerFactory, этот класс будет принимать все сертификаты по умолчанию и игнорировать все исключения сертификатов.

Разумеется, CA-сервер не обязателен.Цель проверки клиента - проверить, совпадает ли открытый ключ в сертификате с открытым ключом отправителя.Тогда для среды, которая не может быть подключена к Интернету или самостоятельно подписанной среде, нам нужно только проверить, что отпечатки пальцев в сертификате согласованы на стороне клиента.

В netty предоставляется класс FingerprintTrustManagerFactory, который может проверять отпечаток пальца в сертификате.

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

Шаги для извлечения отпечатка из сертификата с помощью openssl следующие:

openssl x509 -fingerprint -sha256 -in my_certificate.crt

Суммировать

Установив обработчик SSL на стороне клиента и сервера, можно реализовать зашифрованную передачу сообщений между клиентом и сервером.

Примеры этой статьи могут относиться к:learn-netty4

Эта статья была включена вwoohoo.floydpress.com/12-Нетти-цвет…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!