RSA Schlüssel mit openSSL erstellen & Apach2 mit SSL

Heute wollte ich euch eine kurze Einführung in die RSA Schlüsselerstellung mit openSSL geben und wie ihr ein selbstsigniertes Zertifikat erstellen könnt. Zunächst benötigt ihr eine openSSL Version, welche ihr auf www.openssl.org downloaden könnt. Für Windows könnt ihr euch den Installer laden oder eben openSSL mit Cygwin installieren. Für Linux gibt es fertige Binaries oder halt direkt die Source, welche ihr noch kompilieren müsst (solltet auch fertige Pakete mit dem Paket-Manager installieren können). Auf eurem Mac sollte openSSL bereits installiert sein, war bei mir jedenfalls der Fall ;) Jetzt solltet ihr euch überlegen, wie gut bzw. stark eure Verschlüsselung sein sollte, ich empfehle mindestens eine Stärke von 1024 Bit, würde aber ehrlichgesagt nicht weniger als 2048 Bit nehmen. Habt ihr euch nun entschieden, könnt ihr einen privaten Schlüssel mit folgendem Befehl erstellen (alle Befehle werden im Terminal / in der Konsole eingegeben):

openssl genrsa -out private.pem 2048
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAvCcZl5vg1m5dcS/e8RhZoSGTg+TUaW9PiwE0hgH+E9rToak3
m9TpvVNIWxCnLpCI27yQPg4EmjEcLkfViwZU6DfsERExMlTBkulkruoyfBZ7PchT
xDS83nIp6iHc/wnqH/UemtbQ7r7ePmGU9/zguxBSfg0YFkkitJaJCbjVyHvTN50i
bP000NK+vsSoWjV+E+1ThbT9rXwwP2jqCBNWesqhCjTRFznUlD8KU4wVxy7zUTJt
O7fP1IFjCx9rZBGZdTyh7ttsSBcSzQmzhchjD5COW+wa69xt+TJVGZCiZRmFozS8
YYVWkfIOXopke09BPXjl5xINhLycXuEnPTZMeQIDAQABAoIBAQCseALjkEV3Cc+p
s0HfKnzuUMLRwe5bf2cgekhVFnp6ZLpdk6mftHlVzIOkxg0Zh++LzLtDxsG9PYsh
eUNrnrAx9SD1PBcmlb6jFkHufEsup8TsizcNwXHnTirRrZzQQ5xTEvOs54C5eEhs
UjKlZy3xCzMyzHnp47xmYR7YxI9ip1wGFF7hCuvQkkSglbwbt3fOWyF83wg6Cfs0
ilQOnbQBvMFdLaMHcyTb48PKDCEPTntB+FqQc2vP7vWlmRshQlvgJCvwuuftE7CK
ZhLUJKeuu6vl1aDBOE+iwcbGwrTc+yzuIkQwB7nIR/xpIuPPXIzHjRXO/ep+3Afl
R8R5Mi2hAoGBAON6/riiWsrf2u3I31nSGIrQ22lwGEVfJMJ1TgR5QOigDUldoC/g
H0qJUVdcaACrPOynJxlI4m4fzz4WOEB3k+XXproVhERvxO8qYgY/X65x4EBPZtPt
8eSSKQMbBKtj8jW83EJ5aQRF0Dg7DOxBv4brOEwe1+TYlxczeej0qBMlAoGBANO9
4OVMWkXkVA27ru2e+0uv4HljG6VJe41DFHn6k7lcSrKCurEY31r+B+QeB+sYE/hT
sVMcIpsXvqy5C0Rp+7Tq3J6BmljGS/Y3hT95fztqYCLze4qvXYO0Zot+2fwADc/s
jbvjnGc6usRdH9nV7Zj6xlFn8AEFXqdqzCeQ5P3FAoGASUtL3zmQf2V5KLxcGpiz
B6cbyvEvIMrzESSyqoZW/5zyKv1bq5FPA7kS2E8Rw4Vo7+c7lc4CBvGA2MRYA42D
vb6qHbLpFxPcJCNHyjOJJK/UTWRIAWjdU4Q0aqe97Wsak23ymgh8acAEwtlj5Iua
pmILlZsqfLW8mOEhGooZzXECgYBLnlsr6JmwrjtqcCWnzQg33obPMxrTa6vJJjSw
31FUeGZg3BkqWBSkXWaaDDONvRqcq97/LGQbeV5qNueUNjljQiEqJmTl4WONegSH
R6+tm27b7JKpU7mU6J9aoCHfQnGsWPHBMSdRIoNCz3Mpi6H/6UdcGT94Td+g8J4a
Xz+4dQKBgQDIPG8fTPeLBOZbZDANUkgsg+drfS7IHsVu7UDKAbtQPAhf3kCn3CC+
40GJJ0lNPylLWHOupHVScPECm2S5TPBR5yFKIVO/kzjUZbOZCUoZoVYqQKTjYVAI
SPLd9bm/5eA1yz1FHWdiQki5AR7uIUoykuFZt5EDNQEoXVVXzxMMrw==
-----END RSA PRIVATE KEY-----

