Kafka 3.7 SSL 인증서 및 공인 도메인 프록시 설정 가이드

  1. JDK 및 Zookeeper 설치

이 단계는 생략하며, 별도의 설치 가이드를 참고하여 JDK와 Zookeeper를 설치한다.

  1. Kafka 서버 및 클라이언트 인증서 생성

2.1 서버 인증서 생성

먼저 SSL 인증서 저장용 디렉토리를 생성한다.

mkdir ssl && cd ssl

# 1. CA 인증서 생성
# CN 값은 실제 사용할 도메인 이름이어야 한다. 본 가이드에서는 kafka.test.com 도메인을 사용한다.
openssl req -new -x509 -keyout ca-key -out ca-cert -days 36500 -passout pass:ServerPassword123 -subj "/C=kr/ST=seoul/L=seoul/O=company/OU=dev/CN=kafka.test.com"

# 2. 서버 키쌍 생성
# server.keystore.jks 파일이 없으면 새로 생성된다.
# SAN 확장에는 연결에 사용할 도메인이나 IP를 반드시 포함해야 한다.
keytool -keystore server.keystore.jks -alias kafka-server -validity 36500 -genkey \
-keyalg RSA -dname "CN=kafka.test.com,OU=dev,O=company,L=seoul,S=seoul,C=kr" \
-ext "SAN=DNS:kafka.test.com,DNS:localhost,IP:127.0.0.1" -storepass ServerPassword123 -keypass ServerPassword123

# 3. CSR 생성 및 서명
# 서버 키쌍에서 CSR을 생성한다.
keytool -keystore server.keystore.jks -alias kafka-server -certreq -file server.csr -storepass ServerPassword123

# OpenSSL로 서명할 때 SAN 정보를 포함시키기 위한 설정 파일 생성
echo "subjectAltName=DNS:kafka.test.com,DNS:localhost,IP:127.0.0.1" > san.ext

# CA 개인키로 서버 인증서에 서명한다.
openssl x509 -req -CA ca-cert -CAkey ca-key -in server.csr -out server.crt -days 36500 -CAcreateserial -passin pass:ServerPassword123 -extfile san.ext

# 4. CA 및 서명된 인증서 가져오기
# 신뢰할 수 있는 CA 인증서를 키스토어에 추가한다.
keytool -keystore server.keystore.jks -alias CARoot -import -file ca-cert -storepass ServerPassword123 -noprompt 

# 서명된 서버 인증서를 키스토어에 추가한다.
keytool -keystore server.keystore.jks -alias kafka-server -import -file server.crt -storepass ServerPassword123 -noprompt 

2.2 클라이언트 인증서 생성

# 1. 클라이언트 키쌍 생성
# 클라이언트용 CN과 SAN은 식별 목적이다.
keytool -keystore client.keystore.jks -alias kafka-client -validity 36500 -genkey \
  -keyalg RSA -dname "CN=client-user1,OU=dev,O=company,L=seoul,S=seoul,C=kr" \
  -ext "SAN=DNS:client-user1" -storepass ClientPassword456 -keypass ClientPassword456

# 2. 클라이언트 CSR 생성
keytool -keystore client.keystore.jks -alias kafka-client -certreq -file client.csr -storepass ClientPassword456

# 3. 클라이언트 인증서 서명
openssl x509 -req -CA ca-cert -CAkey ca-key -in client.csr -out client.crt -days 36500 -CAcreateserial -passin pass:ServerPassword123

# 4. CA 및 서명된 인증서 가져오기
keytool -keystore client.keystore.jks -alias CARoot -import -file ca-cert -storepass ClientPassword456 -noprompt
keytool -keystore client.keystore.jks -alias kafka-client -import -file client.crt -storepass ClientPassword456 -noprompt

2.3 트러스트스토어 설정

# CA 인증서를 서버 및 클라이언트 트러스트스토어에 각각 추가한다.
keytool -keystore server.truststore.jks -alias CARoot -import -file ca-cert -storepass ServerPassword123 -noprompt
keytool -keystore client.truststore.jks -alias CARoot -import -file ca-cert -storepass ClientPassword456 -noprompt

2.4 인증서 검증

# hosts 파일에 도메인 추가
echo '192.168.200.131 kafka.test.com' >> /etc/hosts

