Yo uso SSH (OpenSSH 5.5p1 en Linux, para ser precisos). Tengo una clave, en la que tengo una frase de contraseña. Lo uso para el inicio de sesión habitual en las cosas de las computadoras.
¿Puedo usarlo también para firmar archivos?
Según tengo entendido, una clave SSH es una clave RSA (o DSA), y durante el proceso de inicio de sesión SSH, se utiliza para firmar mensajes enviados al servidor. Entonces, en principio y en la práctica, se puede usar para firmar cosas; de hecho, ese es su único propósito.
Pero hasta donde puedo ver, no hay forma de usar la clave para firmar un archivo arbitrario (como lo haría con PGP, por ejemplo). Hay alguna manera de hacer esto?
ssh
digital-signature
Tom Anderson
fuente
fuente
Respuestas:
Es posible que no haya una manera de hacer esto solo con las herramientas de OpenSSH.
Pero se puede hacer con bastante facilidad con las herramientas OpenSSL. De hecho, hay al menos dos formas de hacerlo. En los ejemplos a continuación,
~/.ssh/id_rsa
es su clave privada.Una forma es usar dgst :
El otro está usando pkeyutl :
Ambos escriben una firma binaria en la salida estándar. dgst toma una
-hex
opción imprimirá una representación textual, con algunos detalles sobre la forma de la firma. pkeyutl toma una-hexdump
opción que es un poco menos útil. Ambos aceptarán las claves RSA y DSA. No tengo idea de cuál es el formato de la salida. Los dos comandos producen diferentes formatos. Tengo la impresión de que pkeyutl se considera más moderno que dgst .Para verificar esas firmas:
y:
El problema aquí es
$PUBLIC_KEY_FILE
. OpenSSL no puede leer el formato de clave pública de OpenSSH, por lo que no puede usarloid_rsa.pub
. Tienes algunas opciones, ninguna ideal.Si tiene una versión de OpenSSH de 5.6 o posterior, aparentemente puede hacer esto:
Que escribirá la clave pública en la salida estándar en formato PEM, que OpenSSL puede leer.
Si tiene la clave privada, y es una clave RSA, puede extraer la clave pública de ella (supongo que el archivo de clave privada codificada por PEM incluye una copia de la clave pública, ya que no es posible derivar la clave pública de la clave privada en sí), y use eso:
No sé si hay un equivalente DSA. Tenga en cuenta que este enfoque requiere cierta cooperación del propietario de la clave privada, que tendrá que extraer la clave pública y enviarla al posible verificador.
Por último, puede usar un programa Python escrito por un tipo llamado Lars para convertir la clave pública de OpenSSH a formato OpenSSL.
fuente
La respuesta de @ Tom me ayudó a comenzar, pero no funcionó de manera inmediata.
Estos comandos funcionarán con:
Usando pkeyutl
Usando dgst
La versión pkeyutl solo puede firmar archivos de pequeño tamaño. Mientras que dgst puede firmar archivos arbitrariamente grandes, porque toma un resumen antes de firmar el resultado.
fuente
Para verificar esas firmas : solución más fácil:
La forma más fácil de asegurarse de que un documento firmado sea el mismo, es volver a generar el archivo de firma digital y luego usar diff para verificar si los dos archivos de firma son iguales.
fuente