Saltar a contenido

Comprobar los certificados del clúster de PostgreSQL

Durante la instalación, durante una renovación, o simplemente para conocer la fecha de caducidad de los certificados del clúster de PostgreSQL, puede ser útil examinar el contenido de los certificados generados.

Los certificados que utiliza el clúster de PostgreSQL son los siguientes:

 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 de la autoridad de certificación raíz. El mismo certificado está presente en los directorios /etc/patroni/ y /etc/etcd/.

client.crt

Certificado del nodo PostgreSQL. El mismo certificado está presente en los directorios /etc/patroni/ y /etc/etcd/. Lo utilizan patroni y etcd para las comunicaciones cliente entre los nodos.

client.key

Clave asociada al certificado client.crt.

peer.crt

El mismo certificado que client.crt. Se utiliza para las comunicaciones internas de etcd entre los nodos.

peer.key

La misma clave que client.key.

Hay, por tanto, tres elementos en total:

  • el certificado de la autoridad de certificación raíz (/etc/etcd/ca.crt, /etc/patroni/ca.crt);
  • el certificado del nodo PostgreSQL (/etc/etcd/client.crt, /etc/etcd/peer.crt, /etc/patroni/client.crt);
  • la clave asociada al certificado del nodo PostgreSQL (/etc/etcd/client.key, /etc/etcd/peer.key, /etc/patroni/client.key).

Comprobar la fecha de caducidad de un certificado

Para comprobar la fecha de caducidad de un certificado, utilice el comando que figura a continuación.

Puede personalizar la variable del siguiente comando:

Valor personalizado Variable Comentario
EXPIRY_CERT Ruta del certificado cuya fecha de caducidad se desea comprobar.

O rellene el campo con uno de los certificados del clúster:

1
openssl x509 -in EXPIRY_CERT -noout -enddate

Si la fecha de caducidad ha pasado, el certificado se considera no válido.

Atención

Si la autoridad de certificación que emitió el certificado ha caducado, el certificado también se considera no válido. Compruebe, por tanto, también la fecha de caducidad de la autoridad de certificación.

Ejemplo

Para comprobar la fecha de caducidad del certificado /etc/patroni/client.crt, se utiliza el siguiente comando:

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

El resultado es similar a este:

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

Aquí, el certificado caduca el 18 de diciembre de 2030 a las 14:04:09.

Comprobar los nombres alternativos (SAN) de un certificado

Para comprobar los SAN (Subject Alternative Name) de un certificado, es decir, los nombres y direcciones IP para los que es válido, utilice el comando que figura a continuación.

Puede personalizar la variable del siguiente comando:

Valor personalizado Variable Comentario
SAN_CERT Ruta del certificado cuyos SAN se desea comprobar.

O rellene el campo con uno de los certificados del nodo:

1
openssl x509 -in SAN_CERT -noout -ext subjectAltName

Si el nombre DNS o la dirección IP utilizados para conectarse a un nodo no figuran en los SAN de su certificado, la conexión se considera no válida. Del mismo modo, cuando un nodo abre una conexión hacia otro nodo, si el certificado que presenta no corresponde a su propio nombre DNS o a su propia dirección IP, el nodo remoto rechaza la conexión.

Ejemplo

Para comprobar los SAN del certificado /etc/etcd/peer.crt, se utiliza el siguiente comando:

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

El comando devuelve un resultado similar 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

Aquí, el certificado cubre los nombres DNS PSQL_VIP y PSQL_2, así como las direcciones IP 192.168.1.4 y 192.168.1.2.

Comprobar qué autoridad de certificación emitió un certificado

Cuando se genera un certificado, es posible añadirle la extensión X509v3 Authority Key Identifier. Esta extensión puede almacenar el hash de la clave pública de su emisor, que corresponde al contenido de la extensión X509v3 Subject Key Identifier del emisor.

Info

Los certificados generados siguiendo la documentación de instalación del clúster de PostgreSQL tienen las extensiones Authority Key Identifier y Subject Key Identifier.

Si estas extensiones están presentes, se puede obtener el hash de la clave pública del emisor de un certificado y compararlo con el hash contenido en la extensión Subject Key Identifier de la CA que supuestamente emitió el certificado, para validar que se trata de la correcta.

Para obtener el valor de la extensión Authority Key Identifier de un certificado, utilice el comando que figura a continuación.

Puede personalizar la variable del siguiente comando:

Valor personalizado Variable Comentario
ISSUED_CERT Ruta del certificado cuyo emisor se desea comprobar.

O rellene el campo con uno de los certificados del nodo:

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

Info

La opción -issuer permite obtener el CN del certificado emisor.

Para obtener el valor de la extensión Subject Key Identifier de un certificado, utilice el comando que figura a continuación.

Puede personalizar la variable del siguiente comando:

Valor personalizado Variable Comentario
ISSUER_CA Ruta del certificado de la autoridad de certificación que supuestamente lo emitió.

O rellene el campo con uno de los certificados de la autoridad de certificación:

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

Info

La opción -subject permite obtener el CN del certificado.

Ejemplo

Se desea comprobar que la CA que firmó el certificado contenido en el fichero /etc/patroni/client.crt es la contenida en el fichero /etc/patroni/ca.crt.
Primero se obtiene el contenido de la extensión X509v3 Authority Key Identifier del certificado /etc/patroni/client.crt con el siguiente comando:

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

Lo que devuelve:

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

Después se obtiene el contenido de la extensión X509v3 Subject Key Identifier de la CA /etc/patroni/ca.crt con el siguiente comando:

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

Lo que devuelve:

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

Al comparar los dos resultados, se observa que el Key Identifier y el CN son idénticos: el certificado contenido en el fichero /etc/patroni/ca.crt es efectivamente la CA que firmó el certificado contenido en el fichero /etc/patroni/client.crt.