Um mehr Sicherheit zu erhalten lege ich die CA in einem Verschlüsselten Verzeichnis an. Siehe
Neues verschlüsseltes Verzeichnis anlegen
encfs ~/.MyCA ~/MyCA
encfs ~/.MyCA ~/MyCA Das Verzeichnis »/home/timo/.MyCA/« existiert nicht. Soll es angelegt werden? (y,N) y Das Verzeichnis »/home/timo/MyCA/« existiert nicht. Soll es angelegt werden? (y,N) y Neuer verschlüsselter Datenträger wird erstellt. Bitte wählen Sie eine der folgenden Optionen: »x« für den Expertenmodus, »p« für den vorkonfigurierten Paranoia-Modus, etwas anderes oder nur Drücken der Eingabetaste wählt den Standardmodus. Standardkonfiguration wurde gewählt. Konfiguration abgeschlossen. Das angelegte Dateisystem hat die folgenden Eigenschaften: Dateisystem Chiffre: "ssl/aes", Version 3:0:2 Dateinamenskodierung: "nameio/block", Version 4:0:2 Schlüssellänge: 192 Bits Blockgröße: 1024 Bytes Jede Datei enthält acht Byte Vorspann mit einmaligen IV Daten. Dateinamensverschlüsselung benutzt IV Verkettungsmodus. Dateilöcher wurden zur verschlüsselten Ausgabe durchgereicht. Nun wird ein Kennwort für das Dateisystem benötigt. Da es keinen Mechanismus zur Wiederherstellung gibt, müssen Sie sich an das Kennwort erinnern! Das Kennwort kann mit encfsctl nächträglich geändert werden. Neues EncFS-Passwort: EncFS-Passwort bestätigen: ?>
Phrase eingeben
Eine gute Beschreibung findet man unter 1)
Ich habe die im System mitgelieferte /usr/lib/ssl/misc/CA.pl nach /usr/lib/ssl/misc/MyCA.pl kopiert und $CATOP, sowie $CADAYS angepasst.
my $CATOP = "./tuxtiCA"; #my $CADAYS = "-days 1095"; # 3 years #my $CADAYS = "-days 1825"; # 5 years my $CADAYS = "-days 7300"; # 20 years
Mit dem MyCA.pl-Skript ist die Erstellung der CA ziemlich einfach. Im Verlauf verschiedener Schritte wird man nach diversen Daten gefragt, die man eingeben kann.
Welche Felder letztendlich vorhanden sein müssen, wird über eine Policy in der OpenSSL-Konfiguration /usr/lib/ssl/openssl.cnf bestimmt. Dort wird festgelegt welche Felder in den signierten Zertifikaten denselben Wert wie im CA-Zertifikat haben müssen, da sie sonst bei der Überprüfung abgelehnt werden. Dort können noch weiter Vorbelegungen gemacht werden.
# For the CA policy [ policy_match ] countryName = match stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
/usr/lib/ssl/misc/MyCA.pl -newca
timo@LinTuxedo:~/MyCA$ /usr/lib/ssl/misc/MyCA.pl -newca CA certificate filename (or enter to create) Making CA certificate ... ==== openssl req -new -keyout ./tuxtiCA/private/cakey.pem -out ./tuxtiCA/careq.pem .......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...........+.....................+...+.+.....+.........+...+..........+..+.+............+...+..+.......+..+.........+.+.....+....+..+.......+..+.+...+......+...........+...+.+...........+..........+..+.+..............+......+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+...+............+....+...+..+.+.....+.......+........+.......+.....+.............+..+......+.+...+...+..+................+......+.....+.............+...+.....+.........+...+.......+...+......+.....+............+....+.....+....+..............+.+..+....+...+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...+.....+....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+......+.............................+.......+.........+.....+.+..+...+...+....+.....+...+....+......+...+.....+................+...+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+......+...........+.......+.....+.......+...+...+...............+.....+...+............+....+...+......+..+.......+.....+.+..............+.+.....+......................+..+.+.................+...+......+.+..+...+....+...........+...+.........+.......+.........+......+......+..............+.+..+......+.....................+...+.......+.....+.............+...+...+...........+....+..+...+.......+...+.....+......+.........+................+...+...........+.......+...+..+...+....+..+...+...+.......+..+....+......+...+......+.....+.+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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) [DE]: State or Province Name (full name) [Thueringen]: Locality Name (eg, city) []:Werra-Suhl-Tal Organization Name (eg, company) [New Narnia Network]: Organizational Unit Name (eg, section) []:Root CA Common Name (e.g. server FQDN or YOUR name) []:tuxti.th Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: ==> 0 ==== ==== openssl ca -create_serial -out ./tuxtiCA/cacert.pem -days 1825 -batch -keyfile ./tuxtiCA/private/cakey.pem -selfsign -extensions v3_ca -infiles ./tuxtiCA/careq.pem Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./tuxtiCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 59:ae:a1:74:ba:5a:26:6f:f5:8b:95:57:24:7f:a7:f8:aa:79:fa:f3 Validity Not Before: Sep 20 09:29:58 2023 GMT Not After : Sep 18 09:29:58 2028 GMT Subject: countryName = DE stateOrProvinceName = Thueringen organizationName = New Narnia Network organizationalUnitName = Root CA commonName = tuxti.th X509v3 extensions: X509v3 Subject Key Identifier: B7:98:25:3C:9A:7A:04:22:A7:64:67:80:96:5C:89:50:24:0E:1F:0C X509v3 Authority Key Identifier: B7:98:25:3C:9A:7A:04:22:A7:64:67:80:96:5C:89:50:24:0E:1F:0C X509v3 Basic Constraints: critical CA:TRUE Certificate is to be certified until Sep 18 09:29:58 2028 GMT (1825 days) Write out database with 1 new entries Data Base Updated ==> 0 ==== CA certificate is in ./tuxtiCA/cacert.pem timo@LinTuxedo:~/MyCA$
Im aktuellen Verzeichnis sollte jetzt ein neues Verzeichnis tuxtiCA mit einigen Dateien und weiteren Unterverzeichnissen entstanden sein.
Folgende davon sind wichtig:
cacert.pem Das öffentliche Zertifikat der CA. Diese Datei sollte auf allen Clients importiert werden. Danach vertrauen diese Clients automatisch allen von der CA ausgestellten Zertifikaten.
certs/ Das Verzeichnis in dem die signierten Zertifikate untergebracht werden.
private/ Das Verzeichnis für die privaten Schlüssel.
private/cakey.pem Der private Schlüssel der CA. Dieser sollte die CA nie verlassen, außer zu Backup-Zwecken. (Und auch dann gesondert gesichert werden.)
index.txt Sogenannte Datenbank der CA mit einer Liste aller ausgestellten Zertifikate und deren Status.
Mit dieser CA fängt man nun an die eigentlichen Zertifikate zu signieren, die man dann bspw. auf seinen Servern einsetzt. Auch hierfür verwendet man das CA.pl-Skript. Das Signieren läuft in zwei Stufen ab. Als erstes erstellt man einen neuen privaten Schlüssel und einen „Zertifikatsantrag“ (CA.pl -newreq). Anschließend signiert man den Zertifikatsantrag (CA.pl -sign). Damit das Skript funktioniert, muss man sich im selben Verzeichnis befinden in dem man auch die CA erstellt hat, also eines oberhalb von tuxtiCA.
Hier wird natürlich eine andere Passphrase für dieses Zertifikat eingegeben,, nicht die der CA.
Per Default werden Zertifikate ohne besonderen Verwendungszweck ausgestellt. Für Webserver empfiehlt es sich allerdings den Zertifikatstyp und Verwendungszweck als zusätzliche X.509 v3-Erweiterungen hinzuzufügen. Dazu muss wieder die OpenSSL-Konfiguration /etc/ssl/openssl.cnf angepasst werden.
... extensions = v3_reg ... [ CA_default ] ... copy_extensions = copy ... # For the CA policy [ policy_match ] countryName = optional stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional ... [ req ] ... req_extensions = v3_req # The extensions to add to a certificate request .. countryName_default = DE ... stateOrProvinceName_default = Thueringen ... 0.organizationName_default = New Narnia Network ... [ usr_cert ] ... nsCertType = server keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth ... [ v3_req ] ... subjectAltName = @alt_names [alt_names] DNS.1 = ns.tuxti.th DNS.2 = ds.tuxti.th DNS.3 = nas.tuxti.th DNS.4 = mail.tuxti.th DNS.5 = www.tuxti.th DNS.6 = wiki.tuxti.th DNS.7 = narnia.tuxti.th DNS.8 = narniacloud.tuxti.th IP.1 = 192.168.178.11 IP.2 = 127.0.0.1 ... [ v3_ca ] ... basicConstraints = critical,CA:true subjectAltName = @alt_names ... [ tsa_config1 ] ... dir = ./tuxtiCA # TSA root directory ...
Der Eintrag
copy_extensions = copy
darf beim erstllen der CA noch nicht vorhanden sein, sonst werden die Alternativen Namen in das Zertifikat der CA eingetragen.
/usr/lib/ssl/misc/MyCA.pl -newreq
timo@LinTuxedo:~/MyCA$ /usr/lib/ssl/misc/MyCA.pl -newreq Use of uninitialized value $1 in concatenation (.) or string at /usr/lib/ssl/misc/MyCA.pl line 145. ==== openssl req -new -keyout newkey.pem -out newreq.pem -days 365 Ignoring -days without -x509; not generating a certificate ......+.+............+..+.........+..........+..+.......+...+..+...+....+........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+..+....+.........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+...+..+..........+...+..+......+............+.......+...+..+......+....+...+........+......+...+...+.........+...+..........+......+...............+.....+.+.........+...........+.........+.+...+...+.....+..........+...+.........+........+...+.........+..........+...+.........+......+...+.....+.........+...+...........................+...+....+...+.....+......+............+...+...............+.+.....+...+..........+..+......+.............+..+.......+...+...+......+...+............+........+...+....+...+..+.+..+.......+........+...+...+.+......+..+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .......+.+..+...+.+......+..+.+.....+....+............+......+.....+...+.+...+.....+......+....+..+....+..+.......+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.........+......+....+...........+......+....+........+......+.+......+.....+...+....+.....+...+.........+.........+..........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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) [DE]: State or Province Name (full name) [Thueringen]: Locality Name (eg, city) []:Fernbreitenbach Organization Name (eg, company) [New Narnia Network]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:nas.tuxti.th Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: ==> 0 ==== Request is in newreq.pem, private key is in newkey.pem timo@LinTuxedo:~/MyCA$
/usr/lib/ssl/misc/MyCA.pl -sign
Die Passphrase im Signierschritt ist natürlich die des privaten CA-Schlüssels,
timo@LinTuxedo:~/MyCA$ /usr/lib/ssl/misc/MyCA.pl -sign ==== openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./tuxtiCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 59:ae:a1:74:ba:5a:26:6f:f5:8b:95:57:24:7f:a7:f8:aa:79:fa:f4 Validity Not Before: Sep 20 09:35:59 2023 GMT Not After : Sep 19 09:35:59 2024 GMT Subject: countryName = DE stateOrProvinceName = Thueringen localityName = Fernbreitenbach organizationName = New Narnia Network commonName = nas.tuxti.th X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: DA:1E:8D:68:98:2F:D9:B9:6C:AC:58:6A:87:98:73:D1:58:F0:2E:32 X509v3 Authority Key Identifier: B7:98:25:3C:9A:7A:04:22:A7:64:67:80:96:5C:89:50:24:0E:1F:0C Certificate is to be certified until Sep 19 09:35:59 2024 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 ==> 0 ==== Signed certificate is in newcert.pem timo@LinTuxedo:~/MyCA$
Im aktuellen Verzeichnis, immer noch das von tuxtiCA übergeordnete, befinden sich jetzt die Dateien:
newreq.pem Zertifikatsantrag
newcert.pem Signiertes öffentliches Zertifikat
newkey.pem Privater Schlüssel
newreq.pem ist inzwischen nutzlos geworden und kann gelöscht werden.
rm newreq.pem
Wichtig sind nur die beiden Dateien newcert.pem und newkey.pem. Diesen sollte man aussagekräftigere Namen geben und sie zur Archivierung in das jeweilige tuxtiCA-Unterverzeichnis verschieben.
Wer das Schlüsselpaar auf einem Server benutzen möchte und nicht bei jedem Server-Start die Passphrase des privaten Schlüssels eingeben will, kann dieses noch vorher aus dem privaten Schlüssel löschen. In diesem Fall sollte man aber auf jeden Fall darauf achten, dass der private Schlüssel ohne Passphrase durch restriktive Dateirechte auf dem Server vor neugierigen Blicken geschützt wird:
openssl rsa -in newkey.pem -out newkey-without-password.pem
oder
openssl rsa -in newkey.pem -out tuxtiCA/private/narniacloud.tuxti.th_key.pem && rm newkey.pem
timo@LinTuxedo:~/MyCA$ openssl rsa -in newkey.pem -out newkey-without-password.pem Enter pass phrase for newkey.pem: writing RSA key
mv newkey-without-password.pem tuxtiCA/private/narniacloud.tuxti.th_key.pem
mv newcert.pem tuxtiCA/certs/narniacloud.tuxti.th_cert.pem
Diese zwei Dateien sind es auch, die der betreffende Server zum SSL-Betrieb benötigt. Die Datei newkey.pem kann jetzt ebenfalls gelöscht werden (nachdem man sich davon überzeugt hat, dass mit der Umwandlung alles geklappt hat, und narniacloud.tuxti.th_key.pem nicht etwa leer ist).
Auser Sie wurde gleich mit dem Umwandeln gelöscht. (Variante 2)
rm newkey.pem
CA-Zertifikate sind entweder bereits im Betriebssystem vorinstalliert (für allgemein anerkannte CAs), oder müssen von der Webseite der CA heruntergeladen und manuell installiert werden. In diesem Fall sollte das CA-Zertifikat sorgfältig geprüft werden, z.B. per telefonischem Abgleich des Fingerprints.
Abgesehen davon, dass man Zertifikate auch als einfacher Benutzer über Importfunktionen oder Konfigurationsdirektiven in den diversen Client-Programmen nutzen kann, kann man ein CA-Zertifikat auch systemweit installieren. Als erstes muss man dafür die CA-Zertifikatsdatei im .pem-Format, aber mit der .crt Endung nach /usr/local/share/ca-certificates/ kopieren. Am Besten denkt man sich ggf. noch einen aussagekräftigeren Namen für die Datei aus, z.B. organisationsname.crt. Wichtig ist aber, dass die Dateiendung .crt verwendet wird. Dann wird folgender Befehl ausgeführt:
sudo dpkg-reconfigure ca-certificates
Auf die Frage ob neue Zertifikate akzeptiert werden sollen, antwortet man entweder mit „Ja“, dann wird das neue Zertifikat ohne weitere Rückfrage in die Liste aufgenommen
Bei allen Zertifikaten in /usr/local/share/ca-certificates/ wird davon ausgegangen, dass diese nachträglich manuell hinzugefügt wurden und daher auf jeden Fall mit installiert werden sollen.
Für das Löschen von CAs gilt dasselbe wie für das Hinzufügen von CAs in Ubuntu. Wegen der Vielzahl an Möglichkeiten an welchem Ort CAs im System hinterlegt werden können, bezieht sich das Löschen hier nur auf CA-Zertifikate unterhalb von /etc/ssl/certs/ und solche die über Update-Hooks in /etc/ca-certificates/update.d/ verwaltet werden.
Um selbst installierte CA-Zertifikate zu entfernen, müssen diese zunächst aus dem Verzeichnis /usr/local/share/ca-certificates/ gelöscht werden. Anschließend ruft man folgenden Befehl auf:
sudo dpkg-reconfigure ca-certificates
Die Einstellungen von Firefox aufrufen.
Datenschutz & Sicherheit auswählen
Scrollen bis Zertifikate
Zertifikate anzeigen
Reiter Zertifizierungsstelle auswählen und auf Importieren klicken
Hier das Zertifikat der CA (Standartname cacert.pem öffnen.
Dann noch die Häkchen für das vertrauen wählen.
Hier am Beispiel Android 13
Für Android wird das Zertifikat der CA im .crt Format benötigt. (siehe unten: „Hilfreiche Befehle“)
Wenn der Firefox das Zertifikat nicht annimmt, muss die Verwendung von Drittanbieter-CA-Zertifikaten in Firefox aktiviert werden.
Gehe dazu in die Einstellungen > Über Firefox. Tippe fünf Mal auf das Firefox-Logo. Gehe zurück in die Einstellungen und du siehst einen neuen Menü-Eintrag: Secret Settings. Dort gibt es die Option „Use third party CA certificates“. Diese muss aktiviert sein.
Manchmal kann es nötig sein ein Zertifikat zu widerrufenen.
Die Zertifikats sperren wir durch den Aufruf:
openssl ca -revoke userCert.pem (z.B.nas.tuxti.th_cert.pem)
Er markiert in der index.txt das entsprechende Zertifikat als ungültig, was allerdings erst bei der nächsten Aktualisierung der CRL zum Tragen kommt.
Wenn die Zertifikatsdatei nicht mehr vorhanden ist kann man auch die Seriennummer nutzen.
Alle erstellten Zertifikate werden in der index.txt aufgelistet. Dort findet man auch die Seriennummer. Mit dieser und dem Befehl openssl ca -revoke, kann das Zertifikat widerrufen werden.
openssl ca -revoke tuxtiCA/newcerts/20DF70641DC738C6F6B76E2B5CF2A8890505B53E.pem
timo@LinTuxedo:~/MyCA$ openssl ca -revoke tuxtiCA/newcerts/20DF70641DC738C6F6B76E2B5CF2A8890505B53E.pem Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./tuxtiCA/private/cakey.pem: Revoking Certificate 20DF70641DC738C6F6B76E2B5CF2A8890505B53E. Data Base Updated timo@LinTuxedo:~/MyCA$
Das wiederrrufene Zertifikat wird dann in der index.txt mit einem R gekennzeichnet.
Beispiel:
V 280916184227Z 20DF70641DC738C6F6B76E2B5CF2A8890505B53D unknown /C=DE/ST=Th\xC3\x83\xC2\xBCringen/O=New Narnia/CN=tuxti.th R 240917185154Z 230918195037Z 20DF70641DC738C6F6B76E2B5CF2A8890505B53E unknown /C=DE/ST=Th\xC3\x83\xC2\xBCringen/L=Werra-Suhl-Tal/O=Internet Widgits Pty Ltd/CN=nas.tuxti.th V 240917194102Z 20DF70641DC738C6F6B76E2B5CF2A8890505B53F unknown /C=DE/ST=Thueringen/L=Werra-Suhl-Tal/O=New Narnia Network/CN=nas.tuxti.th
Die CRL generieren wir als CA mit:
openssl ca -gencrl -out crl/crl.pem
timo@LinTuxedo:~/MyCA$ openssl ca -gencrl -out tuxtiCA/crl/crl.pem Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./tuxtiCA/private/cakey.pem:
Zertifikat anzeigen lassen:
openssl x509 -in tuxtiCA/certs/ds.tuxti.th_cert.pem -noout -text
Alle Zertifiakte des Systems anzeigen:
locate .pem | grep "\.pem$" | xargs -I{} openssl x509 -issuer -enddate -noout -in {}
Ein .pem Zertifikat in das .crt Format wandeln
openssl x509 -outform der -in cacert.pem -out cacert.crt
Eine gute Beschreibung zu Openssl findet man unter x509v3_config DESCRIPTION