April 1, 2013

Am Anfang war das Zertifikat

x509 Zertifikate

Einleitung

Installiert man Dienste auf dem heimischen Arbeitsrechner, kommuniziert man ausschließlich mit localhost oder fürchtet sich nicht vor Datenschnüffeleien ist ein Zertifikat wohl etwas, was man bestenfalls von einer Schulungsmaßnahme erwartet. Sollen mehrere Dienste aber miteinander kommunizieren, sensible Daten wie Passwörter und Nutzdaten austauschen – und dies gar noch über das Internet – so ist es unumgänglich, diese Daten verschlüsselt zu übertragen. Dies kann mit Zertifikaten erreicht werden.

Zunächst werden wir die sogenannte „Certificate Authority“ einrichten. Das Resultat wird ein CA-Zertifikat sowie ein CA-Schlüssel sein. Ersteres kann verwendet werden um Zertifikate zu authentifizieren, letzteres benötigen wir zum unterschreiben aller weiteren Zertifikate, die wir erstellen werden.
Hinweis: Es ist nicht unbedingt nötig bzw. gewünscht eine eigene CA zu implementieren. Wer Geld für Zertifikate zahlen will, kann auf Dienste wie Verizon zurückgreifen, oder auf kostenlose Dienste wie Cacert.org, und den ersten Schritt überspringen.

1. Einrichten der „Certificate Authority“ Zertifikate

Zunächst installieren wir openssl auf dem Rechner und erstellen ein Verzeichnis, in welchem wir unsere Zertifikate speichern werden

aptitude install openssl
cd /etc/ssl

In der Datei /etc/ssl/openssl.cnf muss die Variable dir angepasst werden, etwa so

dir = ./newCA # Where everything is kept

Nun kann es schon losgehen. Wir setzen folgenden Befehl auf der Konsole ab und folgen den Anweisungen

mkdir -p newCA/{certs,crl,private,newcerts}
echo "00" > newCA/serial
touch newCA/index.txt
openssl req -new -keyout newCA/private/caKey.pem -out newCA/careq.pem
  Generating a 1024 bit RSA private key
  ............++++++
  ......................++++++
  writing new private key to 'newCA/private/cakey.pem'
  Enter PEM pass phrase: <super sicheres Passwort>
  Verifying password - Enter PEM pass phrase: <nochmal>
  -----
  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]:DE
  State or Province Name (full name) [Some-State]: Hessen
  Locality Name (eg, city) []: Frankfurt
  Organization Name (eg, company) [Internet Widgits]:whisperedSHOUTS Networks
  Organizational Unit Name (eg, section) []:.
  Common Name (eg, YOUR name) []:whisperedSHOUTS Certificate Authority
  Email Address []:certmaster@whisperedshouts.de
  Please enter the following 'extra' attributes
  to be sent with your certificate request
  A challenge password []:
  An optional company name []:

Es wurde ein neuer Schlüssel im Verzeichnis newCA/private sowie ein Certificate Signing Request im Verzeichnis newCA erstellt. Dieses müssen wir nun selbst signieren

openssl ca -out newCA/caCert.pem -days 1095 -batch -keyfile newCA/private/caKey.pem -selfsign -extensions v3_ca -infiles newCA/careq.pem

2. Ein Certificate Signing Request erstellen

Mit folgendem Kommando erstellen wir ein Certificate Signing Request (csr) für ein neues Zertifikat. Dieser Request wird dann von der Certification Authority genehmigt.

openssl req -new -keyout certKey01.pem -out newreq.pem -days 365
  Generating a 1024 bit RSA private key
  ..................++++++
  ................++++++
  writing new private key to 'certKey01.pem'
  Enter PEM pass phrase: <geheimes Passwort>
  Verifying - Enter PEM pass phrase: <nochmal das geheime Passwort>
  -----
  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]:DE
  State or Province Name (full name) [Some-State]:Hessen
  Locality Name (eg, city) []:Frankfurt
  Organization Name (eg, company) [Internet Widgits]:whisperedSHOUTS Networks
  Organizational Unit Name (eg, section) []:
  Common Name (eg, YOUR name) []:www.whisperedshouts.de
  Email Address []:webmaster@whisperedshouts.de
  Please enter the following 'extra' attributes
  to be sent with your certificate request
  A challenge password []:
  An optional company name []:

2.1 CSR Signieren

Der csr muss nun der Certificate Authority übergeben werden. Auf dieser kann dann mit folgendem Kommando das Zertifikat erstellt und signiert werden:

openssl ca -policy policy_anything -out newCA/certs/cert01.pem -infiles newreq.pemUsing configuration from /usr/lib/ssl/openssl.cnf
  Enter pass phrase for ./CA/private/cakey.pem:
  Check that the request matches the signature
  Signature ok
  Certificate Details:
  Serial Number: 2 (0x2)
  Validity

  Not Before: Nov 15 01:52:54 2008 GMT
  Not After : Nov 15 01:52:54 2009 GMT
  Subject:
  countryName               = DE
  stateOrProvinceName       = Hessen
  localityName              = Frankfurt 
  organizationName          = vt23 Networks
  commonName                = www.whisperedshouts.de
  emailAddress              = mario@whisperedshouts.de
  X509v3 extensions: 
  X509v3 Basic Constraints: 
  CA:FALSE
  Netscape Comment:
  OpenSSL Generated Certificate
  X509v3 Subject Key Identifier:
  18:3A:48:44:CE:64:1C:E4:4F:30:D2:A9:4C:07:9F:84:EB:27:84:B5
  X509v3 Authority Key Identifier:
  keyid:E8:02:7D:44:A2:87:B0:18:7A:E4:5D:4A:18:3A:37:EB:4E:76:08:F0
  Certificate is to be certified until Nov 15 01:52:54 2009 GMT (365 days)
  Sign the certificate? [y/n]:y
  1 out of 1 certificate requests certified, commit? [y/n]y
  Write out database with 1 new entries
  Data Base Updated

3. Zertifikate konvertieren

Eine kurze Übersicht, um Zertifikate zu konvertieren:

Umwandlung von PEM zu DER

openssl x509 –in input.crt –inform PEM –out output.crt –outform DER

Umwandlung von DER zu PEM

openssl x509 –in input.crt –inform DER –out output.crt –outform PEM

Umwandlung Schlüssels von PEM zu DER

openssl rsa –in input.key –inform PEM –out output.key –outform DER

Umwandlung Schlüssels vom DER zu PEM

openssl rsa –in input.key –inform DER –out output.key –outform PEM

Passwort entfernen
(z.B. zur Verwendung in http Server)

openssl rsa -in MYKEY.key >> MYKEY-NOCRYPT.key

Umwandlung Zertifikats + Schlüssel ins pkcs#12 Format
(z.B. für Browser)

openssl pkcs12 -export -in MYCERT.crt -inkey MYKEY.key -out KEYSTORE.p12 -name "Mein Name"

Umwandlung Zertifikats + Schlüssel ins pkcs#12 Format
mit Chain (z.B. für tomcat)

openssl pkcs12 -export -in MYCERT.crt -inkey MYKEY.key -out KEYSTORE.p12 -name "tomcat" -CAfile CA-CERT.crt -chain

Umwandlung von pkcs#12 nach PEM (Zertifikat + Schlüssel)

openssl pkcs12 -in KEYSTORE.pfx -out KEYSTORE.pem -nodes