Yubikey vérification

Yubikey vérification

Notes

Utilitaire ykman

Check-up

Un check-up complet se fait avec quelques commandes, à lancer avec la clé branchée.

1
2
3
4
ykman list                 # clés détectées (modèle, série)
ykman info                 # firmware, numéro de série, applications activées (USB / NFC)
ykman config usb --list    # applications activées en USB
ykman config nfc --list    # applications activées en NFC (si la clé en a)

Puis, application par application, ce qui est réellement programmé :

1
2
3
4
5
6
7
ykman otp info                    # slots 1 et 2 : programmé ou vide
ykman fido info                   # PIN défini ou non, essais restants, passkeys
ykman fido credentials list       # passkeys résidentes (demande le PIN FIDO2)
ykman oath info                   # applet TOTP/HOTP : protégée par mot de passe ou non
ykman oath accounts list          # comptes TOTP enregistrés
ykman piv info                    # certificats et clés par slot PIV
ykman openpgp info                # état de l'applet OpenPGP

Comme vous gérez plusieurs clés, un script qui lance tout d’un coup pour la clé branchée :

1
2
3
4
5
6
#!/usr/bin/env bash
for cmd in "info" "otp info" "fido info" "oath info" "oath accounts list" "piv info" "openpgp info"; do
  echo "===== ykman $cmd ====="
  ykman $cmd 2>&1
  echo
done

Ce qu’il faut savoir pour interpréter les résultats :

  • ykman otp info indique seulement si un slot est « programmed » ou « empty ». Il ne dit pas s’il s’agit de Yubico OTP, de challenge-response HMAC ou d’un mot de passe statique, ni si la touche est exigée. Le seul moyen de le vérifier est de tester, avec ykman otp calculate 1 <défi> : une réponse prouve que c’est du challenge-response, et une pression demandée confirme le touch (c’est ce que fait votre script de vérification).
  • ykman oath accounts list peut demander un mot de passe si l’applet OATH est protégée. Pour afficher aussi les codes en cours, utilisez ykman oath accounts code.
  • ykman fido credentials list demande le PIN FIDO2 et liste les sites avec passkey résidente, sans rien révéler de secret.
  • PIV, OpenPGP et OATH passent par PC/SC : si une commande répond qu’elle ne peut pas se connecter à la clé, vérifiez que pcscd est actif (systemctl status pcscd).
  • Si ykman info montre une application désactivée alors que vous en avez besoin, ykman config usb --enable OTP (ou FIDO2, PIV…) la réactive.

Complément

ykman otp info ne répond que « programmed » ou « empty » : il ne dit pas à quoi sert un slot, et le secret ne peut de toute façon pas être relu. Il faut donc le déduire par de petits tests.

1. Tester le challenge-response (le cas qui vous intéresse)

1
2
ykman otp calculate 1 00112233
ykman otp calculate 2 00112233
  • Une réponse en hexadécimal : le slot est en challenge-response HMAC-SHA1. Une demande de pression indique l’option touch.
  • Une erreur du type « slot non configuré pour le challenge-response » : le slot est programmé pour autre chose.
  • Ce test ne modifie rien.

2. Reconnaître les autres usages en touchant la clé

Faites-le dans un éditeur de texte, jamais dans un champ de mot de passe ou un terminal root. Un appui bref déclenche le slot 1, un appui long (environ 2 à 3 secondes) le slot 2.

Ce que la clé tape Usage du slot
Rien du tout Challenge-response HMAC (ou slot vide)
44 caractères commençant par cccccc, vvvvvv, etc., dont les 12 premiers restent fixes et le reste change Yubico OTP (réglage d’usine du slot 1)
Une chaîne identique à chaque appui Mot de passe statique
6 ou 8 chiffres qui changent HOTP

Attention au HOTP : chaque appui incrémente le compteur, et plusieurs appuis dans le vide peuvent le désynchroniser par rapport au serveur. N’insistez pas si vous soupçonnez ce cas.

