keytocard does not remove secret key as documented
Closed, ResolvedPublic

Description

Transfering a secret key to a hardware token did not work as documented.

Hardware tokens that are reported to not work:

  • Nitrokey Start
  • Nitrokey (Pro 2)

Move was done on the command line.
Thunderbird is also used.

  • gpg -K lists shows hint about smartard (as expected)

Symptoms:

  • No smardcard icon in Kleo (expected: icon is there)
  • secret key can still be exported (expected: cannot)

The documentation
https://www.gnupg.org/documentation/manuals/gnupg/OpenPGP-Key-Management.html#index-keyedit_003akeytocard says

The secret key in the keyring will be replaced by a stub if the key could be stored successfully on the card and you use the save command later.

Reported by a user with GnuPG 2.2.25 on Windows (via Gpg4win 3.1.14).
According to the user it worked in April/May, which would habe been Gpg4win 3.1.11 with GnuPG: 2.2.19. The bad behaviour was reproduced on two machines and once with each versions of the nitrokey token.

bernhard created this task.Thu, Jan 7, 9:54 AM
werner added a subscriber: werner.Thu, Jan 7, 10:04 AM

Please describe exactly what you did so that we can replicate this.

bernhard updated the task description. (Show Details)Thu, Jan 7, 10:52 AM
bernhard added a comment.EditedThu, Jan 7, 10:56 AM

The user reported to

On a windows 10 64bit system to have generated a new keypair and then used the command line and the keytocard command to transfer the private key on a security token. The command line output was like expected, nothing unusual compared to existing instructions or the memory of same operation in April/May.

Which other information or tests are useful to ask for?
I will ask for running this with "-v" and key properties.

werner added a comment.Thu, Jan 7, 1:20 PM

On Thu, 7 Jan 2021 09:56, bernhard (Bernhard Reiter) said:

Which other information or tests are useful to ask for?

The exact commands given and the output. Adding -v is always helpful.

Chris91 added a subscriber: Chris91.EditedThu, Jan 7, 6:03 PM

Hi, I'm the user that reported this bug.

According to the user it worked in April/May, which would habe been Gpg4win 3.1.11 with GnuPG: 2.2.19.

Let's say version 3.1.11 / 2.2.19 or older. I did my first experiences with a Nitrokey at this time, but used GnuPG already before.

Please describe exactly what you did so that we can replicate this.

Create a keypair on my Windows PC via cmd and put it on my Smartcard (Nitrokey Start & Nitrokey Pro). Please find below my entries:

C:\WINDOWS\system32>gpg --card-status
Reader ...........: Nitrokey Nitrokey Start 0
Application ID ...: D276000124010200FFFE431150350000
Application type .: OpenPGP
Version ..........: 2.0
Manufacturer .....: unmanaged S/N range
Serial number ....: 43115035
Name of cardholder: [nicht gesetzt]
Language prefs ...: [nicht gesetzt]
Salutation .......:
URL of public key : [nicht gesetzt]
Login data .......: [nicht gesetzt]
Signature PIN ....: zwingend
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 0
KDF setting ......: off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

C:\WINDOWS\system32>gpg --version
gpg (GnuPG) 2.2.25
libgcrypt 1.8.7
Copyright (C) 2020 g10 Code GmbH
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: C:/Users/XXX/AppData/Roaming/gnupg
Unterstützte Verfahren:
Öff. Schlüssel: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Verschlü.: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
          CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Komprimierung: nicht komprimiert, ZIP, ZLIB, BZIP2

C:\WINDOWS\system32>gpg --full-generate-key --expert
gpg (GnuPG) 2.2.25; Copyright (C) 2020 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (1) RSA und RSA (voreingestellt)
   (2) DSA und Elgamal
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
   (7) DSA (Nutzung selber einstellbar)
   (8) RSA (Nutzung selber einstellbar)
  (9) ECC und ECC
  (10) ECC (nur signieren)
  (11) ECC (Nutzung selber einstellbar)
   (13) Vorhandener Schlüssel
   (14) Vorhandener Schlüssel auf der Karte
