SSH key: guía completa de las llaves públicas y privadas de SSH
Presentamos una guía completa de las llaves públicas y privadas de SSH, como generarlas, configurar y realizar una prueba para iniciar sesión
Antes de empezar
A continuación esta los post donde se explica como instalar OpenSSH
- Instalar OpenSSH en windows
- Instalar OpenSSH en ubuntu
- Configurar OpenSSH server para producción
Crear claves (keys) con comandos
Desde una terminal de comandos CMD o BASH podemos ejecutar el siguiente comando:
ssh-keygen
Parámetro | Descripción | Ejemplo |
---|---|---|
Generar un nuevo par de claves | Genera las claves con los parámetros por defecto que se mencionan en esta tabla |
Resultado oscar@codigoelectronica:~$ ls -a .ssh/ |
Especificar el tipo de clave | Permite seleccionar el tipo de clave a generar [rsa|dsa|ecdsa|ed25519]. Por defecto, se usa RSA. |
|
Especificar el nombre del archivo de clave |
Permite especificar un nombre personalizado para el archivo de clave generado. Estas llaves las crea en el directorio actual donde se ejecute el comando. |
Resultado oscar@codigoelectronica:~$ ls |
Establecer la longitud de la clave | Permite especificar la longitud de la clave en bits (por ejemplo, 2048 bits). |
|
Generar clave sin contraseña (sin frase de contraseña) | Permite generar una clave sin una frase de contraseña. |
|
Cambiar la frase de contraseña de una clave | Permite cambiar la frase de contraseña de una clave existente. |
|
Mostrar la huella digital (fingerprint) de una clave | Muestra la huella digital (fingerprint) de una clave pública. |
Resultado oscar@codigoelectronica:~$ ssh-keygen -l -f filename |
Generar una clave en un formato específico | Permite elegir el formato de la clave generada (PEM o PKCS8). |
|
Convertir una clave de un formato a otro | Permite convertir una clave de un formato a otro (por ejemplo, de formato OpenSSH a formato PEM). |
|
Exportar clave pública a un archivo | Permite exportar una clave pública en formato PEM. |
|
Mostrar información de una clave | Muestra información detallada de una clave pública o privada, como la longitud de la clave y el fingerprint. |
|
Generar una clave en formato PKCS#8 | Permite generar una clave privada en formato PKCS#8. |
|
Mostrar la versión de ssh-keygen | Muestra la versión de ssh-keygen. |
|
Crear las claves (keys) con putty
Para realizar la configuración de inicio de sesión de ssh con putty, debemos utilizar putty el cual va a hacer de cliente ssh y putty key generator el cual nos ayudara a crear las llaves privadas y publicas necesarias para el cifrado de inicio de sesión.
Generar key privada y key publica
Vamos a crear las llaves, para ello usaremos la herramienta putty key generator
para Windows, la cual nos ayuda con este paso de forma fácil; también hay que tener en cuenta que esto lo hacemos desde nuestro local y no directamente en el servidor final.
Iniciamos con putty key generator, cuando se abra la ventana, buscamos en la parte inferior el type of key to generator, y seleccionamos el tipo SSH2 RSA
, el cual es el tipo de incriptación y las llaves que vamos a generar.
Cuando damos en el botón de generar empezara a crear las llaves, así que nos pedirá desplazar el puntero del mouse en la parte blanca para generar aleatoriamente la llave.
Una vez que termine, ya están las llaves listas para ser guardadas en nuestro equipo, para ello hacemos click en save public key y save private key, te recomiendo que las guardes en tus documentos del equipo y les realices una copia por seguridad.
Por último, copiamos las llave publica, esta es la que se encontrará en el servidor, para ello la dejamos lista para ser colocada.
Directorio donde se general las claves públicas y privadas
Por defecto las claves se generan en los siguientes directorios:
- En Windows las claves se crean en el directorio `%userprofile%\.ssh\`, donde `%userprofile%` apunta al directorio de inicio del usuario actual: c:\Users\NombreUsuario
- El Linux las claves se crean en `~/.ssh/`, que equivale a la rura `/home/tu_usuario/.ssh/`
Ubicar correctamente las llaves generadas
Despues de crear las llaves en el servidor con la instrucción `ssh-keygen`, debemos organizar las claves como se muestra en la siguiente imagen, a continuación realizaremos los siguientes pasos:
1. Key privada: se debe guardar como `id_rsa` o `id_rsa.pem` en la maquina local dentro del directorio `~/.ssh/`.
Nota: Es importante mantener tu clave privada en un lugar seguro y protegido, ya que cualquier persona que tenga acceso a ella podría iniciar sesión en los servidores en los que hayas configurado la autenticación basada en claves SSH.
2. Ley pública: la clave publica se guarda en el servidor al cual se accede por SSH, tendrá la extensión `id_rsa.pub` y se guarda en `~/.ssh/`.
Copiar clave privada desde el servidor a maquina local
Nota: Esta opcion la usaremos si se ha generado las llaves en el servidor y queremos copiarlas a la maquina local.
Para copiar la clave privada generada en el servidor a tu máquina local utilizando SSH, puedes seguir estos pasos:
1. Abrir una terminal de comandos CMS o Bash.
2. Utilizar el siguiente comando `scp` (Secure Copy) para copiar el archivo, El siguiente comando muestra cómo hacerlo:
scp usuario@servidor:/ruta/a/la/clave/id_rsa /ruta/local/donde/copiar/
- usuario: Es el nombre de tu usuario en el servidor remoto.
- servidor: Es la dirección o el nombre del servidor remoto.
- /ruta/a/la/clave/id_rsa: Es la ubicación y el nombre completo del archivo de clave privada en el servidor remoto.
- /ruta/local/donde/copiar/: Es la ubicación local en tu máquina donde deseas copiar la clave privada.
Veamos un ejemplo
scp oscar@192.168.10.4:/home/oscar/.ssh/id_rsa .
Estamos copiando la clave id_rsa del directorio `/home/oscar/` al contexto `.` que es `c:\code\keys`
Copiar clave privada desde el la maquina local al servidor
Nota: Esta opción la usaremos si se ha generado las llaves en la maquina local y queremos copiarlas al servidor.
1. Desde tu máquina local, abre una terminal o el símbolo del sistema, dependiendo de tu sistema operativo.
2. Utiliza el comando scp (Secure Copy) para copiar el archivo de clave privada desde tu máquina local al servidor remoto. El siguiente comando muestra cómo hacerlo:
scp /ruta/local/de/la/clave/id_rsa usuario@servidor:/ruta/en/el/servidor/
- usuario: Es el nombre de tu usuario en el servidor remoto.
- servidor: Es la dirección o el nombre del servidor remoto.
- /ruta/local/de/la/clave/id_rsa: Es la ubicación y el nombre completo del archivo de clave privada en tu máquina local.
- /ruta/en/el/servidor/: Es la ubicación en el servidor donde deseas copiar la clave privada.
Veamos un ejemplo:
scp ~/Documents/id_rsa oscar@192.168.10.4:/home/oscar/.ssh/
Copiar la clave pública a authorized_keys
Con el comando ssh-copy-id, procedemos a copiar el contenido de la key pública en el archivo authorized_keys.
ssh-copy-id [usuario]@[dirección_ip_o_nombre_del_host]
Veamos un ejemplo:
ssh-copy-id codigoelectronica@raspberrypi
El resultado obtenido es:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/codigoelectronica/.ssh/id_rsa.pub"
The authenticity of host 'raspberrypi (127.0.1.1)' can't be established.
ECDSA key fingerprint is SHA256:p8KepWVpzJjTiTY9xah/F0p825s/Wb3ur4CTfEmLBMY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
codigoelectronica@raspberrypi's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'codigoelectronica@raspberrypi'"
and check to make sure that only the key(s) you wanted were added.
Si listamos el contenido de .ssh/, podemos ver que ha creado el archivo authorized_keys.
codigoelectronica@raspberrypi:~ $ ls .ssh/
authorized_keys id_rsa id_rsa.pub known_hosts
Configurar servidor ssh para login con keys
Por defecto, despues de instalar OpenSSH server, solo esta habilitada para iniciar sesión por usuario y contraseña, pero el inicio por key ssh esta desahabilitado, así que se debe realizar las siguiente configuración.
El archivo de configuración de SSH esta en /etc/ssh/sshd_config, procedemos a realizar los siguientes cambios:
sudo nano /etc/ssh/sshd_config
Donde buscamos los siguientes parametros y los habilitamos quitendo en #:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
Guardamos y reiniciamos el servicio de SSH
sudo /etc/init.d/ssh restart
Nota: tenemos el post Configurar OpenSSH server para producción para que realice una correcta configuracion de OpenSSH.
Iniciar sesión ssh con keys
Iniciar desde Windows
Nota: Si iniciamos sesion ssh con la key id_rsa desde Windows se nos presentara el siguiente error:
ssh -i id_rsa codigoelectronia@192.168.1.8
Resultado:
c:\code\keys>ssh -i id_rsa codigoelectronia@192.168.1.8
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "id_rsa": bad permissions
codigoelectronia@192.168.1.8's password:
Esto se debe a que el archivo de clave privada 'id_rsa' tiene permisos demasiado abiertos, lo que significa que puede ser accesible por otros usuarios del sistema. Para que el cliente SSH lo utilice correctamente, es necesario ajustar los permisos del archivo de key privada para que solo se acceda desde el usuario que ha iniciado sesión; esto lo resolvemos de la siguiente forma:
1. En el archivo id_rsa, damos click derecho e ingresamos a las propiedades.
2. En la ventana de propiedades buscamos la pestaña de seguridad, donde vemos los usuarios y grupos de este archivo, lo que vamos a hacer es quitarlos todos y solo dejar el usuario "ce" con el que estamos iniciando sesión.
3. Para eso, damos en opciones avanzadas donde se abrirá la ventana "configuración de seguridad avanzada para id_rsa", donde vamos a dar click en el boton "deshabilitar herencia".
4. En la nueva ventana damos en "quitar todos los permisos heredados de este objeto".
5. Volvemos a la ventana de propiedades, seguridad donde vamos a dar en el boton de editar.
6. En nombre de grupo o usuario, damos en agregar donde cargará la ventana de seleccionar usuarios o grupos.
7. En el campo de texto de esta ventana escribimos el nombre de usuario con que iniciamos sesión.
8. Damos en comprobar nombres para validar que ha quedado correctamente y procedemos a dar en aceptar.
Con estos pasos ya agregamos el usuario de inicio de sesion a la seguridad del la key id_rsa.
Damos en aceptar y volvemos a realizar la prueba de inicio se sesión con la id_rsa:
c:\code\keys>ssh codigoelectronica@192.168.1.8 -i id_rsa
Linux raspberrypi 6.1.21+ #1642 Mon Apr 3 17:19:14 BST 2023 armv6l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jul 22 17:55:57 2023 from 192.168.1.7
codigoelectronica@raspberrypi:~ $
Donde ya podemos iniciar sesion por ssh con las keys públicas y pribadas.
Iniciar desde linux
Para iniiar sesión con linux, ejecutamos el siguiente comando:
ssh -i id_rsa codigoelectronia@192.168.1.8
Puede que tambien nos de el error que se presento con el inicio de Windows, para resolver el problema ejecutamos el siguiente comando.
chmod 600 id_rsa