Ir para o conteúdo

Verificar os certificados do cluster PostgreSQL

Durante a instalação, durante uma renovação ou simplesmente para saber quando expiram os certificados do cluster PostgreSQL, pode ser útil examinar o conteúdo dos certificados gerados.

Os certificados utilizados pelo cluster PostgreSQL são os seguintes:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/etc/etcd/
├── ca.crt
├── client.crt
├── client.key
├── peer.crt
└── peer.key

/etc/patroni/
├── ca.crt
├── client.crt
└── client.key
ca.crt

Certificado da autoridade de certificação raiz. O mesmo certificado está presente nos diretórios /etc/patroni/ e /etc/etcd/.

client.crt

Certificado do nó PostgreSQL. O mesmo certificado está presente nos diretórios /etc/patroni/ e /etc/etcd/. É utilizado pelo patroni e pelo etcd para as comunicações cliente entre os nós.

client.key

Chave associada ao certificado client.crt.

peer.crt

O mesmo certificado que client.crt. É utilizado para as comunicações internas do etcd entre os nós.

peer.key

A mesma chave que client.key.

Há, portanto, três elementos no total:

  • o certificado da autoridade de certificação raiz (/etc/etcd/ca.crt, /etc/patroni/ca.crt);
  • o certificado do nó PostgreSQL (/etc/etcd/client.crt, /etc/etcd/peer.crt, /etc/patroni/client.crt);
  • a chave associada ao certificado do nó PostgreSQL (/etc/etcd/client.key, /etc/etcd/peer.key, /etc/patroni/client.key).

Verificar a data de expiração de um certificado

Para verificar a data de expiração de um certificado, utilize o comando abaixo.

Pode personalizar a variável do seguinte comando:

Valor personalizado Variável Comentário
EXPIRY_CERT Caminho do certificado cuja data de expiração pretende verificar.

Ou preencha o campo com um dos certificados do cluster:

1
openssl x509 -in EXPIRY_CERT -noout -enddate

Se a data de expiração tiver passado, o certificado é considerado inválido.

Atenção

Se a autoridade de certificação que emitiu o certificado tiver expirado, o certificado também é considerado inválido. Verifique, portanto, também a data de expiração da autoridade de certificação.

Exemplo

Para verificar a data de expiração do certificado /etc/patroni/client.crt, utiliza-se o seguinte comando:

1
openssl x509 -in /etc/patroni/client.crt -noout -enddate

O resultado é semelhante a este:

1
notAfter=Dec 18 14:04:09 2030 GMT

Aqui, o certificado expira a 18 de dezembro de 2030 às 14:04:09.

Verificar os nomes alternativos (Subject Alternative Names) de um certificado

Para verificar os SAN (Subject Alternative Names) de um certificado, ou seja, os nomes e endereços IP para os quais é válido, utilize o comando abaixo.

Pode personalizar a variável do seguinte comando:

Valor personalizado Variável Comentário
SAN_CERT Caminho do certificado cujos SAN pretende verificar.

Ou preencha o campo com um dos certificados do nó:

1
openssl x509 -in SAN_CERT -noout -ext subjectAltName

Se o nome DNS ou o endereço IP utilizado para se ligar a um nó não constar dos SAN do respetivo certificado, a ligação é considerada inválida. Do mesmo modo, quando um nó abre uma ligação a outro nó, se o certificado que apresenta não corresponder ao seu próprio nome DNS ou endereço IP, o nó remoto rejeita a ligação.

Exemplo

Para verificar os SAN do certificado /etc/etcd/peer.crt, utiliza-se o seguinte comando:

1
openssl x509 -in /etc/etcd/peer.crt -noout -ext subjectAltName

O comando devolve um resultado semelhante a este:

1
2
X509v3 Subject Alternative Name:
    DNS:PSQL_VIP, DNS:PSQL_2, IP Address:192.168.1.4, IP Address:192.168.1.2

Aqui, o certificado abrange os nomes DNS PSQL_VIP e PSQL_2, bem como os endereços IP 192.168.1.4 e 192.168.1.2.

Verificar que autoridade de certificação emitiu um certificado

Quando um certificado é gerado, pode ser-lhe adicionada a extensão X509v3 Authority Key Identifier. Esta extensão pode armazenar o hash da chave pública do seu emissor, que corresponde ao conteúdo da extensão X509v3 Subject Key Identifier do emissor.

Info

Os certificados gerados de acordo com a documentação de instalação do cluster PostgreSQL têm as extensões Authority Key Identifier e Subject Key Identifier.

Se estas extensões estiverem presentes, pode obter o hash da chave pública do emissor de um certificado e, em seguida, compará-lo com o hash contido na extensão Subject Key Identifier da CA que supostamente emitiu o certificado, para confirmar que se trata da correta.

Para obter o valor da extensão Authority Key Identifier de um certificado, utilize o comando abaixo.

Pode personalizar a variável do seguinte comando:

Valor personalizado Variável Comentário
ISSUED_CERT Caminho do certificado cujo emissor pretende verificar.

Ou preencha o campo com um dos certificados do nó:

1
openssl x509 -in ISSUED_CERT -noout -issuer -ext authorityKeyIdentifier

Info

A opção -issuer permite obter o CN do certificado emissor.

Para obter o valor da extensão Subject Key Identifier de um certificado, utilize o comando abaixo.

Pode personalizar a variável do seguinte comando:

Valor personalizado Variável Comentário
ISSUER_CA Caminho do certificado da autoridade de certificação presumivelmente emissora.

Ou preencha o campo com um dos certificados da autoridade de certificação:

1
openssl x509 -in ISSUER_CA -noout -subject -ext subjectKeyIdentifier

Info

A opção -subject permite obter o CN do certificado.

Exemplo

Pretende-se verificar que a CA que assinou o certificado contido no ficheiro /etc/patroni/client.crt é de facto a contida no ficheiro /etc/patroni/ca.crt.
Primeiro, obtém-se o conteúdo da extensão X509v3 Authority Key Identifier do certificado /etc/patroni/client.crt com o seguinte comando:

1
openssl x509 -in /etc/patroni/client.crt -noout -issuer -ext authorityKeyIdentifier

O que devolve:

1
2
3
issuer=CN = BDD-ROOT-CA
X509v3 Authority Key Identifier:
    38:B3:EC:CD:20:90:80:A4:B3:60:F8:E5:7B:98:92:3B:7D:26:06:2B

Em seguida, obtém-se o conteúdo da extensão X509v3 Subject Key Identifier da CA /etc/patroni/ca.crt com o seguinte comando:

1
openssl x509 -in /etc/patroni/ca.crt -noout -subject -ext subjectKeyIdentifier

O que devolve:

1
2
3
subject=CN = BDD-ROOT-CA
X509v3 Subject Key Identifier:
    38:B3:EC:CD:20:90:80:A4:B3:60:F8:E5:7B:98:92:3B:7D:26:06:2B

Comparando os dois resultados, verifica-se que o Key Identifier e o CN são idênticos: o certificado contido no ficheiro /etc/patroni/ca.crt é de facto a CA que assinou o certificado contido no ficheiro /etc/patroni/client.crt.