🔍 문제 분석

  1. Must specify either --ca or --ca-cert/--ca-key or --self-signed 오류
    • elasticsearch-certutil cert 실행 시 CA 인증서를 명시적으로 지정하지 않아서 발생한 오류입니다.
    • CA 인증서를 사용하려면 --ca-cert 및 --ca-key 옵션을 지정해야 합니다.
  2. Expand-Archive: 파일이 이미 있어서 압축 해제 실패
    • 기존 certs 폴더에 instance.crt, instance.key 파일이 있어서 덮어쓰지 못함.
    • -Force 옵션을 추가하면 기존 파일을 덮어쓸 수 있음.

✅ 해결 방법

아래 순서대로 진행하세요.


1️⃣ 기존 certs 폴더 삭제 후 새로 생성

Remove-Item -Recurse -Force certs
mkdir certs
  • 기존 인증서 삭제 후 새로운 인증서를 만들기 위한 폴더 생성.

2️⃣ CA 인증서 생성

docker run --rm -v ${PWD}/certs:/usr/share/elasticsearch/config/certs `
  -it docker.elastic.co/elasticsearch/elasticsearch:8.17.2 `
  bin/elasticsearch-certutil ca --pem -out /usr/share/elasticsearch/config/certs/ca.zip

certs/ca.zip 파일이 생성됨.


3️⃣ CA 인증서 압축 해제

Expand-Archive -Path certs\ca.zip -DestinationPath certs -Force

certs/ca/ca.crt, certs/ca/ca.key 파일이 생성됨.


4️⃣ Elasticsearch 인증서 생성

docker run --rm -v ${PWD}/certs:/usr/share/elasticsearch/config/certs `
  -it docker.elastic.co/elasticsearch/elasticsearch:8.17.2 `
  bin/elasticsearch-certutil cert --pem --ca-cert /usr/share/elasticsearch/config/certs/ca/ca.crt `
  --ca-key /usr/share/elasticsearch/config/certs/ca/ca.key `
  -out /usr/share/elasticsearch/config/certs/elasticsearch.zip

certs/elasticsearch.zip 파일이 생성됨.


5️⃣ Elasticsearch 인증서 압축 해제

Expand-Archive -Path certs\elasticsearch.zip -DestinationPath certs -Force

certs/elasticsearch/elasticsearch.crt, certs/elasticsearch/elasticsearch.key 파일이 생성됨.


6️⃣ .p12 인증서 변환

openssl pkcs12 -export -out certs/elasticsearch.p12 -inkey certs/elasticsearch/elasticsearch.key `
  -in certs/elasticsearch/elasticsearch.crt -passout pass:your-keystore-password

certs/elasticsearch.p12 파일이 생성됨.


7️⃣ docker-compose.yml 수정

version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.17.2
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true  # ✅ 보안 활성화
      - ELASTIC_PASSWORD=your-secure-password
      - xpack.security.http.ssl.enabled=true  # ✅ SSL 활성화
      - xpack.security.http.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elasticsearch.p12
      - xpack.security.http.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elasticsearch.p12
      - xpack.security.http.ssl.keystore.password=your-keystore-password
      - xpack.security.http.ssl.truststore.password=your-keystore-password
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - elastic-net
    volumes:
      - ${PWD}/certs:/usr/share/elasticsearch/config/certs  # ✅ 인증서 파일 연결

volumes:
  elasticsearch-data:
    driver: local

networks:
  elastic-net:
    driver: bridge

8️⃣ application.yml 수정

spring:
  elasticsearch:
    uris: https://localhost:9200
    username: elastic
    password: your-secure-password
    restclient:
      ssl:
        enabled: true
        trust-store: classpath:certs/elasticsearch.p12
        trust-store-password: your-keystore-password

9️⃣ Docker 컨테이너 다시 실행

docker-compose down
docker-compose up -d

🔟 Elasticsearch SSL 연결 확인

curl -X GET "https://localhost:9200" --user "elastic:your-secure-password" --insecure

JSON 응답이 나오면 SSL이 정상적으로 적용된 것! 🚀


🎯 최종 정리

  1. 기존 인증서 삭제 후 새로 생성
  2. CA 인증서 생성
  3. Elasticsearch 인증서 생성 (elasticsearch.zip)
  4. .p12 변환
  5. Docker에서 SSL 설정
  6. Spring Boot에서 https://localhost:9200로 연결
  7. Docker 컨테이너 다시 실행
  8. curl로 연결 확인

이제 Elasticsearch의 SSL이 Docker에서 설정되었습니다! 🚀
문제가 발생하면 docker logs elasticsearch 로그를 확인하고 알려주세요!

+ Recent posts