S/MIME-Verschlüsselung in neomutt einrichten und nutzen

S/MIME-Zertifikate in neomutt einbinden ist mit Hilfe des Programms gpgsm kinderleicht geworden. Hier zeige ich wie es geht.

Bei sys4 verschlüsseln wir E-Mail standardmäßig – fallweise weichen wir davon ab. Wenn ich von Verschlüsselung spreche, dann meine ich damit Ende-zu-Ende- und Transportverschlüsselung. In diesem kleinen HOWTO soll es darum gehen, wie man in mutt oder neomutt E-Mails entsprechend des S/MIME-Standards signiert und/oder verschlüsselt.

Früher musste man S/MIME-Zertifikate mit Hilfe des Perl-Skriptes smime_keys verwalten. Das Importieren fremder Zertifikate sowie der ganzen Trust-Chain oberhalb des Zertifikates fand zumindest ich, immer ein wenig clumsy. Es ging, aber ich fand es umständlich.

Seit einer Weile ist das nun anders und ich bin sehr froh darum, denn jetzt ist mein Leben mit S/MIME auf neomutt viel einfacher geworden. Möglich wurde das durch das GnuPG-Projekt. Dieses hat schon vor längerer Zeit ein Software-Modul mit dem Namen gpgsm vorgelegt. Die man-Page des Moduls beschreibt die Software wie folgt:

gpgsm is a tool similar to gpg to provide digital encryption and signing
services on X.509 certificates and the CMS protocol. It is mainly used as a
backend for S/MIME mail processing. gpgsm includes a full featured
certificate management and complies with all rules defined for the German
Sphinx project.

gpgsm liefert mir also alles, was ich brauche, um meine X.509-Zertifikate (S/MIME-Zertifikate) zu verwalten, sowie um eingehende E-Mails zu entschlüsseln als auch um ausgehende Nachrichten zu signieren und/oder zu verschlüsseln.

Entsprechend der Möglichkeiten des Programms fallen die Optionen auf, mit denen es aufgerufen und für bestimmte Anwendungsfälle genutzt werden kann. Mit einem Aufruf von gpgsm -? auf der Kommandozeile kann ich mir die gefühlt 30 Optionen ausgeben lassen. Zu denen gehören das Ver- und Entschlüsseln sowie Signieren als auch Expertenoptionen wie das Verlangen einer bestimmten Policy.

Mir geht es hier erst einmal darum, mein S/MIME-Zertifikat in neomutt einzubinden. Dazu habe ich mir im Vorfeld bereits ein gültiges Schlüssel/Zertifikatspaar besorgt – beide Teile befinden sich in der Datei p@sys4.de.p12. Mit openssl und dem Subkommando pkcs12 kann ich Einblick in den Inhalt der Datei gewinnen:

$ openssl pkcs12 -info -in ~/p@sys4.de.p12
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: 4E D2 15 5E AF D1 91 30 B3 4C FB 90 C2 16 AA CD 95 28 3D 14
subject=C = DE, ST = Bayern, O = sys4 AG, OU = Vorstand, emailAddress = p@sys4.de, CN = Patrick Ben Koetter

issuer=C = CH, O = SwissSign AG, CN = SwissSign Personal Gold CA 2014 - G22

-----BEGIN CERTIFICATE-----
...                                                              (1)
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    localKeyID: 4E D2 15 5E AF D1 91 30 B3 4C FB 90 C2 16 AA CD 95 28 3D 14
Key Attributes: <No Attributes>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
...                                                              (2)
-----END ENCRYPTED PRIVATE KEY-----
1 In diesem Abschnitt befindet sich das öffentliche Zertifikat
2 In diesem Abschnitt befindet sich der private Schlüssel

Dieses S/MIME-Zertifikat muss ich nun importieren, damit ich es in neomutt verwenden kann. Dazu rufe ich gpgsm mit der Option --import DATEI auf:

[p@p ~]$ gpgsm --import p@sys4.de.p12
gpgsm: 1928 bytes of RC2 encrypted text
gpgsm: processing certBag
gpgsm: 2376 bytes of 3DES encrypted text
gpgsm: DBG: keygrip= E0 72 D9 42 3F 81 76 4F ED B8 93 76 83 0B E6 A5 B4 21 3C 63
gpgsm: gesamte verarbeitete Anzahl: 2
gpgsm:                              importiert: 1
gpgsm:              gelesene geheime Schlüssel: 1
gpgsm:            geheime Schlüssel importiert: 1
Was passiert während des Importvorgangs?

Während des Importvorgangs werde ich zweimal durch einen Passwort-Dialog geführt. Die erste Runde dient dazu, für dem Import Zugriff auf den Key in der Datei p@sys4.de.p12 zu erhalten.

Der zweite Passwort-Dialog dient dazu, das nun importierte Schlüsselpaar vor fremden Zugriff zu schützen. Ich muss ein neues Kennwort festlegen und bestätigen.

Zur Ergebniskontrolle lasse ich mir anschließend alle Zertifikate mit „secret keys“ ausgeben. Dazu rufe ich wieder gpgsm auf und gebe ihm entweder ein --list-secret-keys oder ein -K auf den Weg. In meinem Fall listet es nun zwei Zertifikate: Das Erste ist ein mittlerweile Widerrufenes und das Zweite ist mein aktuell gültiges Zertifikat mit dem ich meine E-Mails signiere und verschlüssele.