Optional könnt ihr euren privaten Schlüssel auch noch mit einem Passwort schützen, dazu müsst ihr einfach nur ein "-des3" anfügen und somit ist euer Key auch noch Tripple DSA geschützt.

openssl genrsa  -out mykey.pem 2048 -des3

Sollte dann so aussehen (ohne DSA!):

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

Achtung: Diesen Schlüssel müsst ihr unbedingt geheim halten und solltet ihn unter keinen Umständen an dritte weitergeben! Nun müsst ihr noch einen öffentlichen Schlüssel erstellen, den ihr anderen Personen zur Verfügung stellen könnt bzw. sollt. Dies macht ihr mit folgendem Befehl:

openssl rsa -in private.pem -pubout > public.pem

Ihr solltet dann

writing RSA key

als Bestätigung erhalten.

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvCcZl5vg1m5dcS/e8RhZ
oSGTg+TUaW9PiwE0hgH+E9rToak3m9TpvVNIWxCnLpCI27yQPg4EmjEcLkfViwZU
6DfsERExMlTBkulkruoyfBZ7PchTxDS83nIp6iHc/wnqH/UemtbQ7r7ePmGU9/zg
uxBSfg0YFkkitJaJCbjVyHvTN50ibP000NK+vsSoWjV+E+1ThbT9rXwwP2jqCBNW
esqhCjTRFznUlD8KU4wVxy7zUTJtO7fP1IFjCx9rZBGZdTyh7ttsSBcSzQmzhchj
D5COW+wa69xt+TJVGZCiZRmFozS8YYVWkfIOXopke09BPXjl5xINhLycXuEnPTZM
eQIDAQAB
-----END PUBLIC KEY-----

Nun seid ihr im Besitz eines privaten und eines öffentlichen Schlüssels und könnt bereits Daten ver- und entschlüsseln sowie signieren. Da sich dieser Beitrag nur auf die Erstellung und nicht die Nutzung beschränken soll, werde ich nicht weiter auf das Ver- und Entschlüsseln eingehen. Werde aber dennoch ein Beispiel zum signieren hinterlegen ;) Signaturen bildet man mit Hilfe von Hash-Algorithmen wie z.B. dem md5, sha-1, usw. Da Man hier aber auch nicht sicher gehen kann, das hier nicht etwas verändert wurde und dann einfach ein neuer Hash geniert wurde, verschlüsselt man den zuvor erstellten Hash mit seinem privaten Schlüssel. So kann euer gegenüber fast zu 100% davon ausgehen, das hier nicht manipuliert wurde. Hashs lassen sich von nahezu allen Daten problemlos erstellen. Dies kann Text, Dokumente/Dateien, usw. sein. Ein einfach Beispiel wäre, wir erstellen einen Hash von "iphone24.org" und das geht wie folgt:

