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 :
openssl dgst -sign ~/.ssh/id_rsa some-file
El otro está usando pkeyutl :
openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file
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:
openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file
y:
openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file
El problema aquí es $PUBLIC_KEY_FILE
. OpenSSL no puede leer el formato de clave pública de OpenSSH, por lo que no puede usarlo id_rsa.pub
. Tienes algunas opciones, ninguna ideal.
Si tiene una versión de OpenSSH de 5.6 o posterior, aparentemente puede hacer esto:
ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem
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:
openssl rsa -in ~/.ssh/id_rsa -pubout
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.