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.
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(<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";
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
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
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
$ openssl ca -config cnf/crl.cnf -gencrl -out crl/CA-revoke.crl
$ openssl ca -config cnf/crl.cnf -revoke crt/name.crt
WICHTIG: CRL wie im Abschnitt vorher beschrieben erneut erzeugen!
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
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.