[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:sudo: Root-Rechte erlangen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/security.png, 48, align=left)]] Diese Anleitung beschreibt Möglichkeiten zur Erlangung eines [wikipedia:SSL-Verschlüsselung: SSL]- oder auch [wikipedia:Transport_Layer_Security: TLS]-Zertifikates samt der Erzeugung des zugehörigen privaten Schlüssels. Ziel ist meist, Inhalte von einem Webserver (z.B. [:Apache/mod_ssl:Apache]) verschlüsselt über das Internet öffnen zu können. = Zertifikate = Es gibt drei unterschiedliche Arten von Zertifikaten: * öffentlich signierte Zertifikate - offiziell gültiges Zertifikat, das über eine öffentliche CA signiert wurde * privat signierte Zertifikate - über eine private (nicht öffentliche) CA signiert * [#selbstsigniertes-Zertifikat selbstsignierte Zertifikate] - signiert durch den eigenen privaten Schlüssel, nicht über eine CA Für die Stärke bzw. Sicherheit der Verschlüsselung ist das gewählte Verfahren völlig irrelevant. Der Unterschied liegt aber darin, dass ein öffentlich gültiges Zertifikat von einer offiziellen Zertifizierungsstelle ("Certificate Authority", [:CA:]) "unterschrieben" werden muss und anschließend in der Regel von allen gängigen Programmen (z.B. Browsern) anstandslos als vertrauenswürdig akzeptiert wird - da diese ein übergeordnetes Zertifikat der CA enthalten. Umgekehrt lässt sich für selbstsignierte Zertifikate nicht prüfen, ob dem Aussteller vertraut werden kann oder nicht, und es werden entsprechende Warnungen bzw. Sicherheitsabfragen angezeigt. Privat signierte Zertifikate werden nur dann als vertrauenswürdig akzeptiert, falls das Zertifikat der verwendeten CA [:CA#CAhinzufuegen:nachträglich auf dem Client-Rechner installiert] wurde. = offiziell gültiges Zertifikat = Um ein offiziell gültiges Zertifikat zu erhalten, muss man im Besitz einer Domain sein. Für diese Domain wird das Zertifikat beantragt und ausgestellt. Bevor man ein Zertifikat erhält, wird diese Voraussetzung von der CA überprüft. Je nach CA und Typ des Zertifikats unterscheidet sich die Art dieser Überprüfung. == Let's Encrypt == Eine sehr einfache und dazu kostenlose Variante, um mit Ubuntu an ein solches Zertifikat zu kommen, ist die Beantragung über die Zertifizierungsstelle [https://letsencrypt.org Let's Encrypt] {en}. Voraussetzung für diese Methode ist, dass der Webserver bereits öffentliche HTTP-Anfragen auf die Domain beantwortet - es muss also unter anderem ein A-record im DNS existieren. Das Zertifikat ist nach der Ausstellung zunächst für drei Monate gültig. Die Verlängerung ist ebenfalls kostenlos und kann ganz einfach automatisiert werden. Die eigentliche "Bestellung" erfolgt über eines der Kommandozeilenprogramme direkt auf dem Webserver. === certbot === Das Programm certbot vereinfacht die Erstellung und Administration von Let's Encrypt-Zertifikaten erheblich. Näheres hierzu im Artikel [:certbot:]. === getSSL === Alternativ kann die Einrichtung via getSSL erfolgen. Hierfür gibt es ein [:Howto/getssl: Howto] auf diesem Portal. == andere CAs == Um ein Zertifikat von einer anderen CA anzufordern, muss ein "Certificate Signing Request" (CSR) erstellt werden. Voraussetzung hierfür ist wiederum ein privater Schlüssel. === Privaten Schlüssel erzeugen === Der Schlüssel sollte immer auf eigens verwalteten Systemen erzeugt und gespeichert werden und niemals Dritten in die Hände gegeben werden - auch nicht der signierenden CA. {{{#!vorlage Hinweis Es gibt CAs, welche komplette Zertifikate inklusive privaten Schlüsseln selbst erstellen und diese z.T. sogar noch in ungesicherten E-Mails zusammen an den Empfänger verschicken. Um solche Anbieter sollte ein großer Bogen gemacht werden: Niemand kann garantieren, dass der private Schlüssel wirklich keinem Dritten in die Hände fällt, womit das komplette Vertrauensmodell und auch die Sicherheit der Verschlüsselung ausgehebelt werden. Quelle: [heise:ct/ausgabe/2014-12-Wie-CAs-das-Vertrauen-in-die-SSL-Technik-weiter-untergraben-2189639.html: Beitrag in c't 12/2014] {de} }}} Im folgenden Beispiel soll der private Schlüssel als '''/etc/ssl/private/apache.key''' für den Apache Webserver erzeugt werden. Da normale Benutzer auf diesen Ordner keinen Zugriff haben, sollte zunächst ein Pseudo-Root-Terminal [1][2] mittels {{{#!vorlage Befehl sudo -i }}} geöffnet werden. Der private Schlüssel wird nun mit dem folgenden Kommando erzeugt: {{{#!vorlage Befehl openssl genrsa -out /etc/ssl/private/apache.key }}} Der private Schlüssel ist nicht durch eine Passphrase geschützt. Das ist notwendig, da Apache sonst bei jedem Neustart die manuelle Eingabe der Passphrase verlangen würde oder diese in der Konfiguration im Klartext hinterlegt werden müsste. ==== Kryptografie mit elliptischen Kurven ==== Als Schlüsselformat werden neben herkömmlichen RSA-Schlüsseln sogenannte EC-Schlüssel (elliptic curve = [wikipedia:Elliptische-Kurven-Kryptosystem:Elliptische Kurve]) unterstützt, welche mit dem Kommando [[Vorlage(Befehl, "openssl ecparam -out /etc/ssl/private/apache.key -name secp521r1 -genkey")]] erzeugt werden können. Mit `-name secp521r1` wird der zu verwendende Algorithmus (die zu verwendende Kurve, analog zur Länge für einen RSA-Schlüssel) festgelegt. Welche Kurven genutzt werden können, lässt sich mit dem Befehl [[Vorlage(Befehl, "openssl ecparam -list_curves")]] abfragen. Aktuell sollten vorwiegend die Kurven `secp192r1`, `secp256k1`, `secp384r1` oder `secp521r1` verwendet werden, da diese in den meisten Standards vertreten sind und somit am weitesten verbreitet sein dürften. Schlüssel aus elliptischen Kurven können mit geringerer Länge eine gleich gute Sicherheit wie RSA-Schlüssel bieten und sind deswegen deutlich schneller === CSR erzeugen === Als nächstes kann nun der CSR erzeugt werden. Dieser beinhaltet keine sensiblen Daten und kann deshalb an einer beliebigen Stelle erstellt werden, wo man ihn später wieder findet. Im folgenden Beispiel wird der CSR im eigenen Heimatverzeichnis abgelegt. {{{#!vorlage Befehl openssl req -new -key /etc/ssl/private/apache.key -out ~/apache.csr }}} Nach Bestätigen des Befehls mit der Eingabetaste werden noch einige Details zum Inhalt des Zertifikates abgefragt. Hier ist der '''Common Name''' am wichtigsten, denn hier muss der Domainname ([wikipedia:Domain_(Internet)#Fully_Qualified_Domain_Name_(FQDN): FQDN]) stehen, für welchen das Zertifikat eingesetzt werden soll (beispielsweise "meine-seite.de"). Wie mit dieser Datei zu verfahren ist, hängt von der jeweiligen CA ab und sollte auf deren Seiten erklärt sein. Es ist bspw. üblich, dass der Inhalt der CSR-Datei bei einer Zertifikatsbestellung in einem Browser-Fenster eingefügt werden muss. Nach erfolgreicher Verifizierung, dass man auch im Besitz der Domain ist, wird das Zertifikat ausgestellt. Dieses besteht - wie auch der private Schlüssel und der CSR - aus einer einfachen Text-Datei mit kryptischem Inhalt. Beispiel: {{{ -----BEGIN CERTIFICATE----- MIIC5jCCAc6gAwIBAgIJALRqoODSYVNiMA0GCSqGSIb3DQEBCwUAMBwxGjAYBgNV BAMMEWt1YnVudHUuZnJpdHouYm94MB4XDTE3MTEyNTE4MTIzNVoXDTI3MTEyMzE4 MTIzNVowHDEaMBgGA1UEAwwRa3VidW50dS5mcml0ei5ib3gwggEiMA0GCSqGSIb3 DQEBAQUAA4IOI5ISDLKHAoIBAQDTrT4T7vvmIhTLr/a+sQwogaUUCZbzqoeVytsz GlCth3Y/P11zK3GVuwlX3ChMTkxUEYQ2ZavKVA1SHrthbUqOmbJp2zi5sDWxiJvp IyFY4ydXuDwUlnFEMb9FfDSMLWno1N8V8ecNIKAhsqBTI9Dh9yGbBuyWnBEJqM32 tdTeciLKMK2I8ux96WoJtury6JqFAsfdwFsbwuNcGgqMT+FenN3LeI12qxoqyfX5 ZMGy2KGJNMYPyzo59LCBg0xvXrFKDgItO0c/5sDcWqNxiufp54JTiTAq0ZK6pWGY I6RRamvSbMXqOb7qYRmkm8auENJLmCn5JCk65zwXAUScEqRzAgMBAAGjKzApMAkG A1UdEwQCMAAwHAYDVR0RBBUwE4IRa3VidW50dS5mcml0ei5ib3gwDQYJKoZIhvcN AQELBQADggEBAGmC7xH62zzJYE1EqqjK+aznHd1iT+90hnJyxqNaTgALUn6I4UFg RIlUOmiqI9dgO9kcnfnbABSN4dEKWacgV9ZEH+4zatYJri4M7oxUi+PQ4kvY1Iw8 0MN5euI4IIwGXkUYJCG+WSqozDBA2oGcjsSfhrPYy658b05g1eTwaxyiKmQzGEqj whBYbD1MOpsiG1Kj3xq4oeKCjI1oW0ZZcL0Y6bOGIpYlTuFbHzB5X14sEuX1lRnu uHwkzHyKLHFwd450qmQzEpXE9+w3HhaJTJ3Qm5ta37HGuqjCFxJduliUOhtVPJyB qoTOxB7DHESz7ICaLQAUUxhm3OG+Rea4FTo= -----END CERTIFICATE----- }}} Die erste und letzte Zeile sind Teil der Zertifikatsdatei und dürfen nicht entfernt werden. Die Datei speichert man nun auf dem Server (z.B. unter '''/etc/ssl/certs/apache.crt'''). Anschließend kann das Zertifikat vom Webserver eingebunden werden. = privat signiertes Zertifikat = Wer Zertifikate über eine eigene CA signieren will, findet eine entsprechende Anleitung im Artikel [:CA:]. = selbstsigniertes Zertifikat = == Paket ssl-cert == Ein selbstsigniertes Zertifikat inkl. Schlüssel erhält man am schnellsten über das Paket '''ssl-cert'''. Eine sehr gute Anleitung dazu findet sich im [:ssl-cert: Wiki]. Selbstsignierte Zertifikate werden über entsprechende Warnhinweise prinzipiell als verdächtig bzw. unsicher eingestuft und der Client-Zugriff komplett blockiert. Daher müssen selbstsignierte Zertifikate erst im Browser heruntergeladen und über dauerhafte Ausnahmeregeln legitimiert werden. = Links = == intern == * [:ssl-cert:] - selbstsignierte Zertifikate erstellen * [:CA:] - eigene Certification Authority betreiben * [:CAcert:] - Community, die kostenlose TLS-Zertifikate ausstellt * [:Apache/mod_ssl:] - Verwendung von TLS mit dem Webserver Apache * [:certspotter:] - Überwachung von SSL-Zertifikaten == extern == * [wikipedia:SSL-Verschlüsselung: SSL-Verschlüsselung] * [https://certbot.eff.org certbot.eff.org] {en} - Kostenlose Zertifikate von [https://letsencrypt.org Let's Encrypt] {en} * [https://skrilnetz.net/how-to-get-free-ssl-certificates-on-ubuntu/ How to get free SSL certificates on Ubuntu with Let's Encrypt] {en} - Gratis TLS-Zertifikate von Let's Encrypt * [https://misterunknown.de/de/getssl-letsencrypt-ohne-python-client Let's Encrypt mit getssl] {de} * [https://www.ssllabs.com/ssltest/ SSL Server Test] {en} - Online-Prüfung, Qualys SSL Labs * [github:nabla-c0d3/sslyze:SSLyze] {en} - umfangreiche Testsuite für SSL-Server * [https://bettercrypto.org/static/applied-crypto-hardening.pdf Applied Crypto Hardening] {en} {dl} - möglichst sichere TLS-Konfiguration (PDF) * [https://www.my-it-brain.de/wordpress/mein-tls-kochbuch/ TLS/SSL-Kochbuch -- Rezepte für die Verwendung von OpenSSL, HSTS und HPKP] {de} # tag: Internet, Netzwerk, Server, Sicherheit, Verschlüsselung