====== 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 [[comp:net:instca|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:
#!/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() {
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.