Es gibt verschiedene Methoden wie Passwörter oder Zertifikate um sich an einem OpenVPN Server zu authentifizieren. Ich beschreibe in diesem Beitrag wie Zertifikate zur Authentifizierung mittels Easy-RSA 3 generiert werden können.
Ich generiere mir die Schlüssel/Zertifikate immer auf meinem Notebook. Anschließend kopiere ich nur die nötigsten Dateien auf den Server bzw. die Clients. Alle Dateien werden anschließend an einem Sicheren Ort aufbewahrt. Es können natürlich die CA bzw. Schlüssel des Servers auf dem Server generiert und die Schlüssel der Clients auf den Clients generiert werden. Dies sollte auf jeden Fall geschehen, falls keine Sichere Verbindung zum Transferieren der Schlüssel genutzt werden kann. Da ich auf alle meine Geräte direkten Zugriff habe ist dies aber nicht notwendig.
Easy-RSA 3 herunterladen
Zum Generieren benutze ich Easy-RSA, was ein Wrapper für OpenSSL ist um die PKI aufzubauen/Zertifikate auszustellen. Die aktuelle Version 3 kann einfach per git von GitHub heruntergeladen werden.
$ git clone git://github.com/OpenVPN/easy-rsa
Cloning into 'easy-rsa'...
remote: Counting objects: 485, done.
remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
Receiving objects: 100% (485/485), 182.19 KiB | 0 bytes/s, done.
Resolving deltas: 100% (183/183), done.
Checking connectivity... done.
Konfigurationsdatei anlegen
Danach muss in das eigentliche easy-rsa Verzeichnis gewechselt und eine Konfigurationsdatei angelegt werden, wobei die Beispielkonfiguration ein guter Startpunkt ist. Es wird automatisch die Konfigurationsdatei mit dem Namen vars genutzt, falls sie vorhanden ist. Falls eine andere Konfigurationsdatei verwendet werden soll muss diese bei den anschließenden Befehlen mit „–vars=<Pfad-zur-Datei>“ angegeben werden.
$ cd easy-rsa/easyrsa3/ $ cp vars.example vars.com.example.vpn
Nun kann die Konfigurationsdatei folgendermaßen angepasst werden.
Da Raspbian nur OpenVPN in Version 2.3.4 bereitstellt welches noch keine Elliptischen Kurven unterstützt verwende ich RSA. Ich verwende nachfolgende von der Beispielkonfiguration abweichende Parameter.
- EASYRSA muss auf den Pfad zum easyrsa3 Ordner gesetzt werden.
- EASYRSA_PKI gibt das Verzeichnis an in dem alle Dateien für die PKI hinterlegt werden sollen – im Beispiel pki.com.example.vpn im easyrsa3 Ordner.
- EASYRSA_KEY_SIZE setzt die zu verwendende Länge der RSA Schlüssel auf 4096 Bit.
- EASYRSA_DIGEST legt die zu verwendende Hashfunktion auf sha512 fest.
[...] set_var EASYRSA "&amp;lt;path-to-easyrsa3-folder&amp;gt;" [...] set_var EASYRSA_PKI "$EASYRSA/pki.com.example.vpn" [...] set_var EASYRSA_KEY_SIZE 4096 [...] set_var EASYRSA_DIGEST "sha512" [...]
PKI initialisieren
Nun muss zuerst mit nachfolgendem Befehl die PKI initialisiert werden.
$ ./easyrsa init-pki
bzw.
$ ./easyrsa --vars=./vars.com.example.vpn init-pki
falls eine andere Konfigurationsdatei als vars verwendet werden soll.
Im Nachfolgenden werde ich immer den vars-Parameter mit angeben. Falls die Standardkonfigurationsdatei verwendet werden soll kann dieser einfach weggelassen werden. Die Ausgabe sieht dann folgendermaßen aus:
Note: using Easy-RSA configuration from: ./vars.com.example.vpn
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /pki.com.example.vpn
CA Erstellen
Danach kann die CA erstellt werden. Während des Prozesses muss ein Passwort festgelegt werden, mit dem der private Schlüssel geschützt wird sowie eine Bezeichnung der CA angegeben werden.
$ ./easyrsa --vars=./vars.com.example.vpn build-ca Note: using Easy-RSA configuration from: ./vars.com.example.vpn Generating a 4096 bit RSA private key ..........................................++ ........++ writing new private key to '<path-to-easyrsa3-folder>/pki.com.example.vpn/private/ca.key.WIjDvfoFUY' > 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. ----- > Common Name (eg: your user, host, or server name) [Easy-RSA CA]:vpn.example.com CA CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: <path-to-easyrsa3-folder>/pki.com.example.vpn/ca.crt
Schlüssel generieren
Server
Nun können die Schlüssel des Servers sowie die zugehörige Signierungsanfrage an die CA erstellt werden. Dabei kann zur leichteren Identifizierung der Domainname des OpenVPN Servers als Name angegeben werden. Die Schlüssel werden mit dem Parameter nopass generiert, damit beim starten kein Passwort eingeben werden muss. Daher muss der private Schlüssel später unbedingt restriktiv gespeichert werden, denn er kann ohne Passwort verwendet werden. Falls der OpenVPN Server nicht automatisch starten soll kann hier zur erhöhten Sicherheit ein Passwort vergeben werden. Dazu muss der Parameter einfach weggelassen werden. Während des Erstellens wird nach einem Namen gefragt, welcher im Zertifikat abgelegt ist. Dies sollte der Domainname sein, unter dem der OpenVPN Server später erreichbar sein wird.
$ ./easyrsa --vars=./vars.com.example.vpn gen-req server nopass Note: using Easy-RSA configuration from: ./vars.com.example.vpn Generating a 4096 bit RSA private key ..................................++ ...........................++ writing new private key to '<path-to-easyrsa3-folder>/pki.com.example.vpn/private/server.key.mUcY2nIJfI' ----- 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. ----- > Common Name (eg: your user, host, or server name) [server]:vpn.example.com Keypair and certificate request completed. Your files are: req: <path-to-easyrsa3-folder>/pki.com.example.vpn/reqs/server.req key: <path-to-easyrsa3-folder>/pki.com.example.vpn/private/server.key
Falls es mehrere Server gibt kann dieser Schritt für alle Server wiederholt werden.
Clients
Jetzt sollten auch die Schlüssel bzw. Signieranfragen für die Clients generiert werden. Falls keine Sichere Verbindung zu den Clients besteht sollte dies auf den Clients direkt durchgeführt werden. Beim Erstellen wird diesmal nach einem Passwort gefragt, welches später auch bei jedem Verbindungsaufbau des Clients angegeben werden muss. Der Name wird nur zur leichteren Identifizierung der Clients genutzt.
$ ./easyrsa --vars=./vars.com.example.vpngen-req client1 Note: using Easy-RSA configuration from: ./vars.com.example.vpn Generating a 4096 bit RSA private key ............................................................++ .........................................................++ writing new private key to '<path-to-easyrsa3-folder>/pki.com.example.vpn/private/client1.key.zCbtifz8ex' > 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. ----- > Common Name (eg: your user, host, or server name) [client1]: Keypair and certificate request completed. Your files are: req: <path-to-easyrsa3-folder>/pki.com.example.vpn/reqs/client1.req key: <path-to-easyrsa3-folder>/pki.com.example.vpn/private/client1.key
Dieser Schritt muss für alle Clients wiederholt werden
Zertifikate ausstellen
Nun können von diesen Informationen die Zertifikate ausgestellt werden. Falls diese auf einem anderen Gerät als auf dem die CA generiert wurde müssen zuerst die Signierungsanfragen auf diesen Kopiert werden. Diese befinden sich im Unterordner /pki.com.example.vpn/reqs und müssen auch in genau diesen Ordner auf dem Gerät mit dem privaten CA Schlüssel gespeichert werden. Anschließend können die Zertifikate ausgestellt werden.
Server
Für den Server wird das Zertifikat folgendermaßen ausgestellt.
$ ./easyrsa --vars=./vars.com.example.vpn sign-req server server Note: using Easy-RSA configuration from: ./vars.com.example.vpn You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a server certificate for 3650 days: subject= commonName = vpn.example.com Type the word 'yes' to continue, or any other input to abort. > Confirm request details: yes Using configuration from <path-to-easyrsa3-folder>/openssl-1.0.cnf > Enter pass phrase for <path-to-easyrsa3-folder>/pki.com.example.vpn/private/ca.key: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'vpn.example.com' Certificate is to be certified until Aug 24 22:20:35 2027 GMT (3650 days) Write out database with 1 new entries Data Base Updated Certificate created at: <path-to-easyrsa3-folder>/pki.com.example.vpn/issued/server.crt
Clients
Für die Clients kann das Zertifikat jeweils mit nachfolgendem Befehl generiert werden.
$ ./easyrsa --vars=./vars.com.example.vpn sign-req client client1 Note: using Easy-RSA configuration from: ./vars.com.example.vpn You are about to sign the following certificate. Please check over the details shown below for accuracy. Note that this request has not been cryptographically verified. Please be sure it came from a trusted source or that you have verified the request checksum with the sender. Request subject, to be signed as a client certificate for 3650 days: subject= commonName = client1 Type the word 'yes' to continue, or any other input to abort. > Confirm request details: yes Using configuration from //openssl-1.0.cnf > Enter pass phrase for <path-to-easyrsa3-folder>/pki.com.example.vpn/private/ca.key: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'client1' Certificate is to be certified until Aug 24 22:17:54 2027 GMT (3650 days) Write out database with 1 new entries Data Base Updated Certificate created at: <path-to-easyrsa3-folder>/pki.com.example.vpn/issued/client1.crt
CRL generieren
Nun kann noch eine leere CRL (Certificate Revocation List) generiert werden. Diese beinhaltet die Zertifikate welche erfolgreich ausgestellt wurden aber nicht mehr länger gültig sind.
./easyrsa --vars=./vars.com.example.vpn gen-crl Note: using Easy-RSA configuration from: ./vars.com.example.vpn Using configuration from <path-to-easyrsa3-folder>/openssl-1.0.cnf > Enter pass phrase for <path-to-easyrsa3-folder>/pki.com.example.vpn/private/ca.key: An updated CRL has been created. CRL file: <path-to-easyrsa3-folder>/pki.com.example.vpn/crl.pem
Mit nachfolgendem Befehl kann die CRL in einem für Menschen lesbaren Format ausgegeben werden. Die gerade generierte CRL sollte keine Revozierte Zertifikate enthalten.
$ openssl crl -inform PEM -text -in pki.com.example.vpn/crl.pem
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha512WithRSAEncryption
Issuer: /CN=vpn.example.com CA
Last Update: Aug 25 18:44:56 2017 GMT
Next Update: May 21 18:44:56 2017 GMT
CRL extensions:
X509v3 Authority Key Identifier:
keyid:D3:E4:B3:6F:05:23:A8:C3:AB:19:03:E7:C0:61:33:F1:E2:56:AB:34
DirName:/CN=vpn.example.com CA
serial:E4:C3:B1:45:E1:F0:A3:28
No Revoked Certificates.
Signature Algorithm: sha512WithRSAEncryption
41:0b:4e:70:41:fd:ba:3b:fb:45:6b:61:62:f7:99:33:98:30:
[...]
-----BEGIN X509 CRL-----
MIICzzCBuAIBATANBgkqhkiG9w0BAQ0FADAoMSYwJAYDVQQDDB12cG4uZGFybXN0
[...]
-----END X509 CRL-----
Diffie-Hellman Parameter generieren
Jetzt müssen noch die Diffie-Hellman Parameter generiert werden, was einige Zeit in Anspruch nimmt. Sie werden mit folgendem Befehl generiert.
$ ./easyrsa --vars=./vars.com.example.vpn gen-dh
Note: using Easy-RSA configuration from: ./vars.com.example.vpn
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
....................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................+......................................................................................................+................................+......................................................................................................................................................................+.......................................+............................................................................................................................+.............................................................................................................................+......................................................................................
[...]
DH parameters of size 4096 created at <path-to-easyrsa3-folder>/pki.com.example.vpn/dh.pem
Dateien auf Geräte kopieren
Jetzt müssen die Dateien noch auf den Server bzw. die Clients kopiert werden.
Server
Der Server benötigt folgende Dateien (Die Pfadangabe bezieht sich auf den pki.com.example.vpn Ordner im easyrsa3 Ordner):
- private/server.key
- issued/server.crt
- crl.pem
- ca.crt
- dh.pem
Clients
Die Clients benötigt folgende Dateien (Die Pfadangabe bezieht sich auch hier auf den pki.com.example.vpn Ordner im easyrsa3 Ordner):
- issued/client1.crt
- private/client1.key
- ca.crt
OpenVPN Konfiguration
Jetzt muss nur noch OpenVPN auf den Servern bzw. Clients installiert und konfiguriert werden.