S/MIME Certifcate X.509

S/MIME Zertifikat per OpenSSL erstellen

Mit dem Programm kannst du gültige S/MIME Schlüssel und Zertifikate selbst erstellen. Getestet unter Windows und iOS kannst du E-Mails signieren und verschlüsseln.

Benötigt wird ein Linux System mit OpenSSL, mit etwas Anpassung kannst du die OpenSSL Aufrufe auch unter Windows nutzen.  Ich selbst nutze OpenSSL 1.0.2g-fips unter Ubuntu Linux 16.04 LTE.

S/MIME Zertifikat erstellen per Script

Kopiere das folgende Shell Programm auf deinen Linux Host und gib ihm mit chmod +x create_SMIME_p12.sh das Attribut für die direkte Ausführung.

#!/bin/bash
#
# create_SMIME_p12.sh (c) 2017, Andreas Schuster
#
read -p "Accountname (z.B. mmustermann):" account

mkdir ${account}
cd ${account}

cat >${account}.cnf <<-EOF
[ req ]
default_bits            = 2048
distinguished_name      = req_distinguished_name
string_mask = utf8only

[ req_distinguished_name ]
countryName                     = Land (2 Zeichen, z.B. AT, DE, CH)
countryName_default             = AT
countryName_min                 = 2
countryName_max                 = 2
localityName                    = Ort bzw. Stadt (z.B. Wien)
localityName_default            = Wien
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Meine Firma
commonName                      = Dein Name (z.B. Max Mustermann)
commonName_default              = Andreas Schuster [Verschlüsselt.IT]
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64

