PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SSL/TLS - Mini FAQ


bl0bb
19.03.2013, 20:48
Also wenn ich hier in manchen Beiträgen lese:

"https brauche ich nicht für mein Projekt"
"https ist unnütz"
"https *!?***!"

Leute, also mal ehrlich - da dreht sich mir der Magen um.

Klar braucht man es nicht. Aber es gibt so viele Dinge auf der Welt die keine Sau braucht. Und SSL zählt definitiv nicht dazu.

Daher ist es schon schön es anzubieten, um den sicherheitsbewußten User entgegen zu kommen. Man könnte den User sogar zwingen es zu nutzen, aber das wäre auch nicht die feine Englische.

Und das Gute ist, jeder Browser und Client kommt damit klar. Sogar die aus dem letzten Jahrhundert. Zumindest ist mir noch kein Client begegnet der es nicht kann. Und sollte es so einen geben, dann gehört der eh gebannt.
(OK, einige ältere Clienten haben Probleme mit einem SSL-RSS Feed, aber das sollte man verschmerzen können.)


Was ist SSL/TLS?

Es ist ein hybrides Verschlüsselungsprotokoll zur sicheren Datenübertragung im Netz.
Nur wird SSL (Secure Sockets Layer) seit geraumer Zeit unter dem Akronym TLS (Transport Layer Security) weiterentwickelt.
Der gesamte Datenverkehr (HTTP, FTP, POP, usw.) wird verschlüsselt (Verbindungsaufbau, Handshake, Datenübertragung, ...). Es liegt nichts mehr im Klartext vor, und ein erfolgreiches Sniffing wird schon recht schwer (man muss schon auf einer der beiden Seiten "anwesend" sein).

Wer mehr Details haben möchte, kann ruhig die Suchmaschine seiner Wahl fragen.


Gibt es potentielle Schwachstellen?

Ja, gibt es!
Nicht alle SSL/TLS Versionen und Ciphers (kryptographische Algorithmen, z.B. AES, DES usw) gelten als sicher. Einige wurden auch schon geknackt. Daher sollte man wissen was man anbietet, und was besser nicht.

Durch diese Schwachstellen wird sniffen wieder möglich (Man-in-the-middle, BEAST Attack).


Gibt es weitere Nachteile?

Auch hier gibt es ein Ja ;)

Der Server wird etwas mehr strapaziert. Aber dieser Lastzuwachs ist minimal und kann daher vernachlässigt werden.
OK, bei sehr großen Projekten mit vielen Hits, muss man schon splitten. Aber ich glaube kaum, dass hier jemand so ein Projekt fährt.
Ich selber habe bei 100k requests/min keine nennenswerte Belastung festgestellt.
Um Zugriff auf die neuesten Protokolle zu haben, muss man OpenSSL selber kompilieren, da die diversen Packages doch ziemlich veraltet sind. Aber wie das geht, erkläre ich weiter unten.

Irgendeine SSL/TLS Empfehlung?

TLSv1.2
TLSv1.1
TLSv1 *
SSLv3 *

* Diese Protokolle sollten in naher Zukunft deaktiviert werden, da eine RC4 Schwachstelle aufgetaucht ist. Aber zurzeit ist dieser Exploit noch zu unpraktikabel, und es wird wohl auch noch eine Weile dauern, bis ein wirksamer Angriff möglich ist. Das Problem ist jedoch, dass viele Browser der Zeit wie immer hinterherhinken, und TLSv1.1/TLSv1.2 noch nicht unterstützen.


Irgendeine Cipher Empfehlung?

RC4:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!MD5:!aNULL:!eNULL:!NULL:!EDH:!EXPORT

>> Erklärung hier << (http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS)

Diese Cipher Sammlung ist mein persönlicher Geschmack. Jeder kann (und sollte) selber etwas experimentieren ;)


Wie kompiliere ich OpenSSL?

Das Beispiel ist jetzt für Squeeze. Andere Distributionen können von den Befehlen abweichen.

wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
tar -xzf openssl-1.0.1e.tar.gz
cd openssl-1.0.1e
./config --prefix=/usr zlib-dynamic --openssldir=/etc/ssl shared
make
make test
make install

