====== 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.