본 포스팅은 2024년 07월 09일, Elasticsearch 8.14.2 버전 기준으로 작성되었습니다.
elasticsearch-certutil은 Elasticsearch에 내장된 인증서 발급용 command line입니다. CA, CERT, CSR, HTTP 4가지 모드를 제공하고 아래와 같습니다.
CA 모드 : 새로운 CA(certificate authority)을 생성합니다. 기본적으로 인증서와 개인키가 포함된 단일 PKCS#12 파일을 생성하고 --pem 파라미터를 지정하면 PEM형식의 인증서와 개인키를 zip파일로 제공합니다.
CERT 모드 : X.509 인증서와 개인키를 생성합니다. 각 인스턴스에 대해 IP주소 혹은 DNS 이름을 선택적으로 제공할 수 있으나 지정하지 않으면 Elastic Stack에서 호스트 이름 검증을 수행할 수 없어 verification_mode 보안 설정을 "certificate"로 설정해야할 수 있습니다. --self-signed 파라미터를 사용하면 self-signed 인증서까지 생성하면서 CA모드와 마찬가지로 PKCS#12 혹은 PEM형식으로 인증서와 개인키를 제공합니다.
CSR 모드 : 인증서 서명 요청을 생성하여 신뢰할 수 있는 인증 기관에 보낼 수 있습니다. 각 인스턴스의 CSR 및 개인키가 포함된 단일 zip파일을 생성하고 CSR은 표준 PEM 인코딩의 PKCS#10 형식으로, 개인키는 PEM 인코딩의 RSA 형식으로 제공됩니다.
HTTP 모드 : Elasticsearch의 HTTP(REST API) 인터페이스에서 사용할 인증서를 생성합니다. 선택에 따라 CA, CSR, 각 인스턴스에서 사용할 인증서와 개인키를 zip파일로 제공합니다.
외부에서 Elastic Stack을 접근할 때 HTTP 계층에서 통신이 이루어지는데 이 때 필요한 인증서는 HTTP 모드를 통해 생성합니다.
CA 생성
./bin/elasticsearch-certutil ca
각 인스턴스에서 인증서 생성
./bin/elasticsearch-certutil http
## 프롬프트
1. CSR 생성 : n
2. 기존 CA 사용 : y
3. CA 경로 입력 : elastic-stack-ca.p12의 절대경로 입력합니다.
4. CA 비밀번호 입력
5. 만료기간 입력(default는 90일)
6. 노드 마다 인증서를 생성할 것인지 선택 : 개별 생성된 인증서는 각각의 개인키가 생성됩니다.
7. 첫번째 노드의 노드명을 입력하는데 transport 계층용 인증서에서 사용한 노드명과 동일하게 설정합니다.
8. 해당 노드에 연결하는 모든 호스트명을 입력 : 이러한 호스트명들은 인증서의 SAN(Subject Alternative Name)에 DNS 이름으로 추가됩니다.
9. 클라이언트가 해당 노드에 연결하는 모든 IP를 입력
10. 기타 노드에서 위 작업을 반복 수행
## 결과
elasticsearch-ssl-http
└ elasticsearch
└ http.p12
└ kibana
└ elasticsearch-ca.pem
인증서 정보 추출&이동
## public certificate 파일 추출
openssl pkcs12 -in .\http.p12 -clcerts -nokeys -out client.crt
## private key 파일 추출
openssl pkcs12 -in .\http.p12 -nocerts -nodes -out client.key
## CA certificate 파일 추출
openssl pkcs12 -in .\http.p12 -cacerts -nokeys -chain -out http_ca.crt
## 파일 이동
cp ./elasticsearch-ssl-http/elasticsearch/http.p12 ./config/certs/http.p12
cp ./elasticsearch-ssl-http/kibana/elasticsearch-ca.pem ./config/certs/http_ca.crt
→ elasticsearch-ca.pem과 http.p12에서 추출한 CA certificate 파일은 동일함
Elasticsearch 실행 및 인증서 검증
## 실행
./bin/elasticsearch
브라우저에서 API 호출 테스트
Postman에서 인증서 등록 후 API 호출 테스트