Öffentliche S/MIME Schlüssel (Public Keys) über DFN-PKI suchen und importieren

PKI
S/MIME
Sicherheit
GPG
PGP
bash
Author

Johannes Titz

Published

March 26, 2022

Bisher habe ich für die Verschlüsselung und das Signieren von E-Mails GPG (OpenPGP) genutzt, welches auf der Idee vom Web of Trust basiert. Erst kürzlich habe ich gelernt, dass S/MIME im Grunde genau so funktioniert wie GPG, nur eben ohne Web of Trust, sondern mit einer hierarchischen Struktur. Hat man ein S/MIME Zertifikat, so wurde es von einer höheren Stelle ausgestellt, was jeder auch leicht nachprüfen kann. Fürs Signieren von Dokumenten ist das ein klarer Vorteil. Jeder sieht, dass die Unterschrift wirklich von einer bestimmten Person stammt.

Da aufgrund von Corona sowieso alles digital abläuft und zumindest an der Universität auch eingescannte Unterschriften teilweise akzeptiert werden, wäre die Nutzung digitaler Unterschriften viel effizienter und sicherer. Daher habe ich jetzt auch ein S/MIME-Zertifikat bentragt. Über die Universiäten ist das meist kostenfrei möglich und die Zertifikate sind für drei Jahre gültig. Üblicherwise wird die Private key Infrastructure (PKI) des deutschen Forschungsnetzes (DFN) genutzt.