[ usr_cert ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
subjectAltName=email:move

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth,emailProtection
EOF

### Generiert einen Schlüssel für den Benutzer, Schlüsseldatei ist mit einem Passwort geschützt
echo "Ein neuer Schlüssel für den Benutzer <${account}> wird generiert..."
openssl genrsa -des3 -out ${account}.key 2048

### Speicherung der Schlüsseldatei ohne Passwort, unsicherer im Backup, aber besser für ein späteres Recovery ;-)
echo "Der Schlüssel wird nun ohne Passwort gespeichert..."
openssl rsa -in ${account}.key -out ${account}.nopass.key

### Ein Certificate-Signing-Request wird mit den Parametern des Config-File erstellt
echo "Der Zertifikatsantrag (CSR) wird erstellt..."
openssl req -new -key ${account}.nopass.key -out ${account}.csr -config ${account}.cnf

### Optional: Ausgabe des Certificate-Signing-Request zur Kontrolle durch den Administrator
echo "Dies ist der Inhalt des Zertifikats..."
openssl req -text -noout -in ${account}.csr

### Generierung eines Self-Signed Zertifikates mit XX Jahren Laufzeit
echo "Das selbst-signierte Zertifikat mit Windows kompatiblen EFS-Eigenschaften wird erstellt..."
tage=365
jahre=5
laufzeit=`expr $tage \* $jahre`
openssl x509 -req -days ${laufzeit} -in ${account}.csr -signkey ${account}.nopass.key -out ${account}.crt -extensions v3_req -extfile ${account}.cnf

### Erstellung einer .P12/.PFX Datei, die am Windows Client importiert werden kann
echo "Die .P12/.PFX Datei (X.509 Zertifikat + privater Schlüssel) wird erstellt..."
openssl pkcs12 -export -in ${account}.crt -inkey ${account}.nopass.key -out ${account}.p12

So sieht das Ergebnisverzeichnis aus:

Mit OpenSSL erstellter S/MIME Schlüssel und X.509 Zertifikat in einer .P12/.PFX Datei
Mit OpenSSL erstellter S/MIME Schlüssel und X.509 Zertifikat in einer .P12/.PFX Datei

Windows Nutzung

Nach der Ausführung des Scripts hast du in dem Unterverzeichnis die .p12 Schlüsseldatei die auch das X.509 Zertifikat beinhaltet. Die Datei kannst du unter Windows per Doppelklick direkt in den Windows Zertifikatsmanager installieren. Wenn das Zertifikat bei der Benutzung als nicht gültig angezeigt wird, öffne den Windows Zertifikatmanager per Ausführen certmgr.msc und wähle den Pfad „Zertifikate – Aktueller Benutzer“ -> „Eigene Zertifikate“ -> „Zertifikate“. Wähle das eben importierte Zertifikat und nutze „Kopieren“ über die rechten Maustaste. Dann den Pfad „Vertrauenswürdige Personen“ -> „Zertifikate“ auswählen und dort mit der rechte Maustaste -> „Einfügen“ die Vertrauensstellung erstellen.

iOS Nutzung

Wähle dein E-Mailprogramm und sende die .p12 Datei an eine E-Mail Adresse die du am iPhone empfangen kannst. Am iPhone öffne den .p12 Anhang und importiere den Schlüssel mit Benutzerzertifikat als iOS Profil. Unter „Einstellungen“ -> „Mail, Kontakte, Kalender“ -> „{E-Mail-Kontoname}“ -> „Account“ -> „Erweitert“ -> (ganz unten) „S/MIME“ kannst du dann die automatische Signatur und Verschlüsselung auswählen. Dann kannst du das eben importierte Zertifikat auswählen.

Technische Einschränkungen

Das selbst erstellte Zertifikat ist ein sogenanntes „Self-signed Certificate“, das bedeutet, dass externe Empfänger von mit diesem Zertifikat signierten Nachrichten eine Warnung erhalten, dass das Zertifikat aus einer nicht vertrauenswürdigen Quelle stammt. Dies kann nur vermieden werden, wenn der Empfänger deinem Zertifikat per Knopfdruck vertraut, oder du ein S/MIME Zertifikat bei einem Trust Center, oder in neuer Namensgebung einem Zertifikat-Dienste-Anbieter (ZDA) kaufst. Gerne empfehle ich dir passende ZDAs für deinen Anwendungsfall.

Funktioniert dein S/MIME Zertifikat? Gerne stehe ich als Testperson für E-Mail Signatur und Verschlüsselung über meine E-Mail-Adresse andreas[ÄT]verschluesselt.it zur Verfügung!

Schreibe nun ein Kommentar wie dir mein Beitrag gefällt!

8 thoughts on “S/MIME Zertifikat per OpenSSL erstellen”

  1. Hallo Andreas,

    sehr gute Anleitung die bei mir sofort funktioniert hat. Stell doch deinen öffentlichen Schlüssel hier auf der Seite zur Verfügung, dann kann ich dir in Zukunft auch immer sicher Schreiben 😉

    Mit dieser Anleitung sind Glenn-Greenwald und Pre-Snowden Probleme kein Problem, und die Anleitung ist einfacher als die Volksverschlüsselung.

    Gut gemacht – weiter so!

  2. Hallo Andreas,

    sehr gute Anleitung zu einem sonst sehr schweren Thema. Hat Spaß gemacht den Artikel zu lesen 🙂

    Stell doch dein Zertifikat auch auf die Seite, dann haben wir keinen Pre Snowden Glenn Greenwald Test (https://de.wikipedia.org/wiki/Glenn_Greenwald) Probleme und können immer sicher Kommunizieren.

    Freu mich schon auf den nächsten Beitrag zu dem Thema

  3. Hallo Andreas,

    Das Problem mit dem „Self-Signed“ Zertifikat kann man auch umgehen wenn man ein kostenloses Zertifikat nutzt, das „Public Trusted“ ist.

    Da gibt es z.B. StartSSL (https://www.startssl.com/Support?v=1)

    oder für Web-Server-Zertifikate lässt sich auch Let’s Encrypt Nutzen (https://letsencrypt.org/).

    Mit persönlich gefallen solche alternativen, da ich es absurd finde mehrere hundert Euro für ein Zertifikat auszugeben….

    lg
    Michael

    1. Hallo Michael,

      die von dir beschriebenen kostenlosen Zertifikate sind SSL Zertifikate in der Regel für Webserver also https Verbindungen. Ich denke auch, dass für Privatnutzer oder Kleinunternehmen StartSSL und jetzt neu Let´s Encrypt eine gute Wahl ist.
      Die Zertifikate kann man nur leider nicht für S/MIME Email-Verschlüsselung nutzen, da gibt es meines Wissens nach keinen kostenfreien Anbieter der eine vernünftige Laufzeit von 2-3 Jahren für das Zertifikat anbietet. Ich habe schon freie S/MIME Demo Zertifikate für 30 Tage oder so gesehen, aber das bringt ja nichts wenn man in einer Regelmäßigkeit verschlüsseln möchte. Wenn man nicht groß investieren möchte kann man sich mit der o.a. Anleitung ein 5 Jahres S/MIME Zertifikat erstellen und nach manueller Bestätigung des Empfängers auch zuverlässig nutzen. 🙂

      Sichere Grüße!
      Andreas

      1. Hallo Marcel,

        eine wirklich gute Frage. Ich habe mich primär auf auf die Outlook Prüfung fokussiert.

        Es ist aber auch wirklich wichtig was du bei den Fragen während der Zertifikatserstellung eingibst. Die meisten Felder müssen gefüllt sein, speziell die Frage an deiner Email Adresse ist kritisch, da jeder Email-Client das S/MIME Zertifikat an der darin gespeicherten Email-Adresse identifiziert.

        Erzeugt wird ein RSA2048 Zertifikat mit SHA1 oder SHA256 Hash (je nach deiner openssl.cnf). Das sollte eigentlich jeder E-Mail Client gut verarbeiten können. Kritisch kann es auch bei dem Punkt der unter Technische Einschränkungen steht werden, es handelt sich um ein selbstsigniertes Zertifikat und es gibt darüber keine prüfbare Zertifikatskette. Eventuell versucht der EM Client die Kette zu prüfen und das schlägt fehl.

        Hast Du eine Fehlermeldung erhalten?

        Sichere Grüße, Andreas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*