Zertifikate mittels Easy-RSA 3 zur OpenVPN Authentifizierung generieren

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;amp;lt;path-to-easyrsa3-folder&amp;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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.