{"id":6026,"date":"2026-10-23T20:54:15","date_gmt":"2026-10-23T18:54:15","guid":{"rendered":"https:\/\/davidperezgar.com\/?p=6026"},"modified":"2026-10-23T20:54:16","modified_gmt":"2026-10-23T18:54:16","slug":"claves-ssh-publica-privada","status":"publish","type":"post","link":"https:\/\/davidperezgar.com\/es\/claves-ssh-publica-privada\/","title":{"rendered":"Claves SSH: por qu\u00e9 compartes la p\u00fablica y nunca la privada"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Si trabajas con WordPress, servidores o Git, usas claves SSH casi cada d\u00eda. Haces un <code>git push<\/code>, te conectas al VPS de un cliente o despliegas un plugin desde GitHub Actions, y todo funciona. Pero si alguien te preguntara <em>por qu\u00e9<\/em> funciona, y por qu\u00e9 hay dos claves en lugar de una, \u00bfsabr\u00edas explicarlo?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A ver, vamos a arreglarlo. En este post te cuento qu\u00e9 son las claves SSH, c\u00f3mo se produce realmente la autenticaci\u00f3n y qu\u00e9 h\u00e1bitos te ayudan a mantener a salvo tus servidores y repositorios.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es un par de claves SSH?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando ejecutas <code>ssh-keygen<\/code>, tu ordenador no crea una clave. Crea un <strong>par de claves<\/strong> ligadas matem\u00e1ticamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>La clave privada<\/strong> (por ejemplo <code>id_ed25519<\/code>). Se queda en tu m\u00e1quina. Es tu identidad.<\/li>\n\n\n\n<li><strong>La clave p\u00fablica<\/strong> (por ejemplo <code>id_ed25519.pub<\/code>). La puedes compartir con quien quieras, publicarla o pegarla en cien servidores.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esto se llama <em>criptograf\u00eda asim\u00e9trica<\/em>. La propiedad clave es sencilla: lo que firmas con la privada se puede verificar con la p\u00fablica, pero desde la p\u00fablica no se puede calcular la privada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La mejor analog\u00eda es un candado y su llave. La clave p\u00fablica es el candado abierto: puedes repartir copias a todo el mundo y cada uno lo instala donde quiera. La clave privada es la \u00fanica llave que lo abre, y nunca se la das a nadie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Un malentendido muy com\u00fan: no te conectas con la clave p\u00fablica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mucha gente dice \"uso mi clave p\u00fablica para conectarme\". Es normal, porque copias la p\u00fablica en GitHub o en el servidor. Pero los papeles son estos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La <strong>clave p\u00fablica<\/strong> se instala en el <strong>servidor<\/strong>. Le dice: \"esta persona tiene permiso para entrar\".<\/li>\n\n\n\n<li>La <strong>clave privada<\/strong> la usas <strong>t\u00fa<\/strong>, en tu ordenador, para demostrar que eres esa persona.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El servidor tiene el candado. T\u00fa tienes la \u00fanica llave que lo abre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo funciona la autenticaci\u00f3n SSH, paso a paso<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Imagina que ejecutas este comando:<\/p>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code>ssh david@mi-servidor.com<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Esto es lo que pasa por detr\u00e1s:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Tu cliente SSH le dice al servidor: \"Soy <code>david<\/code> y tengo esta clave p\u00fablica\".<\/li>\n\n\n\n<li>El servidor busca esa clave p\u00fablica en <code>~\/.ssh\/authorized_keys<\/code>. Si no est\u00e1, te deniega el acceso.<\/li>\n\n\n\n<li>Si est\u00e1, te env\u00eda un reto: un dato aleatorio que es \u00fanico para esta conexi\u00f3n.<\/li>\n\n\n\n<li>Tu cliente <strong>firma<\/strong> ese dato con tu clave privada y devuelve la firma.<\/li>\n\n\n\n<li>El servidor comprueba la firma con la clave p\u00fablica. Si coincide, entras.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00edjate en lo que nunca ocurre: tu clave privada no viaja por la red. Solo viaja una firma, y esa firma solo vale para esa sesi\u00f3n, as\u00ed que nadie puede grabarla y reutilizarla m\u00e1s tarde.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 dos claves son mejores que una contrase\u00f1a<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Con una contrase\u00f1a, el secreto tiene que compartirse: lo sabes t\u00fa y lo sabe el servidor (o al menos un hash). Si el servidor sufre una filtraci\u00f3n, o alguien intercepta tu login, el secreto queda expuesto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con un par de claves, el secreto vive en un \u00fanico sitio: tu ordenador. Los servidores solo guardan claves p\u00fablicas, que por s\u00ed solas no sirven para nada. Si un atacante roba todo el fichero <code>authorized_keys<\/code>, no consigue nada con lo que pueda hacerse pasar por ti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s escala mucho mejor. Si gestionas 30 servidores de clientes, no necesitas 30 contrase\u00f1as. Pones la misma clave p\u00fablica en todos. Y cuando alguien del equipo se va, borras su l\u00ednea de <code>authorized_keys<\/code> y listo, sin tener que rotar contrase\u00f1as.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El otro par de claves: la identidad del servidor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hay una segunda parte menos conocida. El servidor tambi\u00e9n tiene su propio par de claves. La primera vez que te conectas, ves algo as\u00ed:<\/p>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code>The authenticity of host 'mi-servidor.com (203.0.113.10)' can't be established.\nED25519 key fingerprint is SHA256:...\nAre you sure you want to continue connecting (yes\/no)?<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ese mensaje es el servidor mostr\u00e1ndote la huella de su clave p\u00fablica, para que compruebes que hablas con el servidor real y no con un impostor. Al aceptar, la clave se guarda en <code>~\/.ssh\/known_hosts<\/code>. La pr\u00f3xima vez, si la clave cambia, SSH te avisa con un mensaje bien claro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es decir, la autenticaci\u00f3n va en los dos sentidos: el servidor verifica qui\u00e9n eres t\u00fa con tu clave, y t\u00fa verificas qui\u00e9n es el servidor con la suya.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos del d\u00eda a d\u00eda<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>GitHub:<\/strong> pegas tu fichero <code>.pub<\/code> en <em>Settings \u2192 SSH and GPG keys<\/em>. Desde ese momento, cada <code>git push<\/code> se firma con tu clave privada.<\/li>\n\n\n\n<li><strong>Despliegues con GitHub Actions:<\/strong> creas un par de claves exclusivo para desplegar. La p\u00fablica va al servidor (o como deploy key en el repositorio) y la privada se guarda como secret cifrado. Si alg\u00fan d\u00eda se filtra, revocas solo esa.<\/li>\n\n\n\n<li><strong>Servidores de clientes:<\/strong> tu clave p\u00fablica est\u00e1 en el <code>authorized_keys<\/code> de cada servidor. Una identidad, muchos servidores y ninguna contrase\u00f1a compartida.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo generar un par de claves<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hoy el algoritmo recomendado es Ed25519. Es m\u00e1s r\u00e1pido y corto que el cl\u00e1sico RSA, y muy seguro:<\/p>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code>ssh-keygen -t ed25519 -C \"tu@email.com\"<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">SSH te preguntar\u00e1 d\u00f3nde guardarla (la ruta por defecto, <code>~\/.ssh\/id_ed25519<\/code>, est\u00e1 bien) y si quieres poner una passphrase. Despu\u00e9s puedes copiar la clave p\u00fablica a un servidor con:<\/p>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code>ssh-copy-id david@mi-servidor.com<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O mostrarla y pegarla donde la necesites, por ejemplo en GitHub:<\/p>\n\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><code>cat ~\/.ssh\/id_ed25519.pub<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Buenos h\u00e1bitos para proteger tus claves<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Usa una passphrase.<\/strong> Si te roban el port\u00e1til, el fichero de la clave privada no sirve por s\u00ed solo. Con <code>ssh-agent<\/code> o el llavero del sistema solo la escribes una vez por sesi\u00f3n.<\/li>\n\n\n\n<li><strong>No compartas nunca la clave privada.<\/strong> Ni por Slack, ni por email, ni en un repositorio Git, ni dentro de una imagen Docker. Si crees que se ha expuesto, genera un par nuevo y elimina la p\u00fablica antigua de todos los sitios.<\/li>\n\n\n\n<li><strong>Una clave por dispositivo.<\/strong> No copies la misma privada entre ordenadores. Si pierdes uno, revocas solo esa clave.<\/li>\n\n\n\n<li><strong>Claves exclusivas para automatizaciones.<\/strong> Los pipelines de CI\/CD deben tener sus propias claves, con los m\u00ednimos permisos necesarios.<\/li>\n\n\n\n<li><strong>Revisa <code>authorized_keys<\/code> de vez en cuando.<\/strong> Elimina las claves de personas o m\u00e1quinas que ya no necesitan acceso.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen r\u00e1pido<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un par de claves SSH es una clave p\u00fablica que puedes dar a cualquiera y una clave privada que guardas solo para ti. El servidor almacena la p\u00fablica, t\u00fa demuestras tu identidad firmando un reto con la privada, y el secreto nunca sale de tu ordenador. Por eso las claves SSH son m\u00e1s seguras que las contrase\u00f1as, m\u00e1s f\u00e1ciles de gestionar con muchos servidores y la forma est\u00e1ndar de trabajar con Git y con m\u00e1quinas remotas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La pr\u00f3xima vez que hagas un <code>git push<\/code>, sabr\u00e1s exactamente lo que ocurre por detr\u00e1s.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Usas claves SSH a diario, pero \u00bfsabes por qu\u00e9 una es p\u00fablica y la otra no debe salir nunca de tu ordenador? Te explico c\u00f3mo funcionan, paso a paso.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":6,"footnotes":""},"categories":[624],"tags":[],"class_list":["post-6026","post","type-post","status-publish","format-standard","hentry","category-web-development"],"_links":{"self":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts\/6026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/comments?post=6026"}],"version-history":[{"count":1,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts\/6026\/revisions"}],"predecessor-version":[{"id":6027,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/posts\/6026\/revisions\/6027"}],"wp:attachment":[{"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/media?parent=6026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/categories?post=6026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/davidperezgar.com\/es\/wp-json\/wp\/v2\/tags?post=6026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}