Hasta ahora siempre he usado usuario y contraseña para autenticarme en el servidor SSH de la Raspberry Pi 4 de mi HomeLab.

Ahora ha llegado el momento de utilizar autenticación mediante clave pública/privada para facilitar el acceso (siempre es bueno guardar la contraseña en un gestor de contraseñas para no olvidarla por no usarla a partir de ahora).

Crear claves pública/privada

Para crear un par de claves pública/privada hay que ejecutar el comando ssh-keygen incluído con el cliente de SSH.

En este caso he ejecutado el comando desde mi ordenador personal con sistema operativo Windows para generar una clave ECDSA de 521 bits

ssh-keygen -t ecdsa -b 521 -C "%username%@%computername%"

Se puede elegir una frase como contraseña de la clave privada que se generará tal como se puede ver en el siguiente ejemplo:

Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\<user>/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\<user>/.ssh/id_ecdsa
Your public key has been saved in C:\Users\<user>/.ssh/id_ecdsa.pub
The key fingerprint is:
SHA256:d13b62Z4dXlYTSHG97sPnQBSgar5mNZy3tFuYg2s35o pi@raspberry
The key's randomart image is:
+---[ECDSA 521]---+
|          .ooo ..|
|         .. .....|
|        .. .  ..+|
|       .  . .. .*|
|      o S . ...++|
|     o   +..  o+*|
|      = ..o.  oo*|
|     = =.o=o ..* |
|    . +.oE+o  +.o|
+----[SHA256]-----+

Copiar clave pública al servidor

La forma más sencilla de hacerlo sería usar el comando ssh-copy-id pero la implementación de OpenSSH en Windows no lo incorpora tal como se muestra en el siguiente listado del directorio C:\Windows\System32\OpenSSH:

06/05/2022  15:15           320.512 scp.exe
06/05/2022  15:15           398.848 sftp.exe
06/05/2022  15:15         1.073.152 ssh.exe
06/05/2022  15:15           506.880 ssh-add.exe
06/05/2022  15:15           393.216 ssh-agent.exe
06/05/2022  15:15           720.896 ssh-keygen.exe
06/05/2022  15:15           572.416 ssh-keyscan.exe

El método manual para copiar la clave pública consiste en añadir el contenido del fichero id_ecdsa.pub al fichero ~/.ssh/authorized_keys del servidor.

type "%userprofile%\.ssh\id_ecdsa.pub"

En este ejemplo, se copia el siguiente texto que incluye el algoritmo utilizado, la clave pública y la identificación de la misma:

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAGV91+ldUiuM8pZRsC2W1OAjRv+Ttm1pabs2TF3Y75iVTukxytHO1QFH+nJ6T6/wNq80P87II95Y+mwpPi8b+Jt4AFujHmNKk4vHHDpCCRh/SPbLxPI8VqO9gFgq07P9KTIFvUiJPg65kgy5a9b4DaWmkb5baVBn701lCSqhy7gtHDXWg== username@computername

Después nos conectamos al servidor (todavía mediante usuario y contraseña), editamos el fichero authorized_keys y pegamos el texto anterior.

Una vez hecho ésto, se desconecta la sesión del servidor y, si todo va bien, deberíamos poder volver a conectarnos mediante un simple ssh pi@raspberry.

Linux raspberry 5.10.103-v8+ #1529 SMP PREEMPT Tue Mar 8 12:26:46 GMT 2022 aarch64

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 Jan 14 18:01:55 2023 from 10.10.1.2

A partir de aquí, se puede complicar todo lo que uno quiera. Solo hay que leer los artículos de referencia que se indican a continuación ;-)

Referencias