3. Cas particuliers

  • Un slot 1 « programmed » que vous n’avez jamais touché est presque toujours le Yubico OTP d’usine, enregistré auprès de YubiCloud. Si vous ne l’utilisez pas, on peut le supprimer.
  • Pour effacer un slot et le réutiliser : ykman otp delete 2. C’est irréversible, donc seulement si vous êtes sûr de l’usage.

Pour vos 4 clés, la méthode la plus rapide est donc ykman otp info pour l’état, puis ykman otp calculate sur chaque slot programmé pour repérer le challenge-response.

HMAC Challenge réponse

Plusieurs clés peuvent ouvrir la même base si elles contiennent le même secret HMAC

. Un retour d’utilisateur sur le forum Nitrokey confirme que cela fonctionne entre une Nitrokey 3 et une OnlyKey.

Secret HMAC aléatoire

Si vous aviez laissé l’outil de Yubico générer un secret aléatoire sans le noter, vous ne pourrez pas le copier sur une autre marque. Dans ce cas, deux solutions :

  • reprogrammer un secret que vous connaissez sur vos YubiKey (ce qui change la protection de la base, donc à faire avec une sauvegarde) ;
  • ou ajouter la nouvelle clé comme protection d’une autre base.

Secret HMAC sauvegardé

Voici le script ajusté pour le slot 1 avec touch pour la vérification des clés avec un secret HMAC sauvegardé

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env bash
# Usage : ./check-hmac.sh   (une seule clé branchée à la fois)
SLOT=1
CHALLENGE="00112233445566778899aabbccddeeff"   # même défi pour toutes les clés

read -rsp "Secret HMAC (40 caractères hexa) : " SECRET; echo

EXPECTED=$(printf '%s' "$CHALLENGE" | xxd -r -p \
  | openssl dgst -sha1 -mac HMAC -macopt hexkey:"$SECRET" | awk '{print $NF}')

echo "Clé détectée :"; ykman list
echo "Touchez la clé quand elle clignote..."
ACTUAL=$(ykman otp calculate "$SLOT" "$CHALLENGE" | tr -d '[:space:]' | tr 'A-F' 'a-f')

echo "Attendu : $EXPECTED"
echo "Obtenu  : $ACTUAL"

if [ "$EXPECTED" = "$ACTUAL" ]; then
  echo "OK : le secret correspond."
else
  echo "DIFFÉRENT : le secret ne correspond pas."
  read -rp "Reprogrammer le slot $SLOT (avec touch) ? [o/N] " R
  if [ "$R" = "o" ]; then
    ykman otp chalresp --touch --force "$SLOT" "$SECRET"
    echo "Slot reprogrammé. Relancez le script pour vérifier."
  fi
fi
unset SECRET

Quelques précisions pour cette configuration :

  • Pression à faire deux fois si reprogrammation : une fois pour le calcul de vérification, puis à nouveau lors du test après reprogrammation.
  • Le slot 1 est celui de Yubico OTP par défaut sur une clé neuve. Si une de vos clés l’utilise encore pour ça, la reprogrammation l’écrasera. Un ykman otp info avant de commencer vous montre l’état des deux slots.
  • Une clé qui répond « slot non configuré » n’a simplement pas de challenge-response sur le slot 1 : le script proposera de le programmer.
  • Une fois les 4 clés alignées, testez l’ouverture de la base avec chacune.

Autres fabricants compatibles challenge réponse

Nitrokey 3

  • KeePassXC 2.7.6 prend en charge la Nitrokey 3 pour le challenge-response. La modification a été fusionnée dans KeePassXC en juillet 2023. nitrokey
  • Le secret HMAC s’écrit avec l’outil nitropy (commande nk3 secrets add-challenge-response), sur l’un des deux slots disponibles. Il faut un firmware récent (1.5.0 minimum d’après Nitrokey).
  • Sous Linux, la clé passe par PC/SC : pcscd doit tourner et libccid doit être en version 1.5.0 ou plus.

OnlyKey

  • Depuis son firmware 2.1.0, son challenge-response est compatible YubiKey, et l’on peut utiliser les deux indifféremment si elles partagent la même clé HMAC.