Inhaltsverzeichnis

Eine eigene Certification Authority (CA) mit OpenSSL unter Linux erstellen

Hintergrund ist, gültige Zertifikate mit einer eigenen Zertifizierungsstelle erstellen zu können, ohne auf die Dienste kommerzieller und teurer Anbieter zurückgreifen zu müssen. Wie man eine erstellte CA auf Benutzer-PCs installiert haben wir in dem entsprechenden Artikel für Sie aufgeschrieben.

Vorbereitung

1. Benötigte Verzeichnisse anlegen:

	./cnf			# Config and Extension Files
	./crl			# Certificate Revocation List
	./crt			# Certificates
	./csr			# Certificate Signing Requests
	./der			# Certificates in DER format
	./key			# Private Keys
	./p12			# User (email) certificates and private keys
	./txt			# Certificates in text format

2. Eine leere CA-„Datenbank“ anlegen (Textdatei):

$ touch index.txt

3. Seriennummer mit 01 initialisieren:

$ echo -ne '00' > serial.txt

4. Das benötigte „Datenbank-Update-Skript“ anlegen:

update-index.pl
#!/usr/bin/perl
 
$openssl = '/usr/bin/openssl';
$crt_filename = $ARGV[0];
$index_filename = "./index.txt";
 
open(OPENSSL, "$openssl x509 -noout -serial -subject -enddate -in $crt_filename |") ||
  die "Can't open $openssl: $!";
 
while(<OPENSSL>) {
  chomp;
  ($key, $value) = split(/\s*=\s*/, $_, 2);
  $key = uc($key);
  if ($key eq "NOTAFTER") {
    ($mon,$day,$time,$year,$stuff) = split(/ +/, $value, 5);
    $time =~ s/://g;
    %Months = ( 'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04',
                'May' => '05', 'Jun' => '06', 'Jul' => '07', 'Aug' => '08',
                'Sep' => '09', 'Oct' => '09', 'Nov' => '11', 'Dec' => '12' );
    $value = sprintf(qq[%s%02d%02d${time}Z], substr($year,2,2), $Months{$mon}, $day);
  }
  #printf(qq[%s="%s"\n], $key, $value);
  $$key = $value;
}
close(OPENSSL);
 
open(DB, ">> $index_filename") || die "Can't open $index_filename: $!";
print DB "V\t$NOTAFTER\t\t$SERIAL\tunknown\t$SUBJECT\n";
close(DB);
 
print "Data Base Updated\n";

Das CA-Root-Zertifikat erstellen

1a. Schlüsseldatei unverschlüsselt anlegen (NICHT EMPFOHLEN!)

$ openssl genrsa -out key/CA-root.pem 4096

1b. Schlüsseldatei verschlüsselt anlegen (DRINGEND EMPFOHLEN!)

$ openssl genrsa -des3 -out key/CA-root.pem 4096

2. Certificate Signing Request (CSR) erstellen

$ openssl req -config cnf/ca.cnf -new -key key/CA-root.pem -out csr/CA-root.csr

3. Zertifikat erstellen (gültig für 50 Jahre)

$ openssl x509 -days 18262 -extfile cnf/ca.ext -set_serial 0 -signkey key/CA-root.pem -in csr/CA-root.csr -req -out crt/CA-root.pem

4. CA Root Zertifikat in die Datenbank eintragen

$ ./update-index.pl crt/CA-root.pem

Server-Zertifikat erstellen

Wird z.B. für Webserver-SSL benötigt.

1. Schlüsseldatei anlegen

$ openssl genrsa -out key/srv.pem 4096

2. Certificate Signing Request (CSR) erzeugen

$ openssl req -config cnf/srv.cnf -new -key key/srv.pem -out csr/srv.csr

3. Zertifikat anlegen (für ein Jahr gültig)

$ openssl x509 -days 365 -extfile cnf/srv.ext -CA crt/CA-root.pem -CAkey key/CA-root.pem -CAserial serial.txt -in csr/srv.csr -req -out crt/srv.pem

4. Neues Zertifikat der Datenbank hinzufügen

$ ./update-index.pl crt/srv.pem

Client-Zertifikat erstellen

Wird z.B. für E-Mail-Verschlüsselung mit S/MIME benötigt.

1. Schlüsseldatei erzeugen

$ openssl genrsa -out key/user.pem 4096

2. Certificate Signing Request (CSR) erzeugen

$ openssl req -config cnf/user.cnf -new -key key/user.pem -out csr/user.csr

3. Zertifikat anlegen (für ein Jahr gültig)

$ openssl x509 -days 365 -extfile cnf/user.ext -CA crt/CA-root.pem -CAkey key/CA-root.pem -CAserial serial.txt -in csr/srv.csr -req -out crt/user.pem

4. Zertifikat und private Schlüsseldatei in eine Datei verpacken

$ openssl pkcs12 -export -in crt/user.pem -inkey key/user.pem -out p12/user.p12

5. Client-Zertifikat der Datenbank hinzufügen

$ ./update-index.pl crt/user.pem

Die Zertifikats-Rückruf-Liste Certificate Revocation List (CRL) für gestohlene Zertifikate anlegen

$ openssl ca -config cnf/crl.cnf -gencrl -out crl/CA-revoke.crl

Ein Zertifikat zurückrufen

$ openssl ca -config cnf/crl.cnf -revoke crt/name.crt

WICHTIG: CRL wie im Abschnitt vorher beschrieben erneut erzeugen!

Hilfreiche Kommandos für OpenSSL

1. Zertifikat als Textausgabe speichern

$ openssl x509 -in crt/name.pem -text > txt/name.txt

2. Ein Zertifikat vom PEM- in das DER-Format umwandeln

$ openssl x509 -in crt/name.pem -inform PEM -out der/name.der -outform DER

3. Eine kombinierte CRT-KEY-Datei erstellen (PEM), z.B. für den courier IMAP Server (copy & paste im Texteditor)

-----BEGIN CERTIFICATE-----
(Primary SSL certificate, dir crt)
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
(Your Private Key, dir key)
-----END RSA PRIVATE KEY-----

4. Eine PFX-Datei aus CRT- und KEY-Datei bauen (wird z.B. für IIS benötigt)

$ openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx

SHA 256

Ab 2016 unterstützt der Firefox keine SHA1-Signierte Zertifikate mehr, daher sollten oben genannte Befehle um den Parameter -sha256 ergänzt werden, um SHA2 zu erzwingen.