Zertifikate sperren
Aus OpenVPN Wiki
In Firmen ist es häufig nötig, erstellte Zertifikate wieder einzuziehen, z.B. wenn ein Notebook geklaut wurde oder wenn ein Mitarbeiter geht.
Um sich das Leben einfacher zu machen, gibt es eine CRL (Certificate Revocation List), die überprüft ob ein Zertifikat noch gültig ist. Dabei holt sie sich in Periodischen Abständen ihre Informationen aus der index.txt. Ich mache es absichtlich etwas ausführlicher, um auch Einsteigern, das Leben zu erleichtern.
Wir kopieren uns zuerst die openssl.cnf in ein Arbeitsverzeichnis, wer Probleme mit dem Auffinden hat benutzt 'find'.
Erstellen eines Arbeitsverzeichnises zwecks Übersichtlichkeit
mkdir /opt/sslcnf
Suchen der openssl.cnf (bei mir /etc/ssl/ )
find / -name openssl.cnf
Kopieren ins Arbeitsverzeichnis
cp /etc/ssl/openssl.cnf /opt/sslcnf/
Damit Openssl auch weiß, welche Konfig wir nun verwenden:
export OPENSSL_CONF=/opt/sslcnf/openssl.cnf
Kleiner Nachtrag: Linux hat die Angewohntheit bei neuen Shells den neuen eintrag einfach rauszukicken. Wer sichergehen will, dass immer die OPENSSL_CONF verwendet wird, wechselt nach /etc und legt eine profile.local an in die er dann den "export ..." Befehl hineinschreibt.
Überprüfung, ob OPENSSL_CONF richtig gesettz wurde
env | grep OPENSSL_CONF
Nun erstellen wir uns eine index.txt und serial, falls noch nicht geschehen (sollte aber jeder haben, wenn man sich ans OpenVPN Tutorial gehalten hat)
ovpn:/opt/sslcnf # touch index.txt
ovpn:/opt/sslcnf # touch serial && echo 01 >> serial
Die Serial wird mit jedem erstellten Zertifikat hochgezählt, wir beginnen bei 1 Smile
Dannach gehts weiter mit ein paar Anpassungen der openssl.cnf, dabei gehe ich aber nur auf die Grundlegenden Einstellungen für unsere CRL ein
dir = /opt/sslcnf # Die Variable für unser AV
certs = /pfad zu certs # Wo liegen unsere Certs?
crl_dir = $dir/crl # Da liegt unsere crl
database = $dir/index.txt # Unsere index.txt
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = /pfad zur vpn-ca # unser stammzertifikat
serial = $dir/serial # unsere serial datei
#crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CR
L
crl = $dir/crl.pem # die CRL Datei
private_key = $dir/private/cakey.pem# unser privater Key
RANDFILE = $dir/private/.rand # private random number file
Wollen wir schon ein Zertifikat verbieten, dann machen wir das mit dem Befehl:
ovpn:/opt/sslcnf # openssl ca -revoke /opt/openvpn/certs/client1_cert.pem
Daraufhin ein paar Meldungen und die Bitte, das Passwort für unseren cakey einzugeben:
Using configuration from /opt/openssl.cnf 5194:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=unique_subject Enter pass phrase for /opt/openvpn/certs/vpn-cakey.pem: DEBUG[load_index]: unique_subject = "yes" Adding Entry with serial number 03 to DB for /C=DE/ST=Some-State/L=munic/O=bea/CN=04 Revoking Certificate 03. Data Base Updated
Daraufhin wird die index.txt automatisch erweitert:
R 160515125947Z 060531105703Z 03 unknown /C=DE/ST=Some-State/L=munic/O=bea/CN=04
Das R steht für Revoked, V für Valid und E für Expired.
Nachdem dies geschehen ist, erstellen wir uns die CRL. Mit -crlhours 1 geben wir an, wie oft diese aktualisiert wird (jede Stunde..)
ovpn:/opt/sslcnf # openssl ca -gencrl -crlhours 1 -out crl.pem
Da man mit 'less crl.pem' nur kryptisches gekürzel erhält sehen wir uns die Datei mit folgedem Befehl an:
openssl crl -in crl.pem -noout -text
Das ganze sollte dann ungefähr so aussehen:
Certificate Revocation List (CRL):
Version 1 (0x0)
Signature Algorithm: md5WithRSAEncryption
Issuer: /C=DE/L=munic/O=bea/CN=02
Last Update: May 31 09:29:18 2006 GMT
Next Update: Jun 30 09:29:18 2006 GMT
Revoked Certificates:
Serial Number: 03
Revocation Date: May 31 08:16:21 2006 GMT
Signature Algorithm: md5WithRSAEncryption
12:e3:03:df:55:a0:5b:37:93:8a:48:43:00:c3:fc:b4:e8:fd:
e3:f9:c0:29:2e:da:b6:a8:ef:d1:f0:6b:a9:5b:b6:9c:d9:4c:
df:a1:87:e6:cd:f0:5d:cd:58:25:41:eb:9a:a2:73:ce:41:ae:
1c:82:c5:ba:f6:6b:b8:7a:7b:b8:49:82:cc:63:32:d7:9e:4d:
88:46:86:11:4c:82:1c:58:b8:b7:ad:1a:ca:4c:af:fd:dd:8a:
c1:c3:7f:2d:46:da:24:2c:59:6e:4e:c9:16:a3:79:27:95:82:
dc:7d:44:b3:95:38:0f:71:bf:6f:e3:66:d8:1e:3b:d6:27:14:
94:75:39:51:51:b8:c8:19:9c:8e:22:8b:b7:f0:19:0f:bd:db:
05:24:db:23:e8:25:6a:28:ca:38:cc:ea:3a:ea:0a:c0:51:04:
5f:df:ad:63:58:ca:be:c9:01:2d:e4:40:7a:ba:15:30:04:c5:
1a:e9:7a:cc:2c:05:39:5b:86:46:0a:87:f5:17:15:5e:78:64:
98:6d:25:93:11:39:e5:a7:43:e6:db:f0:21:30:4d:8f:34:e2:
8c:d6:22:c5:68:d9:f6:6a:c9:b7:6f:5c:b0:0b:a5:5e:75:00:
af:65:70:60:8f:05:8e:95:03:10:75:05:06:6d:60:1f:69:1b:
12:68:12:c1
Als letztes sagen wir unserem VPN Server noch, dass wir mit einer CRL Liste arbeiten, die er sich doch bitte ansehen soll. Dazu fügen wir folgende Zeile in die VPN-Konfig
crl-verify /opt/sslcnf/crl.pem
Wenn wir nun mit dem revoke-befehl (siehe oben) Zertifikate aussperren, wird diese in einer Stunde in unsere CRL eingetragen. Wer nicht warten will, erstellt sich nach dem revoke eine neue CRL mit gleichem Namen, die alte wird überschrieben.
Sollte aus Versehen ein Zertifikat gesperrt werden, löscht man den entsprechenden Eintrag aus der index.txt, wartet auf die nächste Aktualisierung oder erstellt die CRL neu.