echo -n "iphone24.org" | openssl dgst -sha1

output: cbe7ae6caab4a082100b3594df810c92b17b523a

echo -n "iphone24.org" | openssl dgst -md5

output: ebb8fc6e62288cb1fcb299632adcfe21 Jetzt müssen wir den Hash nur noch mit unserem privaten Schlüssel quasi unterzeichnen und das machen wir mit dem Befehl (bitte erst weiterlesen ;))

openssl rsautl -sign -inkey private.pem

Aber Achtung: hier sollte der verschlüsselte Hash noch in eine etwas "bessere Form" gebracht werden, damit er besser verwertet werden kann um evtl. Fehler seitens der Kodierung auszuschließen. Ich schlage hier die Base64 Verschlüsselung vor. Die Base64 Verschlüsselung könnt ihr mit dem Befehl "openssl enc -base64" einleiten. Der komplette Befehl lautet also:

echo -n "iphone24.org" | openssl dgst -sha1 | openssl rsautl -sign -inkey private.pem | openssl enc -base64

Das Ergbnis sieht wie folgt aus (Achtung, hängt von eurem privaten Schlüssel ab ;)):

hL8EuCrgYoPzoHXdCyXPkuYJAcGjfuRjtXbO77CFJtnAMCmLsyYRmuBMUsMrqHzC
Ceh8efNpzrxShxrvTvZD+AfA2FI1OhuibNTgS2ztkK1ZEuMmV/LBO01NrWD8iruq
+jErKmt9NGN7ZQrDRlrw2uxwaa7pVC6KYp9j/fANFtTn14oYwOgO7FFm9iYzReUq
jYPknegNl6XOXPdFW9I1JChTqv7upynYND0eygfmiQ6Fn+WdJ0976Uo3rBQCjE3v
dNS+HCNBR4YeI2UcSagYTDI9AQdtQefa7YdqF1oWhsQa60BMlN1ibM9juyPZuiuG
hyxgl6Qv6PM5VlErJX3KpQ==

Des weiteren kann man noch für SSL/TLC Verbindungen von HTTP-, FTP-Servern selbst signierte Zertifikate erstellen, um den Usern eine geschützte und vertrauensvolle Verbindung zu ermöglichen. Es sei vorweg gesagt, dass solche Zertifikate als unsicher angesehen werden, da diese nicht von einer Vertrauenswürdigen Zertifizierungsdiensteanbieter (Liste mit vertrauenswürdigen ZDA) ausgestellt wurden und somit kann sich ja "jeder" ein Zertifikat erstellen. Die Zertifikate werden nach der x509 Norm erstellt und laufen in der Regel nach einer bestimmten Zeit, z.B. 1 Jahr => 365 Tage, kommt darauf an was man festlegt, ab. Um ein selbst signiertes Zertifikat zu erstellen, benötigen wir den folgenden Befehl:

openssl req -new >  server.csr | openssl rsa -in privkey.pem -out server.key | openssl x509 -in server.csr -out server.crt  -req -signkey server.key -days 365

Als nächstes müssen wir SSL im Apache mit "a2enmod ssl" aktivieren und einen virtuellen Server anlegen, der auf Port 443 horch. Die Dateien server.key und server.crt müssen wir nun noch in unserem virtuellen Host hinterlegen. Meine virtuelle Server-Konfiguration sieht so aus (ich weiß, ein wenig überdimensioniert habe aber eine OpenCA PKI am Laufen und die benötigt ein paar mehr Einstellungen als nötig ;) : Da Wordpress die Config leider nicht fehlerfrei darstellt, könnt ihr diese hier runter laden... Stand: 28.06.2010

 


Neuen Kommentar schreiben

Plain text

  • Keine HTML-Tags erlaubt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • HTML - Zeilenumbrüche und Absätze werden automatisch erzeugt.
By submitting this form, you accept the Mollom privacy policy.