La autenticación por clave pública nos permite loguearnos a un host sin necesidad de ingresar usuario y contraseña.
CMDR Shane
## Descripción del método
### Nociones fundamentales
- El esquema se basa en criptografía de clave pública.
- Usamos claves separadas para cifrar y descifrar.
- Es imposible obtener la clave para descifrar a partir de la clave para cifrar
- Solamente el cliente sabe la clave privada.
### Funcionamiento
- Desde el lado del cliente ssh creamos un par de claves (una pública y otra privada).
- Cada clave se guarda en archivo separado.
- Tenemos la opción en este momento de cifrar su clave privada mediante una frase de paso. La clave privada queda inutilizable si olvidamos esa contraseña.
- Desde el lado cliente copiamos la clave pública agregándola al archivo `~/.ssh/authorized_keys` en su directorio de la máquina remota.
- Luego de esto, el usuario puede loguearse sin proporcionar la contraseña.
- Cuando nos logueamos, el programa `ssh` le dice al servidor que par de claves le gustaría usar para autenticar. El cliente verifica que tiene acceso a la clave privada y el servidor verifica que la clave correspondiente está autorizada para aceptar la cuenta.
- El servidor puede informarle al cliente los errores que impidan que la autenticación por clave pública se pueda usar exitósamente luego de que la autenticación se complete usando un método diferente.
- De manera predeterminada si falla el método por clave pública se usará otro método, como por ejemplo el de usuario y password.
Nota:*La manera más conveniente de usar una clave pública es con un agente de autenticación que se encargue de guardar en memora las claves privadas descifradas y de esta manera evitar tener que ingresar una y otra vez la frase de paso correspondiente.*
## Archivos involucrados del cliente
|Archivo|Descripción|
|--------|----------|
|**/usr/bin/ssh** |cliente ssh|
|**/usr/bin/ssh-keygen**|Generador de par de claves (una pública y otra privada). Con la opción -t se puede especificar el algoritmo|
|**~/.ssh/known_hosts**|claves públicas de los hosts a los que ya accedimos alguna vez|
|**~/.ssh/id_rsa**| (nombre predeterminado con algoritmo RSA)|
|**~/.ssh/id_ecdsa**|nombre predeterminado con algoritmo ECDSA|
|**~/.ssh/id_ed2551**|nombre predeterminado con algoritmo ED25519|
## Archivos involucrados del servidor
|Archivo|Descripción|
|--------|-----------|
|**/usr/sbin/sshd**|servidor ssh|
|**~/.ssh/authorized_keys**|Clave públicas de clientes autorizados|
## Formato de `~/.ssh/authorized_keys`
El siguiente es un ejemplo de un archivo que contiene solamente dos claves pública:
```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCb96oGSIMquG5UGR6aFXtX6aHboMDS3Pkr8NOuLskabSnSzgUC8IGYvxn86W0xvcWGdVD+Qljl6h16ARFXGpCNWSxktl7TWMnbDn i5AZaJXETV1ZkB5ro5f33gEvaMcZel18X1FcE1RBEJG92ufOoIIastxYo+THU8TW0bwVG08/hHcPn+d9YYEwZ92b/sTQH3rtcvLrAtsSmI8flVc0M054Tmkhf15fXuVlPeYwqYhCWBT1JGg60Jn3ZrsQvD6di0KRBuw0icfeF1mdHnHSlrb7AhcNFs+kds1acWaE3cOINuKJmDHPmsyT6+wujnOx+3TCGVhGC8hm/8dizkALwks/1Zt5T1R8o/erOu8NFfzG3NvOB9dx9szbAHOxKiJ61FH6qOIUGj74xMNNGmCszz57g3JG8gfFe+zc7tlrvXgBIj1ZyY16JC6LkbYjUb5aXJQRLIPSe8XoAJU+UkxTjuXU7lCGnMPH0DjvvgLgpZYlWtL8zGqdu+ruMOE0S2N8= root@dublin.ireland.home
command="yum check-update" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCb96oGSIMquG5UGR6aFXtX6aHboMDS3Pkr8NOuLskabSnSzgUC8IGYvxn86W0xvcWGdVD+Qljl6h16ARFXGpCNWSxktl7TWMnbDnCi5AZaJXETV1ZkB5ro5f33gEvaMcZel18X1FcE1RBEJG92ufOoIIastxYo+THU8TW0bwVG08/hHcPn+d9YYEwZ92b/sTQH3rtcvLrAtsSmI8flVc0M054Tmkhf15fXuVlPeYwqYhCWBT1JGg60Jn3ZrsQvD6di0KRBuw0icfeF1mdHnHSlrb7AhcNFs+kds1acWaE3cOINuKJmDHPmsyT6+wujnOx+3TCGVhGC8hm/8dizkALwks/1Zt5T1R8o/erOu8NFfzG3NvOB9dx9szbAHOxKiJ61FH6qOIUGj74xMNNGmCszz57g3JG8gfFe+zc7tlrvXgBIj1ZyY16JC6LkbYjUb5aXJQRLIPSe8XoAJU+UkxTjuXU7lCGnMPH0DjvvgLgpZYlWtL8zGqdu+ruMOE0S2N8= root@belfast.ireland.home
```
- `ssh-rsa` es el tipo de clave
- `AAAAB3NzaC1yc2EAAAADAQABAAAegQCb96oGSIMquG5UGR6aFXtX6aHboMDS3Pkr8NOuLskabSnSzgUC8IGYvxn86W0xvcWGdVD+Qljl6h16ARFXGpCNWSxktl7TWMnbDnCi5AZaJXETV1ZkB5ro5f33gEvaMcZel18X1FcE1RBEJG92ufOoIIastxYo+THU8TW0bwVG08/hHcPn+d9YYEwZ92b/sTQH3rtcvLrAtsSmI8flVc0M054Tmkhf15fXuVlPeYwqYhCWBT1JGg60Jn3ZrsQvD6di0KRBuw0icfeF1mdHnHSlrb7AhcNFs+kds1acWaE3cOINuKJmDHPmsyT6+wujnOx+3TCGVhGC8hm/8dizkALwks/1Zt5T1R8o/erOu8NFfzG3NvOB9dx9szbAHOxKiJ61FH6qOIUGj74xMNNGmCszz57g3JG8gfFe+zc7tlrvXgBIj1ZyY16JC6LkbYjUb5aXJQRLIPSe8XoAJU+UkxTjuXU7lCGnMPH0DjvvgLgpZYlWtL8zGqdu+ruMOE0S2N8=` es la clave pública codificada en base64
- `root@dublin.ireland.home` es un comentario opcional
- `command=yum check-update` en la segunda línea restringe el acceso permitiendo la ejecución de un único comando.
- El contenido de este archivo debería tener permisos 0600 y el directorio `~/.ssh` 0700.
## Fuentes y más recursos
- [OpenSSH: Manual Pages](https://www.openssh.com/manual.html)
- [ietf.org/rfc/rfc4252.txt](https://www.ietf.org/rfc/rfc4252.txt)
- [openssh.com/txt/draft-ietf-secsh-publickeyfile-02.txt](https://www.openssh.com/txt/draft-ietf-secsh-publickeyfile-02.txt)
- [ssh-keygen(1) - OpenBSD manual pages](https://man.openbsd.org/ssh-keygen)
- [draft-miller-ssh-agent-00 - SSH Agent Protocol](https://tools.ietf.org/html/draft-miller-ssh-agent-00)