{"id":1392,"date":"2026-08-27T12:34:17","date_gmt":"2026-08-27T18:34:17","guid":{"rendered":"https:\/\/folken-it.com\/?p=1392"},"modified":"2026-08-27T12:34:19","modified_gmt":"2026-08-27T18:34:19","slug":"comandos-linux-para-administrar-certificados-ssl-tls","status":"publish","type":"post","link":"https:\/\/folken-it.com\/?p=1392","title":{"rendered":"Comandos Linux para administrar certificados SSL\/TLS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Los certificados <strong>SSL\/TLS<\/strong> son una parte cr\u00edtica de pr\u00e1cticamente cualquier infraestructura moderna. Aplicaciones web, APIs, balanceadores, servidores de aplicaciones, proxies y plataformas middleware dependen de ellos para establecer comunicaciones seguras.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En ambientes productivos, un certificado vencido puede provocar desde errores de conexi\u00f3n hasta la ca\u00edda completa de una integraci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para un ingeniero de <strong>Production Support, Middleware o SysAdmin<\/strong>, saber diagnosticar problemas de certificados desde Linux es una habilidad fundamental.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n veremos algunos de los comandos que m\u00e1s utilizo para investigar y administrar certificados SSL\/TLS.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Importante:<\/strong> antes de reemplazar certificados, llaves privadas o keystores en producci\u00f3n, realiza un respaldo y sigue los procedimientos de Change Management de tu organizaci\u00f3n.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. Consultar el certificado presentado por un servidor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uno de los comandos m\u00e1s importantes es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client -connect servidor.example.com:443<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto establece una conexi\u00f3n TLS y muestra informaci\u00f3n sobre la negociaci\u00f3n y los certificados recibidos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para especificar SNI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Usar <code>-servername<\/code> es especialmente importante cuando varios sitios comparten la misma direcci\u00f3n IP.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. Consultar las fechas de un certificado remoto<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Durante troubleshooting normalmente queremos saber r\u00e1pidamente cu\u00e1ndo vence el certificado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com \\\n&lt;\/dev\/null 2&gt;\/dev\/null |\nopenssl x509 -noout -dates<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Obtendremos informaci\u00f3n similar a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>notBefore=Aug 15 00:00:00 2026 GMT\nnotAfter=Aug 15 23:59:59 2027 GMT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El campo m\u00e1s importante para revisar la expiraci\u00f3n es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>notAfter<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Revisar Subject, Issuer y fechas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una variante muy \u00fatil para soporte:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com \\\n&lt;\/dev\/null 2&gt;\/dev\/null |\nopenssl x509 -noout -subject -issuer -dates<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto nos permite identificar r\u00e1pidamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Subject:<\/strong> para qui\u00e9n fue emitido.<\/li>\n\n\n\n<li><strong>Issuer:<\/strong> qui\u00e9n lo emiti\u00f3.<\/li>\n\n\n\n<li><strong>notBefore:<\/strong> desde cu\u00e1ndo es v\u00e1lido.<\/li>\n\n\n\n<li><strong>notAfter:<\/strong> cu\u00e1ndo expira.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Mostrar toda la informaci\u00f3n del certificado<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para analizar un certificado almacenado localmente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 -in certificado.pem -text -noout<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed podemos revisar informaci\u00f3n como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Issuer<\/li>\n\n\n\n<li>Subject<\/li>\n\n\n\n<li>Serial Number<\/li>\n\n\n\n<li>Signature Algorithm<\/li>\n\n\n\n<li>Public Key<\/li>\n\n\n\n<li>Validity<\/li>\n\n\n\n<li>Extensions<\/li>\n\n\n\n<li>Subject Alternative Names<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Revisar los Subject Alternative Names (SAN)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Actualmente es fundamental comprobar los SAN del certificado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 \\\n-in certificado.pem \\\n-noout \\\n-ext subjectAltName<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos encontrar algo similar a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>X509v3 Subject Alternative Name:\n    DNS:api.example.com\n    DNS:www.example.com\n    DNS:server.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si el hostname utilizado por la aplicaci\u00f3n no aparece entre los nombres v\u00e1lidos del certificado, el cliente puede rechazar la conexi\u00f3n.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Consultar cu\u00e1ndo vence un certificado local<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 -in certificado.pem -noout -enddate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>notAfter=Aug 15 23:59:59 2027 GMT<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Comprobar autom\u00e1ticamente si est\u00e1 pr\u00f3ximo a vencer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>openssl<\/code> puede comprobar si el certificado seguir\u00e1 siendo v\u00e1lido despu\u00e9s de determinado n\u00famero de segundos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, comprobar los pr\u00f3ximos <strong>30 d\u00edas<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 \\\n-in certificado.pem \\\n-checkend 2592000 \\\n-noout<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>2592000<\/code> segundos equivalen aproximadamente a 30 d\u00edas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos utilizarlo en scripts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if openssl x509 -in certificado.pem -checkend 2592000 -noout\nthen\n    echo \"Certificado v\u00e1lido por m\u00e1s de 30 d\u00edas\"\nelse\n    echo \"WARNING: certificado pr\u00f3ximo a expirar\"\nfi<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este tipo de validaci\u00f3n es excelente para automatizar monitoreo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Verificar un certificado con <code>curl<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Para probar una URL HTTPS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -v https:\/\/servidor.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La opci\u00f3n <code>-v<\/code> permite observar informaci\u00f3n relacionada con:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>conexi\u00f3n TCP;<\/li>\n\n\n\n<li>negociaci\u00f3n TLS;<\/li>\n\n\n\n<li>certificado;<\/li>\n\n\n\n<li>hostname;<\/li>\n\n\n\n<li>respuesta HTTP.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para consultar solamente los headers:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -I https:\/\/servidor.example.com<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Probar utilizando una CA espec\u00edfica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando trabajamos con certificados internos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl \\\n--cacert ca-certificate.pem \\\nhttps:&#47;&#47;servidor.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto es particularmente \u00fatil cuando la organizaci\u00f3n utiliza una <strong>Certificate Authority privada<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Ignorar temporalmente la validaci\u00f3n del certificado<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Durante troubleshooting podemos encontrar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -k https:\/\/servidor.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --insecure https:\/\/servidor.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>No debe utilizarse como soluci\u00f3n permanente.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si una conexi\u00f3n solamente funciona con <code>-k<\/code>, normalmente tenemos que investigar la confianza del certificado, hostname, cadena de certificaci\u00f3n u otra causa relacionada con TLS.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. Descargar el certificado presentado por un servidor<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos obtener el certificado y almacenarlo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com \\\n&lt;\/dev\/null 2&gt;\/dev\/null |\nopenssl x509 -outform PEM &gt; servidor.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s podemos analizarlo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 -in servidor.pem -text -noout<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Obtener la cadena de certificados<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Para visualizar los certificados enviados por el servidor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com \\\n-showcerts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto resulta especialmente \u00fatil cuando investigamos errores como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>unable to get local issuer certificate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>unable to verify the first certificate<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Una causa frecuente es que el servidor no est\u00e9 proporcionando correctamente alg\u00fan certificado intermedio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Verificar una cadena de confianza<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Si tenemos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.pem\nintermediate.pem\nroot.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">podemos construir un bundle:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat intermediate.pem root.pem &gt; chain.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Y comprobar el certificado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl verify \\\n-CAfile chain.pem \\\nserver.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si todo est\u00e1 correcto veremos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.pem: OK<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Crear una llave privada<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, generar una llave RSA de 2048 bits:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl genrsa -out servidor.key 2048<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En entornos donde la pol\u00edtica de seguridad lo permita, tambi\u00e9n pueden utilizarse tama\u00f1os mayores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La llave privada debe protegerse cuidadosamente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod 600 servidor.key<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nunca deber\u00eda enviarse por correo, tickets, chats o repositorios de c\u00f3digo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Crear un CSR<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Para solicitar un nuevo certificado necesitamos normalmente un <strong>Certificate Signing Request (CSR)<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req \\\n-new \\\n-key servidor.key \\\n-out servidor.csr<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Durante el proceso se solicitar\u00e1n datos como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Country\nState\nLocality\nOrganization\nOrganizational Unit\nCommon Name<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El Common Name podr\u00eda ser:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>api.example.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En infraestructuras actuales tambi\u00e9n debemos asegurarnos de que los nombres requeridos est\u00e9n incluidos correctamente como <strong>Subject Alternative Names<\/strong> seg\u00fan el proceso de nuestra CA.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Revisar un CSR antes de enviarlo<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de enviar el CSR al equipo de certificados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req \\\n-in servidor.csr \\\n-text \\\n-noout<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n podemos revisar solamente el subject:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req \\\n-in servidor.csr \\\n-noout \\\n-subject<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto evita solicitar un certificado con informaci\u00f3n incorrecta.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Verificar que certificado y llave privada correspondan<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Este es uno de los problemas cl\u00e1sicos durante una renovaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos comparar la clave p\u00fablica derivada de ambos archivos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Certificado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 \\\n-in servidor.pem \\\n-pubkey -noout |\nopenssl pkey -pubin -outform DER |\nopenssl sha256<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Llave:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkey \\\n-in servidor.key \\\n-pubout -outform DER |\nopenssl sha256<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Los hashes deben ser iguales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si son diferentes, <strong>esa llave privada no corresponde al certificado<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. Convertir DER a PEM<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Algunas plataformas entregan certificados en formato DER.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 \\\n-inform DER \\\n-in certificado.cer \\\n-out certificado.pem<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Convertir PEM a DER<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl x509 \\\n-in certificado.pem \\\n-outform DER \\\n-out certificado.der<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Crear un archivo PKCS#12<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Para importar certificado y llave en determinados servidores de aplicaciones podemos necesitar <code>.p12<\/code> o <code>.pfx<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkcs12 \\\n-export \\\n-out servidor.p12 \\\n-inkey servidor.key \\\n-in servidor.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si necesitamos incluir certificados intermedios:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkcs12 \\\n-export \\\n-out servidor.p12 \\\n-inkey servidor.key \\\n-in servidor.pem \\\n-certfile intermediate.pem<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. Inspeccionar un PKCS#12<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkcs12 \\\n-in servidor.p12 \\\n-info \\\n-noout<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para mostrar certificados sin extraer las llaves:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl pkcs12 \\\n-in servidor.p12 \\\n-clcerts \\\n-nokeys<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. Administrar Java Keystores con <code>keytool<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">En ambientes Java, WebLogic, WebSphere, Tomcat y otras plataformas podemos encontrar Java Keystores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Listar su contenido:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>keytool -list \\\n-v \\\n-keystore keystore.jks<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Buscar un alias concreto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>keytool -list \\\n-v \\\n-keystore keystore.jks \\\n-alias servidor<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. Importar un certificado en un Java Keystore<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>keytool -importcert \\\n-alias servidor \\\n-file certificado.pem \\\n-keystore truststore.jks<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de aceptar la importaci\u00f3n debemos comprobar cuidadosamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Subject<\/li>\n\n\n\n<li>Issuer<\/li>\n\n\n\n<li>Serial Number<\/li>\n\n\n\n<li>Fingerprint<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Listar r\u00e1pidamente certificados de un keystore<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>keytool -list -keystore truststore.jks<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n podemos buscar informaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>keytool -list -v \\\n-keystore truststore.jks |\ngrep -Ei \"Alias|Owner|Issuer|Valid\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Muy \u00fatil cuando un truststore contiene decenas o cientos de certificados.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. Revisar protocolos TLS<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos probar versiones concretas de TLS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TLS 1.2:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com \\\n-tls1_2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">TLS 1.3:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect servidor.example.com:443 \\\n-servername servidor.example.com \\\n-tls1_3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto puede ayudar cuando una aplicaci\u00f3n antigua deja de conectarse despu\u00e9s de que un servidor deshabilita protocolos obsoletos.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Escenario real: una API dej\u00f3 de funcionar despu\u00e9s de renovar el certificado<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Supongamos que recibimos:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>&#8220;La aplicaci\u00f3n no puede conectarse al API despu\u00e9s del cambio de certificado.&#8221;<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de reiniciar servicios podemos investigar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Verificar conectividad<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>nc -vz api.example.com 443<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2. Revisar el certificado remoto<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect api.example.com:443 \\\n-servername api.example.com<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. Revisar fechas, issuer y subject<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect api.example.com:443 \\\n-servername api.example.com \\\n&lt;\/dev\/null 2&gt;\/dev\/null |\nopenssl x509 -noout -subject -issuer -dates<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4. Revisar la cadena<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl s_client \\\n-connect api.example.com:443 \\\n-servername api.example.com \\\n-showcerts<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">5. Probar desde el mismo servidor de aplicaci\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -v https:\/\/api.example.com<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">6. Revisar el truststore Java<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>keytool -list -v \\\n-keystore truststore.jks<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Con estas pruebas podemos comenzar a determinar si tenemos un problema de:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>certificado \u2192 cadena \u2192 truststore \u2192 hostname \u2192 protocolo TLS \u2192 conectividad \u2192 configuraci\u00f3n de la aplicaci\u00f3n.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">SSL\/TLS Cheat Sheet para Production Support<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>CERTIFICADO REMOTO\nopenssl s_client -connect host:443 -servername host\n\nFECHA DE EXPIRACI\u00d3N\nopenssl x509 -in cert.pem -noout -dates\n\nINFORMACI\u00d3N COMPLETA\nopenssl x509 -in cert.pem -text -noout\n\nSUBJECT \/ ISSUER\nopenssl x509 -in cert.pem -noout -subject -issuer\n\nSAN\nopenssl x509 -in cert.pem -noout -ext subjectAltName\n\nVALIDAR PR\u00d3XIMOS 30 D\u00cdAS\nopenssl x509 -in cert.pem -checkend 2592000 -noout\n\nCADENA\nopenssl s_client -connect host:443 -servername host -showcerts\n\nVALIDAR CERTIFICADO\nopenssl verify -CAfile chain.pem server.pem\n\nHTTPS\ncurl -v https:\/\/host\n\nCA ESPEC\u00cdFICA\ncurl --cacert ca.pem https:\/\/host\n\nCSR\nopenssl req -new -key server.key -out server.csr\n\nREVISAR CSR\nopenssl req -in server.csr -text -noout\n\nPKCS#12\nopenssl pkcs12 -export -out server.p12 \\\n-inkey server.key -in server.pem\n\nJAVA KEYSTORE\nkeytool -list -v -keystore keystore.jks\n\nTLS 1.2\nopenssl s_client -connect host:443 -tls1_2\n\nTLS 1.3\nopenssl s_client -connect host:443 -tls1_3<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Buenas pr\u00e1cticas en producci\u00f3n<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">La administraci\u00f3n de certificados no consiste \u00fanicamente en reemplazarlos antes de que expiren. En un entorno productivo debemos considerar todo el ciclo de vida:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Inventario \u2192 monitoreo \u2192 renovaci\u00f3n \u2192 respaldo \u2192 instalaci\u00f3n \u2192 validaci\u00f3n \u2192 rollback \u2192 documentaci\u00f3n.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nunca reemplaces directamente un keystore productivo sin contar con un respaldo y un procedimiento de rollback.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Protege las llaves privadas y limita sus permisos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Valida el certificado, SAN y cadena antes de realizar el cambio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de instalarlo, prueba la conexi\u00f3n desde el <strong>mismo servidor donde se ejecuta la aplicaci\u00f3n<\/strong>, no solamente desde tu laptop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y, sobre todo, <strong>automatiza el monitoreo de expiraci\u00f3n<\/strong>. Un certificado vencido es uno de los incidentes m\u00e1s f\u00e1ciles de prevenir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En Production Support, <code>openssl<\/code>, <code>curl<\/code> y <code>keytool<\/code> son herramientas esenciales para diagnosticar problemas SSL\/TLS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando una aplicaci\u00f3n reporta un error de conexi\u00f3n segura, evita asumir inmediatamente que <em>&#8220;el certificado est\u00e1 mal&#8221;<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Investiga sistem\u00e1ticamente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u00bfHay conectividad? \u2192 \u00bfQu\u00e9 certificado entrega el servidor? \u2192 \u00bfEst\u00e1 vigente? \u2192 \u00bfEl hostname coincide? \u2192 \u00bfLa cadena est\u00e1 completa? \u2192 \u00bfLa CA es confiable? \u2192 \u00bfEl truststore contiene la CA necesaria? \u2192 \u00bfCliente y servidor soportan protocolos compatibles?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dominar estos comandos puede convertir un incidente SSL\/TLS de varias horas en un diagn\u00f3stico de pocos minutos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los certificados SSL\/TLS son una parte cr\u00edtica de pr\u00e1cticamente cualquier infraestructura moderna. Aplicaciones web, APIs, balanceadores, servidores de aplicaciones, proxies y plataformas [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1393,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"comandos OpenSSL para certificados SSL","jetpack_seo_html_title":"25 comandos OpenSSL y Linux para administrar certificados SSL\/TLS","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,61,6],"tags":[],"class_list":["post-1392","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-production_support","category-seguridad"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/folken-it.com\/wp-content\/uploads\/2026\/08\/Certificados.png?fit=1024%2C1536&ssl=1","_links":{"self":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts\/1392","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1392"}],"version-history":[{"count":1,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts\/1392\/revisions"}],"predecessor-version":[{"id":1394,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/posts\/1392\/revisions\/1394"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=\/wp\/v2\/media\/1393"}],"wp:attachment":[{"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/folken-it.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}