In diesem Zuge habe ich mich gefragt, wie man an die öffentlichen Schlüssel von Personen kommt, denen man eine E-Mail schreiben möchte. Man kann natürlich die Personen auffordern, ihren Schlüssel an eine Mail anzuhängen. Aber was, wenn man eine unbekannte Person anschreiben möchte? Geht das überhaupt? Klar, denn die Public Keys befinden sich im Verzeichnisdienst der DFN-PKI (https://www.pki.dfn.de/faqpki/faqpki-allgemein/#c15074). Allerdings ist die Prozedur etwas knifflig, denn der Dienst läuft über LDAP und bei Konfiguration z. B. über Thunderbird, wird das entscheidende Attribut (userCertificate) natürlich nicht angezeigt. Über ldapsearch (Paket openldap) geht’s aber doch sehr einfach unter GNU/Linux:

ldapsearch -x -H ldap://ldap.pca.dfn.de:389 -b "ou=DFN-PKI,o=DFN-Verein,c=de" \
  "cn=Johannes Titz"
# extended LDIF
#
# LDAPv3
# base <ou=DFN-PKI,o=DFN-Verein,c=de> with scope subtree
# filter: cn=Johannes Titz
# requesting: ALL
#

# johannes.titz@psychologie.tu-chemnitz.de, Technische Universitaet Chemnitz, D
 FN-PKI, DFN-Verein, DE
dn: mail=johannes.titz@psychologie.tu-chemnitz.de,o=Technische Universitaet Ch
 emnitz,ou=DFN-PKI,o=DFN-Verein,c=DE
cn: Johannes Titz
mail: johannes.titz@psychologie.tu-chemnitz.de
sn: Titz
objectClass: inetOrgPerson
userCertificate;binary:: MIIG6TCCBdGgAwIBAgIMJmUNYwmufKINUNz0MA0GCSqGSIb3DQEBC
 wUAMIGNMQswCQYDVQQGEwJERTFFMEMGA1UECgw8VmVyZWluIHp1ciBGb2VyZGVydW5nIGVpbmVzIE
 RldXRzY2hlbiBGb3JzY2h1bmdzbmV0emVzIGUuIFYuMRAwDgYDVQQLDAdERk4tUEtJMSUwIwYDVQQ
 DDBxERk4tVmVyZWluIEdsb2JhbCBJc3N1aW5nIENBMB4XDTIyMDMzMTExMjYxNFoXDTI1MDMzMDEx
 MjYxNFowcjELMAkGA1UEBhMCREUxKTAnBgNVBAoMIFRlY2huaXNjaGUgVW5pdmVyc2l0YWV0IENoZ
 W1uaXR6MQ0wCwYDVQQEDARUaXR6MREwDwYDVQQqDAhKb2hhbm5lczEWMBQGA1UEAwwNSm9oYW5uZX
 MgVGl0ejCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKOWn/NMDu8EiposvlTcvC5/KwL
 +8swl2Tzn3WqhYVY4RncAK/LQr6sZ47VHdRGCVV2auA7BDnsJPLsaBsW/cTG3wFlJBLJxAgBK/W0R
 m3CZeCWixFoFIm8HDRNkTW+EKFRgYkaSWBt4a0uGLCqJOT+6PM6W3s7vOQuBhCGnsc+6g3+ofKVFC
 Fth3L47La4QZ1Fknrcu202D4+NvBFBvJ9DAkpRNrPPlMWb/i+FkxfU93DK0YfHfGuuTDnscdpAVGz
 aVZbm2gK36ePrBgZf5ZREeoXBReg/wUOAkvpKkPOu6bv0UaON50lXZzBgO+tfnPQbJj0WUFkipHoA
 Of3J0m6Cqe+gPlGgsB/WFoVnfZl9EEcKuZ6N+gAIAxDNNLB76C/go1GfSmgbcL+LKaitD7JGQTrql
 zsc825EjrXuA0KGrwvoQD7sXoZQO/HgfkhIZv+QF3kTATw2vDLQ1pS8pabVBsuESPhr9bxuRQOyUh
 XS67/aI5rXllG/2GWroREnEy6Ji0eYo4GVaROfFPj1gjid66XzTeJjq7x7kjh57iF+MFrMJQ4vtMO
 HRk0PzU2tFExKFtJj6L3IqRtvjUg2onXfAphCYMF0uAtoTSlasVGxI88a2B5uprCK40qB7ww/YoDG
 q3AKRq7sVug21xx3+u/fZePMGxb40xYfCt4V7NPt1AgMBAAGjggJhMIICXTA+BgNVHSAENzA1MA8G
 DSsGAQQBga0hgiwBAQQwEAYOKwYBBAGBrSGCLAEBBAowEAYOKwYBBAGBrSGCLAIBBAowCQYDVR0TB
 AIwADAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMB0GA1UdDg
 QWBBSm2Itd+1jYRa8nXeJ/EsUyPz6t1zAfBgNVHSMEGDAWgBRrOpiL+fJTidrgrbIyHgkf6Ko7dDA
 zBgNVHREELDAqgShqb2hhbm5lcy50aXR6QHBzeWNob2xvZ2llLnR1LWNoZW1uaXR6LmRlMIGNBgNV
 HR8EgYUwgYIwP6A9oDuGOWh0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvZGZuLWNhLWdsb2JhbC1nMi9wd
 WIvY3JsL2NhY3JsLmNybDA/oD2gO4Y5aHR0cDovL2NkcDIucGNhLmRmbi5kZS9kZm4tY2EtZ2xvYm
 FsLWcyL3B1Yi9jcmwvY2FjcmwuY3JsMIHbBggrBgEFBQcBAQSBzjCByzAzBggrBgEFBQcwAYYnaHR
 0cDovL29jc3AucGNhLmRmbi5kZS9PQ1NQLVNlcnZlci9PQ1NQMEkGCCsGAQUFBzAChj1odHRwOi8v
 Y2RwMS5wY2EuZGZuLmRlL2Rmbi1jYS1nbG9iYWwtZzIvcHViL2NhY2VydC9jYWNlcnQuY3J0MEkGC
 CsGAQUFBzAChj1odHRwOi8vY2RwMi5wY2EuZGZuLmRlL2Rmbi1jYS1nbG9iYWwtZzIvcHViL2NhY2
 VydC9jYWNlcnQuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQB1xpmzfY8JSPeBzFdwmY3AvMyxAt7wCy5
 mOJeoyXKD7JZh9glbeStvDcsQ0BShKYeahPoIHqHMiEbXFSJ4gV5yAZQ1DugvO5UGo0bA93XuYJdD
 Gl9SGdduxuAm3e82mGHtpvwgWCIwaS+fXB6cQcbTqbx0kGoHdbRwkiPqkzc1K+wBscUinW899d67t
 t4youqA8FAbs+qPqlukSZfXRfAMk4PbOXcMWqdvoeaKQWSkBk/v4GwsTC8f+drd9K0+uOPtP6I+91
 BRzp1gnAyltKfdlQmCkEP2wuxP8PTtai3iyfrxbkk+AdTbrq/w/sjJMdwxKqCDIeWiajjQoOC3jvT
 0

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Als letztes gibt man den Suchterm ein, cn steht hier für Common Name, man kann natürlich auch nach anderen Attributen suchen.

Wenn man den Schlüssel ins Mailprogramm importieren möchte, dann erstellt man aus dem userCertificat eine richtige Zertifikatsdatei:

ldapsearch -x -H ldap://ldap.pca.dfn.de:389 -b "ou=DFN-PKI,o=DFN-Verein,c=de" \
  "cn=Johannes Titz" > pubkey
echo "-----BEGIN CERTIFICATE-----" > pubkey.pem
tr -d '\n ' < pubkey | sed 's/.*binary:://; s/#search.*//' >> pubkey.pem
echo -e "\n-----END CERTIFICATE-----" >> pubkey.pem
cat pubkey.pem
-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----

Der sed-Befehl löscht alles vor und nach dem Public Key.

In Thunderbird importieren über Account Settings, End-To-End-Encryption, Manage S/MIME Certificates, Import. Name, Mailadresse usw. sind schon im Zertifikat kodiert.