42 votes

Est-il possible de signer un fichier en utilisant une clé SSH?

Je utilise SSH (OpenSSH 5.5p1 sur Linux, pour être précis). J'ai une clé, sur laquelle j'ai un mot de passe. Je l'utilise pour me connecter aux ordinateurs habituellement.

Puis-je aussi l'utiliser pour signer des fichiers?

D'après ce que je comprends, une clé SSH est une clé RSA (ou DSA), et pendant le processus de connexion SSH, elle est utilisée pour signer les messages envoyés au serveur. Donc en principe et en pratique, elle peut être utilisée pour signer des choses – en effet, c'est son seul but.

Mais autant que je puisse voir, il n'y a aucun moyen d'utiliser la clé pour signer un fichier arbitraire (comme vous le feriez avec PGP, par exemple). Y a-t-il un moyen de le faire?

29voto

Apta Points 11

Il peut ne pas y avoir de moyen de le faire avec les seuls outils OpenSSH.

Mais cela peut être fait assez facilement avec les outils OpenSSL. En fait, il existe au moins deux façons de le faire. Dans les exemples ci-dessous, ~/.ssh/id_rsa est votre clé privée.

Une façon est d'utiliser dgst:

openssl dgst -sign ~/.ssh/id_rsa some-file

L'autre consiste à utiliser pkeyutl:

openssl pkeyutl -sign -inkey ~/.ssh/id_rsa -in some-file

Les deux écrivent une signature binaire sur la sortie standard. dgst prend une option -hex qui imprime une représentation textuelle, avec quelques détails sur la forme de la signature. pkeyutl prend une option -hexdump qui est un peu moins utile. Les deux fonctionnent avec les clés RSA et DSA. Je ne sais pas quel est le format de la sortie. Les deux commandes produisent des formats différents. J'ai l'impression que pkeyutl est considéré comme plus moderne que dgst.

Pour vérifier ces signatures:

openssl dgst -verify $PUBLIC_KEY_FILE -signature signature-file some-file

et :

openssl pkeyutl -verify -inkey $PUBLIC_KEY_FILE -sigfile signature-file -in some-file

Le problème ici est $PUBLIC_KEY_FILE. OpenSSL ne peut pas lire le format de clé publique d'OpenSSH, vous ne pouvez donc pas simplement utiliser id_rsa.pub. Vous avez quelques options, mais aucune n'est idéale.

Si vous avez une version d'OpenSSH de 5.6 ou ultérieure, vous pouvez apparemment faire ceci:

ssh-keygen -e -f ~/.ssh/id_rsa.pub -m pem

Cela écrira la clé publique sur la sortie standard au format PEM, que OpenSSL peut lire.

Si vous avez la clé privée, et qu'il s'agit d'une clé RSA, alors vous pouvez extraire la clé publique (je suppose que le fichier de clé privée codé en PEM inclut une copie de la clé publique, car il n'est pas possible de dériver la clé publique de la clé privée elle-même) et l'utiliser:

openssl rsa -in ~/.ssh/id_rsa -pubout

Je ne sais pas s'il existe un équivalent pour DSA. Notez que cette approche nécessite une certaine coopération de la part du propriétaire de la clé privée, qui devra extraire la clé publique et l'envoyer au vérificateur potentiel.

Enfin, vous pouvez utiliser un programme Python écrit par un certain Lars pour convertir la clé publique d'OpenSSH au format OpenSSL.

13voto

Daniel Cassidy Points 131

L'intervention de @Tom m'a aidé à commencer, mais n'a pas fonctionné directement.

Ces commandes fonctionneront avec:

  • OpenSSL 1.0.1 14 mar 2012
  • OpenSSH_5.9p1

Utilisation de pkeyutl

# openssl pkeyutl -sign -inkey ~/.ssh/id_sample -in $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl pkeyutl -verify -pubin -inkey pub -in $1 -sigfile $1.sig
Signature vérifiée avec succès

Utilisation de dgst

# openssl dgst -sign ~/.ssh/id_sample $1 > $1.sig
# ssh-keygen -e -f ~/.ssh/id_sample.pub -m PKCS8 > pub
# openssl dgst -verify pub -signature $1.sig $1
Vérifié OK

La version pkeyutl ne peut signer que des fichiers de petite taille. Alors que dgst peut signer des fichiers de taille arbitrairement grande, car il prend un résumé avant de signer le résultat.

-4voto

usefree Points 31

Pour vérifier ces signatures - solution plus facile :

Un moyen plus facile de s'assurer qu'un document signé est identique est de régénérer le fichier de signature numérique et ensuite d'utiliser diff pour vérifier si les deux fichiers de signature sont identiques.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X