Настройка односторонней аутентификации (One-Way SSL) для kafka
- суббота, 5 апреля 2025 г. в 00:00:08
Настройка односторонней аутентификации (One-Way SSL) для kafka предполагает, что сервер проверяет свою подлинность перед клиентами с использованием SSL-сертификата, но клиенты не предоставляют свои сертификаты. Это наиболее распространенный сценарий использования SSL в kafka.
Ниже приведен пошаговый процесс настройки односторонней аутентификации:
Если у вас еще нет SSL-сертификатов, выполните следующие шаги для их создания:
# Создаем директорию для SSL
mkdir -p ssl && cd ssl
# Генерируем корневой сертификат (CA)
openssl req -new -x509 -keyout ca.key -out ca.crt -days 365 -nodes \
-subj "/CN=kafka-Security-CA"
# Генерируем приватный ключ для сервера
openssl genrsa -out server.key 2048
# Создаем CSR (Certificate Signing Request) для сервера
openssl req -new -key server.key -out server.csr \
-subj "/CN=kafka-server"
# Подписываем серверный сертификат с помощью CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
# Генерируем truststore для клиентов
keytool -keystore client.truststore.jks -alias CARoot -import -file ca.crt -storepass password -noprompt
После выполнения этих команд у вас будут:
ca.crt
— корневой сертификат.
server.crt
и server.key
— сертификат и приватный ключ сервера.
client.truststore.jks
— truststore для клиентов.
kafka требует, чтобы серверные сертификаты хранились в формате JKS (Java KeyStore). Создайте keystore:
# Преобразуем серверный сертификат и ключ в PKCS12 формат
openssl pkcs12 -export -in server.crt -inkey server.key -name kafka-server -out server.keystore.p12 -password pass:password
# Конвертируем PKCS12 в JKS
keytool -importkeystore -srckeystore server.keystore.p12 -srcstoretype PKCS12 -destkeystore server.keystore.jks -deststoretype JKS -storepass password
Создайте файл docker-compose.yml
для запуска Kafka с SSL:
version: '3.8'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092" # Порт без SSL
- "9093:9093" # Порт с SSL
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,SSL://0.0.0.0:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,SSL://localhost:9093
KAFKA_SSL_KEYSTORE_FILENAME: server.keystore.jks
KAFKA_SSL_KEYSTORE_CREDENTIALS: keystore_creds
KAFKA_SSL_KEY_CREDENTIALS: key_creds
KAFKA_SSL_TRUSTSTORE_FILENAME: server.truststore.jks
KAFKA_SSL_TRUSTSTORE_CREDENTIALS: truststore_creds
volumes:
- ./ssl/server.keystore.jks:/etc/kafka/secrets/server.keystore.jks
- ./ssl/ca.crt:/etc/kafka/secrets/ca.crt
- ./ssl/client.truststore.jks:/etc/kafka/secrets/server.truststore.jks
- ./ssl_credentials:/etc/kafka/secrets/credentials
Создайте файлы с паролями для доступа к хранилищам:
echo "password" > ssl_credentials/keystore_creds
echo "password" > ssl_credentials/key_creds
echo "password" > ssl_credentials/truststore_creds
В результате должна получиться следующая структура файлов:
.
├── client.properties
├── docker-compose.yml
├── ssl
│ ├── ca.crt
│ ├── ca.key
│ ├── ca.srl
│ ├── client.truststore.jks
│ ├── server.crt
│ ├── server.csr
│ ├── server.key
│ ├── server.keystore.jks
│ ├── server.keystore.p12
│ └── server.truststore.jks
└── ssl_credentials
├── key_creds
├── keystore_creds
└── truststore_creds
Запустите kafka с помощью команды:
docker-compose up -d
Для подключения клиента к kafka через SSL (например, из командной строки или Offset Explorer), используйте следующие параметры:
###Пример конфигурации клиента (client.properties
):
security.protocol=SSL
ssl.truststore.location=/path/to/client.truststore.jks
ssl.truststore.password=password
ssl.endpoint.identification.algorithm=
kafka-console-producer --broker-list localhost:9093 --topic test-topic \
--producer.config client.properties
Чтобы убедиться, что все работает корректно:
Запустите kafka и создайте топик:
kafka-topics --bootstrap-server localhost:9093 --create --topic test-topic --partitions 1 --replication-factor 1
Отправьте сообщение в топик:
kafka-console-producer --broker-list 127.0.0.1:9093 --topic test-topic \
--producer.config client.properties
Прочитайте сообщение из топика:
kafka-console-consumer --bootstrap-server 127.0.0.1:9093 --topic test-topic --from-beginning \
--consumer.config client.properties