keytool 오류: java.io.IOException: 잘못된 키 저장소 형식

keytool 오류: java.io.IOException: 잘못된 키 저장소 형식

3노드 ELK 스택(Elasticsearch v7.17)이 있습니다. 다시 시작한 후 Kibana 웹 인터페이스는 "Kibana 서버가 아직 준비되지 않았습니다."라는 오류를 보고합니다.

SSL 인증서가 만료되어 다시 만들었습니다(ELK CA, 3개 노드 모두, Kibana 및 Logstash의 경우). 하지만 오류가 여전히 존재하며 /var/log/kibana/kibana.log오류가 보고됩니다.

{"type":"log","@timestamp":"2023-03-29T17:19:39+02:00","tags":["error","elasticsearch-service"],"pid":8271,"message":"Unable to retrieve version information from Elasticsearch nodes. security_exception: [security_exception] Reason: unable to authenticate user [kibana] for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]"}

이 명령은 /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive -v다음과 같은 출력을 생성합니다.

Running with configuration path: /etc/elasticsearch

Testing if bootstrap password is valid for http://10.0.0.1:9200/_security/_authenticate?pretty
{
  "username" : "elastic",
  "roles" : [
    "superuser"
  ],
  "full_name" : null,
  "email" : null,
  "metadata" : {
    "_reserved" : true
  },
  "enabled" : true,
  "authentication_realm" : {
    "name" : "reserved",
    "type" : "reserved"
  },
  "lookup_realm" : {
    "name" : "reserved",
    "type" : "reserved"
  },
  "authentication_type" : "realm"
}


Checking cluster health: http://10.0.0.1:9200/_cluster/health?pretty
{
  "error" : {
    "root_cause" : [
      {
        "type" : "master_not_discovered_exception",
        "reason" : null
      }
    ],
    "type" : "master_not_discovered_exception",
    "reason" : null
  },
  "status" : 503
}


Failed to determine the health of the cluster running at http://10.0.0.1:9200
Unexpected response code [503] from calling GET http://10.0.0.1:9200/_cluster/health?pretty
Cause: master_not_discovered_exception

Elasticsearch 로그는 다음과 같이 말합니다.

[2023-03-30T13:50:58,432][WARN ][o.e.d.PeerFinder         ] [node1] address [10.0.0.2:9300], node [null], requesting [false] connection failed: [][10.0.0.2:9300] general node connection failure: handshake failed because connection reset
[2023-03-30T13:50:58,432][WARN ][o.e.t.TcpTransport       ] [node1] exception caught on transport layer [Netty4TcpChannel{localAddress=/10.0.0.1:60126, remoteAddress=node2.example.org/10.0.0.2:9300, profile=default}], closing connection
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors

비밀번호가 변경되지 않았습니다. 새 SSL 인증서에 문제가 있는 것 같습니다. 그래서 다음 명령을 통해 새 키 저장소를 만들었습니다.

/usr/share/elasticsearch/bin/elasticsearch-keystore create

CA 인증서(및 다른 인증서)를 추가하려고 합니다.

keytool -importcert -trustcacerts -noprompt -keystore /etc/elasticsearch/elasticsearch.keystore -file /etc/elasticsearch/certs/ca.crt

그러나 다음과 같은 오류가 발생합니다.

keytool error: java.io.IOException: Invalid keystore format

CA 인증서를 PKCS12로 변환하고 ca.p12키 저장소가 내 구성에 PKCS12 유형으로 정의되어 있으므로 이 형식()으로 가져오려고 했지만 동일한 오류가 발생합니다.

뭐가 문제 야?

문서에서 발췌 /etc/elasticsearch/elasticsearch.yml:

xpack.security.transport.ssl.keystore.path: elasticsearch.keystore
xpack.security.transport.ssl.keystore.type: PKCS12
xpack.security.transport.ssl.truststore.path: elasticsearch.keystore
xpack.security.transport.ssl.truststore.type: PKCS12
xpack.security.transport.ssl.verification_mode: certificate

답변1

Elasticsearch 클러스터가 올바르게 설정되지 않아( master_not_discovered_exception) Kibana가 이를 사용할 수 없습니다. 따라서 Kibana는 시작을 완료할 수 없습니다.

Elasticsearch 로그 조각 표시( \명확성을 위해 여러 줄로 구분):

io.netty.handler.codec.DecoderException: \
javax.net.ssl.SSLHandshakeException: \
PKIX path validation failed: \ 
java.security.cert.CertPathValidatorException: \ 
Path does not chain with any of the trust anchors

따라서 소프트웨어는 현재 신뢰할 수 있는 루트 CA 인증서와 사용해야 하는 서버 인증서 사이의 인증서 경로를 찾을 수 없는 것 같습니다. 루트 CA와 서버 인증서 사이에 중간 CA 인증서가 누락되었나요?

keytool error: java.io.IOException: Invalid keystore format

keytool명령은 Java의 일반 키 저장소 파일(PKCS12 및 JKS 형식)에서 작동하지만 Elasticsearch는 임의의 Elasticsearch 설정 및 JSON 형식 인증 키 파일도 포함할 수 있는 자체 키 저장소 형식을 사용하는 것으로 보입니다. 다음을 위한 전용 도구가 있어야 합니다 elasticsearch-keystore.

https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-keystore.html

관련 정보