# 서버 인증서의 SAN 정보 확인
openssl x509 -in server.crt -text -noout | grep -A 1 "Subject Alternative Name"

# 서버 인증서의 CN 정보 확인
openssl x509 -in server.crt -text -noout | grep 'Subject:'

# 키스토어 상세 정보 확인
keytool -list -v -keystore server.keystore.jks -storepass ServerPassword123

# SSL 핸드셰이크 테스트
openssl s_client -debug -connect kafka.test.com:9093 -tls1_2

# 클라이언트 개인키 추출 (PKCS12 형식 변환)
keytool -importkeystore -srckeystore client.keystore.jks -destkeystore client.p12 -deststoretype PKCS12 -srcstorepass ClientPassword456 -deststorepass ClientPassword456

# OpenSSL로 개인키 확인
openssl pkcs12 -in client.p12 -nocerts -nodes -passin pass:ClientPassword456

# 클라이언트 인증서로 SSL 연결 테스트
openssl s_client -connect kafka.test.com:9093 \
  -servername kafka.test.com \
  -cert client.crt \
  -key <(openssl pkcs12 -in client.p12 -nocerts -nodes -passin pass:ClientPassword456) \
  -CAfile ca-cert \
  -tls1_2 -state -debug
  1. Kafka 설정
tar xf kafka_2.13-3.7.0.tgz -C /usr/local
cd /usr/local
ln -sv kafka_2.13-3.7.0 kafka
cd kafka
cp -r /root/ssl .

cd config/
cp server.properties server.properties-bak

vim server.properties
broker.id=0
log.dirs=/Data/kafka
num.partitions=1

# 네트워크 설정
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://kafka.test.com:9093
advertised.listeners=INTERNAL://192.168.200.131:9092,EXTERNAL://kafka.test.com:9093
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:SSL
inter.broker.listener.name=INTERNAL

# SSL/TLS 설정
ssl.keystore.location=/usr/local/kafka/ssl/server.keystore.jks
ssl.keystore.password=ServerPassword123
ssl.key.password=ServerPassword123
ssl.truststore.location=/usr/local/kafka/ssl/server.truststore.jks
ssl.truststore.password=ServerPassword123
ssl.endpoint.identification.algorithm=HTTPS
ssl.client.auth=required

# 성능 설정
num.network.threads=5
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
num.recovery.threads.per.data.dir=4

# 로그 설정
log.segment.bytes=1073741824
log.retention.hours=168
log.retention.bytes=10737418240
log.retention.check.interval.ms=300000
log.flush.interval.messages=50000
log.flush.interval.ms=5000

# 복제 설정
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
default.replication.factor=1

# Zookeeper 설정
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
zookeeper.session.timeout.ms=18000

# 기타 설정
group.initial.rebalance.delay.ms=0
  1. Kafka 실행 및 검증
# 서비스 시작
mkdir -pv /Data/kafka
cd /usr/local/kafka/bin/
./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
netstat -tnlp

# 내부 리스너 포트 검증
./kafka-topics.sh --bootstrap-server 192.168.200.131:9092 --list

# 외부 SSL 포트 검증
# 클라이언트 SSL 설정 파일 생성
vim client-ssl.properties
bootstrap.servers=kafka.test.com:9093
security.protocol=SSL
ssl.keystore.location=/usr/local/kafka/ssl/client.keystore.jks
ssl.keystore.password=ClientPassword456
ssl.truststore.location=/usr/local/kafka/ssl/client.truststore.jks
ssl.truststore.password=ClientPassword456

# 토픽 목록 조회
./kafka-topics.sh --bootstrap-server kafka.test.com:9093 --list --command-config client-ssl.properties

# 토픽 생성
./kafka-topics.sh --bootstrap-server kafka.test.com:9093 --create --topic test-ssl-topic --command-config client-ssl.properties

# 프로듀서 실행
./kafka-console-producer.sh --bootstrap-server kafka.test.com:9093 --topic test-ssl-topic --producer.config client-ssl.properties

# 컨슈머 실행
./kafka-console-consumer.sh --bootstrap-server kafka.test.com:9093 --topic test-ssl-topic --from-beginning --consumer.config client-ssl.properties

태그: kafka SSL Security OpenSSL keytool

6월 18일 20:35에 게시됨