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

oscar Escrito por oscar 20 July 2023 2911 0

Antes de empezar

A continuación esta los post donde se explica como instalar OpenSSH

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
ssh-keygen

Resultado

oscar@codigoelectronica:~$ ls -a .ssh/
.  ..  id_rsa  id_rsa.pub

Especificar el tipo de clave Permite seleccionar el tipo de clave a generar [rsa|dsa|ecdsa|ed25519]. Por defecto, se usa RSA.
ssh-keygen -t 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.

ssh-keygen -f filename

Resultado

oscar@codigoelectronica:~$ ls
filename  filename.pub

Establecer la longitud de la clave Permite especificar la longitud de la clave en bits (por ejemplo, 2048 bits).
ssh-keygen -b bits
Generar clave sin contraseña (sin frase de contraseña) Permite generar una clave sin una frase de contraseña.
ssh-keygen -P ""
Cambiar la frase de contraseña de una clave Permite cambiar la frase de contraseña de una clave existente.
ssh-keygen -p
Mostrar la huella digital (fingerprint) de una clave Muestra la huella digital (fingerprint) de una clave pública.
ssh-keygen -l -f filename

Resultado

oscar@codigoelectronica:~$ ssh-keygen -l -f filename
3072 SHA256:FjHsh54jO7y0E4YX23Mjt9Zppsv365U42KNbn/RPJRg oscar@codigoelectronica (RSA) 

Generar una clave en un formato específico Permite elegir el formato de la clave generada (PEM o PKCS8).
ssh-keygen -m [PEM|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).
ssh-keygen -i -f input_key -e
Exportar clave pública a un archivo Permite exportar una clave pública en formato PEM.
ssh-keygen -f id_rsa.pub -e > public_key.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.
ssh-keygen -l -f filename
Generar una clave en formato PKCS#8 Permite generar una clave privada en formato PKCS#8.
ssh-keygen -e -f id_rsa.pub -m PKCS8 > private_key.pk8
Mostrar la versión de ssh-keygen Muestra la versión de ssh-keygen.
ssh-keygen -v

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.

Putty key generator
Putty key generator

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.

Generar keys
Generar keys

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.

Keys generadas
Keys generadas

Por último, copiamos las llave publica, esta es la que se encontrará en el servidor, para ello la dejamos lista para ser colocada.

Copiar public key
Copiar public key

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:

Ubicación de las claves públicas y privadas

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 .
Copia de keys de remoto a local

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".

Permisos en id_rsa, quitar otros usuarios

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.

Permisos en id_rsa, agreagr usuario

Con estos pasos ya agregamos el usuario de inicio de sesion a la seguridad del la key id_rsa.

Permisos en propiedades de 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

 


Comentario

Debe aceptar antes de enviar