Kommt es zu Fehlern einfach lesen und eventuelle Abhängigkeiten installieren. Allerdings sollte es zu 99% ohne Fehler durchlaufen.

Mit
openssl version
kann man den Erfolg der Installation prüfen.


Aktuelle Infos und Quelldateien gibt es hier: OpenSSL Project (http://www.openssl.org/)
OpenSSL Binaries für Win: Win32 OpenSSL (http://slproweb.com/products/Win32OpenSSL.html)


Wie erstelle ich ein Zertifikat?

Ein paar Infos gibt es hier (http://www.openssl.org/docs/HOWTO/). Auch das Netz bietet zig Anleitungen.


Zuerst erstellen wir einen Private Key (RSA mit 4096bits ohne Passwort, da dies für einen Webserver ungeeignet wäre)

openssl genrsa -out priv.key 4096

Output:
Generating RSA private key, 4096 bit long modulus
...............................................................................................++
............................................................................................................................................................................................++
e is 65537 (0x10001)


Nun wird ein Certificate Signing Request erstellt

openssl req -new -key priv.key -out cert.csr

Bis auf Common Name (MUSS wirklich eure FQDN sein!) "kann" alles leer gelassen werden.
Die 'extra' attributes sollten leer bleiben, aber probiert es selber aus ;)

Output:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


Nun müsst ihr entscheiden. Entweder bedient ihr euch eines offiziellen Zertifiziers (Root Certificate Authority), oder ihr stellt ein selbstsigniertes Zertifikat aus (bei dem jeder Browser meckern sollte).


selbstsigniertes Zertifikat

openssl req -x509 -key priv.key -in cert.csr -out selfsigned.crt -days 365


Root Certificate Authority

Diese bietet euch in der Regel auch Möglichkeiten an, einen Private Key und ein Certificate Signing Request vor Ort zu erstellen.
Jedenfalls übernimmt sie die Erstellung des Zertifikats, welches ihr danach herunterladen könnt.
Um Problemen in der Zertifizierungskette (chain issues) vorzubeugen, solltet ihr euch das Primary CA Zertifikat (auf alle Fälle nicht das Root CA des Zertifizierers) herunterladen, und mit eurem frisch erstellten Zertifikat vereinen.

cat own.crt root.certificate.authority.primary.ca.pem > unified-certs.crt


Es kann sein, dass ihr händisch (z.B. nano) zwischen den beiden Zertifikaten einen Zeilenumbruch einfügen müsst, da sonst der Webserver meckert.
Also einfach mal das unified-certs.crt ansehen, und wenn da sowas steht wie
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
einen Linebreak einfügen
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----


!!! Und bitte euren Key etc. nicht in euer Webverzeichnis packen, sondern hübsch irgendwo anders hin ;)


Beispiel nginx

>> mehr Infos << (http://wiki.nginx.org/HttpSslModule)

listen 443 ssl;

...

ssl on;
ssl_certificate /path/to/unified-certs.crt;
ssl_certificate_key /path/to/priv.key;

ssl_session_timeout 5m;
ssl_session_cache shared:SSL:5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers RC4:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!MD5:!aNULL:!eNULL:!NULL:!EDH:!EXPORT;
ssl_prefer_server_ciphers on;

...


Beispiel Apache

>> mehr Infos hier << (http://httpd.apache.org/docs/2.0/ssl/) und >> hier << (http://httpd.apache.org/docs/2.2/mod/mod_ssl.html)

<VirtualHost *:443>
...

SSLEngine on
SSLCertificateFile /path/to/unified-certs.crt
SSLCertificateKeyFile /path/to/priv.key

SSLProtocol all -SSLv2
SSLCipherSuite RC4:ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:HIGH:MEDIUM:!MD5:!aNULL:!eNULL:!NULL:!EDH:!EXPORT
SSLHonorCipherOrder on

...
</VirtualHost>


Kann ich die Qualität meines Zertifkates irgendwo prüfen?

Ja, und zwar >> hier << (https://www.ssllabs.com/)



So ich denke das sollte reichen mit der Mini - FAQ ;)


Viel Spaß

Flori12345
19.03.2013, 21:06
jo supi dann is ja alles gesagt