Ihre Auswahl? 1
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie für den Unterschlüssel? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 2w
Key verfällt am 19.01.2021 14:40:05 Mitteleuropõische Zeit
Ist dies richtig? (j/N) j

GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen.

Ihr Name ("Vorname Nachname"): Test Test
Email-Adresse: test@test.com
Kommentar:
Sie haben diese User-ID gewählt:
    "Test Test <test@test.com>"

Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? F
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
gpg: Schlüssel 37778BBAD14A30B5 ist als ultimativ vertrauenswürdig gekennzeichnet
gpg: Verzeichnis `C:/Users/XXX/AppData/Roaming/gnupg/openpgp-revocs.d' erzeugt
gpg: Widerrufzertifikat wurde als 'C:/Users/XXX/AppData/Roaming/gnupg/openpgp-revocs.d\15BA47FBC84D072F9CA7952D37778BBAD14A30B5.rev' gespeichert.
Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa4096 2021-01-05 [SC] [verfällt: 2021-01-19]
      15BA47FBC84D072F9CA7952D37778BBAD14A30B5
uid                      Test Test <test@test.com>
sub   rsa4096 2021-01-05 [E] [verfällt: 2021-01-19]


C:\WINDOWS\system32>gpg --edit-key --expert test@test.com
gpg (GnuPG) 2.2.25; Copyright (C) 2020 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/37778BBAD14A30B5
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/C83FF1DED83ADB11
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: E
[ ultimativ ] (1). Test Test <test@test.com>

gpg> keytocard
Den Hauptschlüssel wirklich verschieben? (j/N) j
Wählen Sie den Speicherort für den Schlüssel:
   (1) Signatur-Schlüssel
   (3) Authentisierungs-Schlüssel
Ihre Auswahl? 1

sec  rsa4096/37778BBAD14A30B5
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/C83FF1DED83ADB11
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: E
[ ultimativ ] (1). Test Test <test@test.com>

gpg> key 1

sec  rsa4096/37778BBAD14A30B5
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/C83FF1DED83ADB11
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: E
[ ultimativ ] (1). Test Test <test@test.com>

gpg> keytocard
Wählen Sie den Speicherort für den Schlüssel:
   (2) Verschlüsselungs-Schlüssel
Ihre Auswahl? 2

sec  rsa4096/37778BBAD14A30B5
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/C83FF1DED83ADB11
     erzeugt: 2021-01-05  verfällt: 2021-01-19  Nutzung: E
[ ultimativ ] (1). Test Test <test@test.com>

gpg> quit
Änderungen speichern? (j/N) j

C:\WINDOWS\system32>gpg --list-secret-keys
C:/Users/XXX/AppData/Roaming/gnupg/pubring.kbx
-----------------------------------------------
sec>  rsa4096 2021-01-05 [SC] [verfällt: 2021-01-19]
      15BA47FBC84D072F9CA7952D37778BBAD14A30B5
      Kartenseriennr. = FFFE 43115035
uid        [ ultimativ ] Test Test <test@test.com>
ssb>  rsa4096 2021-01-05 [E] [verfällt: 2021-01-19]
st@test.com>
ssb>  rsa4096 2021-01-05 [E] [verfällt: 2021-01-19]

Chris91 added a comment.EditedThu, Jan 7, 6:04 PM

The exact commands given and the output. Adding -v is always helpful.

I tested it again today with "-v".

C:\Windows\system32>gpg --full-generate-key --expert
gpg (GnuPG) 2.2.25; Copyright (C) 2020 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (1) RSA und RSA (voreingestellt)
   (2) DSA und Elgamal
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
   (7) DSA (Nutzung selber einstellbar)
   (8) RSA (Nutzung selber einstellbar)
  (9) ECC und ECC
  (10) ECC (nur signieren)
  (11) ECC (Nutzung selber einstellbar)
   (13) Vorhandener Schlüssel
   (14) Vorhandener Schlüssel auf der Karte
Ihre Auswahl? 1
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie für den Unterschlüssel? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 2w
Key verfällt am 21.01.2021 14:07:32 Mitteleuropõische Zeit
Ist dies richtig? (j/N) j

GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen.

Ihr Name ("Vorname Nachname"): Test Test
Email-Adresse: test2@test2.com
Kommentar:
Sie haben diese User-ID gewählt:
    "Test Test <test2@test2.com>"

Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? F
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
gpg: Schlüssel C3DEBD3DBFECCEFA ist als ultimativ vertrauenswürdig gekennzeichnet
gpg: Widerrufzertifikat wurde als 'C:/Users/XXX/AppData/Roaming/gnupg/openpgp-revocs.d\34BFBC9207D36B33DFBB1314C3DEBD3DBFECCEFA.rev' gespeichert.
Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa4096 2021-01-07 [SC] [verfällt: 2021-01-21]
      34BFBC9207D36B33DFBB1314C3DEBD3DBFECCEFA
uid                      Test Test <test2@test2.com>
sub   rsa4096 2021-01-07 [E] [verfällt: 2021-01-21]


C:\Windows\system32>gpg --edit-key --expert test2@test2.com
gpg (GnuPG) 2.2.25; Copyright (C) 2020 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: "Trust-DB" wird überprüft
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: Tiefe: 0  gültig:   2  signiert:   0  Vertrauen: 0-, 0q, 0n, 0m, 0f, 2u
gpg: nächste "Trust-DB"-Pflichtüberprüfung am 2021-01-21
Geheimer Schlüssel ist vorhanden.

sec  rsa4096/C3DEBD3DBFECCEFA
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/F64513EB7ED0228B
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: E
[ ultimativ ] (1). Test Test <test2@test2.com>

gpg> keytocard -v
Den Hauptschlüssel wirklich verschieben? (j/N) j
Wählen Sie den Speicherort für den Schlüssel:
   (1) Signatur-Schlüssel
   (3) Authentisierungs-Schlüssel
Ihre Auswahl? 1

sec  rsa4096/C3DEBD3DBFECCEFA
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/F64513EB7ED0228B
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: E
[ ultimativ ] (1). Test Test <test2@test2.com>

gpg> key 1

sec  rsa4096/C3DEBD3DBFECCEFA
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/F64513EB7ED0228B
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: E
[ ultimativ ] (1). Test Test <test2@test2.com>

gpg> keytocard -v
Wählen Sie den Speicherort für den Schlüssel:
   (2) Verschlüsselungs-Schlüssel
Ihre Auswahl? 2

sec  rsa4096/C3DEBD3DBFECCEFA
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: SC
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/F64513EB7ED0228B
     erzeugt: 2021-01-07  verfällt: 2021-01-21  Nutzung: E
[ ultimativ ] (1). Test Test <test2@test2.com>

gpg> quit
Änderungen speichern? (j/N) j

C:\Windows\system32>gpg --card-status
Reader ...........: Nitrokey Nitrokey Start 0
Application ID ...: D276000124010200FFFE431150350000
Application type .: OpenPGP
Version ..........: 2.0
Manufacturer .....: unmanaged S/N range
Serial number ....: 43115035
Name of cardholder: [nicht gesetzt]
Language prefs ...: [nicht gesetzt]
Salutation .......:
URL of public key : [nicht gesetzt]
Login data .......: [nicht gesetzt]
Signature PIN ....: zwingend
Key attributes ...: rsa4096 rsa4096 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 0
KDF setting ......: off
Signature key ....: 34BF BC92 07D3 6B33 DFBB  1314 C3DE BD3D BFEC CEFA
      created ....: 2021-01-07 13:07:50
Encryption key....: F026 3D99 D2C5 5440 09E5  CB86 F645 13EB 7ED0 228B
      created ....: 2021-01-07 13:07:50
Authentication key: [none]
General key info..: pub  rsa4096/C3DEBD3DBFECCEFA 2021-01-07 Test Test <test2@test2.com>
sec>  rsa4096/C3DEBD3DBFECCEFA  erzeugt: 2021-01-07  verfällt: 2021-01-21
                                Kartennummer:FFFE 43115035
ssb>  rsa4096/F64513EB7ED0228B  erzeugt: 2021-01-07  verfällt: 2021-01-21
                                Kartennummer:FFFE 43115035

C:\Windows\system32>gpg --list-secret-keys
C:/Users/XXX/AppData/Roaming/gnupg/pubring.kbx
----------------------------------------------------
sec>  rsa4096 2021-01-07 [SC] [verfällt: 2021-01-21]
      34BFBC9207D36B33DFBB1314C3DEBD3DBFECCEFA
      Kartenseriennr. = FFFE 43115035
uid        [ ultimativ ] Test Test <test2@test2.com>
ssb>  rsa4096 2021-01-07 [E] [verfällt: 2021-01-21]

werner added a comment.Thu, Jan 7, 6:30 PM

The listing shows that the private keys are stored on a card ("sec>", "ssb>"). Why do you think you can still export more than a stub key? If I export a test key (just the primary key in this case) and run "gpg --show-keys" on the exported file I get the expected "sec>" marker. Looking with --list-packets at it we get:

:secret key packet:
      version 4, algo 19, created 1581439542, expires 0
      pkey[0]: [72 bits] nistp256 (1.2.840.10045.3.1.7)
      pkey[1]: [515 bits]
      gnu-divert-to-card S2K, algo: 0, simple checksum, hash: 0
      serial-number:  d2 76 00 01 24 01 02 00 ff fe 42 31 5e 6d 00 00
      keyid: 678B2B56F75B3DB0

showing our stub key marker ("gnu-divert-to-card S2K") and the S/N of the card.

Granted, I did not used keytocard but the indicators you got showed that keytocard worked as expected. Can you please do an export of the key and run --show-keys or --list-packets on it?

Chris91 added a comment.EditedThu, Jan 7, 7:06 PM

Why do you think you can still export more than a stub key?

Because I did it. As mentioned in the first post, the problem is not what I see via cmd and in the keyring. That's seems to be correct.

But in Kleopatra there is no change, no refer to the stub or the smartcard. After this process, I can easily save the private key via Kleopatra to a file. Delete the keypair from the keyring and import it from the file again. Then I can restart this process, because it's not the stub, it's the complete keypair.

P.S. did you see the screenshots that I have attached? I can't see them... edit: fixed

  1. I created another handful of key pairs and tested around. However, I could not recreate the problem now. I can store the secret key in Kleopatra, but the file differs from the backup key. It seems to be a stub indeed. And even if I want to perform an operation directly in Kleopatra, the smartcard is requested.
  1. Still, I'm sure that when I created a new key pair a few days ago, I backed it up via Kleopatra (after the keytocard operation) and after deleting it completely from the keyring, I was able to import it again and repeat the keytocard process. As if it had not been a stub. Maybe I made a mistake somewhere or it was a temporary error.
  1. The reason I noticed a difference at all is because I see absolutely no reference to the smartcard in Kleopatra in the main window and that's the reason I got suspicious in the beginning. Only when I perform an operation (e.g. Notepad) am I asked for the smartcard. I am sure that in early 2020, when I first worked with a smartcard, there was a reference to the smartcard in Kleopatra in the main window. In some online documentation I see a small smartcard icon, but I don't remember if it was that or something else (e.g. bold fond). I once looked through the version history since 2019, but could not find any indication that anything had changed in that regard.

Thank you @bernhard and @werner and sorry for the trouble. For my needs T5218 can be closed here.

werner closed this task as Resolved.Fri, Jan 8, 10:01 AM
werner claimed this task.

Thanks for your answers. If you see another problem with kleopatra, please test the latest Kleopatra version which we will release the next days.