Die Ausgabe zeigt, sie unterscheiden sich nicht nur im Hinblick auf die Gültigkeitsdauer. Auch ID und fingerprint variieren:

[p@p ~]$ gpgsm -K
/home/p/.gnupg/pubring.kbx
--------------------------
           ID: 0x7DD9365F
          S/N: 204B9522C576633F1F2B38EF0E0D193A6C892BB3
       Issuer: /CN=SwissSign Personal Gold CA 2014 - G22/O=SwissSign AG/C=CH
      Subject: /CN=Patrick Ben Koetter/OU=Vorstand/O=sys4 AG/ST=Bayern/C=DE/EMail=p@sys4.de
          aka: p@sys4.de
     validity: 2018-04-06 12:12:55 through 2021-04-06 12:12:55
     key type: 4096 bit RSA
    key usage: digitalSignature nonRepudiation keyEncipherment dataEncipherment keyAgreement
ext key usage: clientAuth (suggested), emailProtection (suggested), 1.3.6.1.4.1.311.10.3.4 (suggested), 1.3.6.1.4.1.311.20.2.2 (suggested)
     policies: 2.16.756.1.89.1.2.1.6:N:
  fingerprint: E3:3D:7D:85:AD:30:54:11:5D:5D:AE:D9:25:C7:11:D4:7D:D9:36:5F

           ID: 0x95283D14                                                   (1)
          S/N: 5617ADA3DFE6046238066DF7F86046151D87A7F4
       Issuer: /CN=SwissSign Personal Gold CA 2014 - G22/O=SwissSign AG/C=CH
      Subject: /CN=Patrick Ben Koetter/OU=Vorstand/O=sys4 AG/ST=Bayern/C=DE/EMail=p@sys4.de
          aka: p@sys4.de
     validity: 2019-09-02 09:18:28 through 2022-09-02 09:18:28
     key type: 4096 bit RSA
    key usage: digitalSignature keyEncipherment dataEncipherment
ext key usage: emailProtection (suggested)
     policies: 2.16.756.1.89.1.2.1.11:N:,0.4.0.2042.1.1:N:
  fingerprint: 4E:D2:15:5E:AF:D1:91:30:B3:4C:FB:90:C2:16:AA:CD:95:28:3D:14
1 Die ID brauche ich gleich noch, damit neomutt weiß, welches Zertifikat es verwenden soll.

Wenn man – so wie ich – mehrere Mailkonten nutzt, dann ist es ganz normal auch mehrere S/MIME-Zertifikate zu haben – für jedes Konto ein eigenes. Fragt sich, wann neomutt welches Zertifikat einsetzen soll. Um das zu automatisieren nutze ich den folder-hook-Trigger in neomutt. Im Kontext eines bestimmten „folders“ – hier wäre es mein zweites Mailkonto – soll eine Konfiguration gesetzt werden:

folder-hook imap://mail.state-of-mind.de 'set from="Patrick Ben Koetter <p@state-of-mind.de>";'
folder-hook imap://mail.state-of-mind.de 'set smime_default_key = 0xXXXXXXXX;'

Für ein einziges Konto muss es nicht so aufwändig sein. Da genügt es, die ID des zu verwendenden Zertifikates als smime_default_key in der Konfiguration von neomutt anzugeben:

set smime_default_key = 0x95283D14

Manche Distributionen splitten die .muttrc in mehrere Konfigurationsdateien, die Optionen thematisch gruppieren. Falls Du also eine smime…​-Datei findest, ergibt es sicherlich Sinn, dort auch den default_key zu spezifizieren.

Damit neomutt die neue Konfiguration anwendet, muss ich es einmal beenden und neu aufrufen. Jetzt kann ich eine Nachricht schreiben und anschliessend – vor dem Versenden – die Tastaturkombination SHIFT-S aufrufen. Diese Kombination führt mich in den S/MIME-Dialog. Dort kann ich jetzt auswählen, ob ich (v)erschlüsseln, (s)ignieren, signieren (a)ls, (b)eides (Verschlüsseln und Signieren), zu (P)GP wechseln möchte oder (u)nverschlüsselt senden will:

smime signatur hinzufuegen
Figure 1. S/MIME-Signatur hinzufügen

Ich wähle die Option s und sehe in der nun folgendenen Ausgabe, dass nun als „Sicherheit: Signieren (S/MIME)“ aktiviert ist und dazu „Signiere als: <Voreinstellung>“ vorgesehen ist – mein smime_default_key wird also zur Anwendung kommen:

smime signiere als pruefen
Figure 2. S/MIME-Signatur hinzufügen

Passt alles! Also stosse ich mit y den Versand der Nachricht an. Und weil ich die Nachricht signieren will, werde ich nun zur Passworteingabe aufgefordert. Ich muss das Kennwort eingeben, mit dem ich mein S/MIME-Zertifikat vorher im gpgsm-Speicher abgelegt hatte:

smime signatur passwort eingeben
Figure 3. S/MIME-Signatur Passwort eingeben

Jetzt wird die E-Mail versendet und ich rufe die Nachricht im Zielkonto mit meinem Thunderbird auf:

smime signatur pruefen
Figure 4. S/MIME-Signatur in Thunderbird prüfen

Die Nachricht wurde signiert und die Signatur wurde geprüft und für gültig befunden. Alles knorke! ;-)

Patrick Ben Koetter , 16.09.2019