Navigatie overslaan.
Start

Easy RSA

Als je VPNs opzet, site-to-site of VPNs voor clients, dan gebruik je natuurlijk certificaten i.p.v. shared-keys.
Het nadeel is dat dat een dure grap wordt, tenzij je een beetje moeite doet om zelf een PKI infrastructuur op te zetten.
En dat laatste is vrij eenvoudig met "Easy RSA".

"Easy RSA" is een verzameling scripts die gebruik maken van OpenSSL. Met dergelijke scripts is het vrij simpel om een nieuw certificate aan te maken, the signen, te revoken, etc...
"Easy RSA" wordt samen met OpenVPN geleverd, VPN software voor Windows en Linux. (http://www.openvpn.net)

Zie ook hoe ik OpenVPN gebruik om mijn wireless netwerk te beschermen, hier wordt alles nog manueel gedaan: http://www.knudde.be/index.php?page_name=fw_wireless


Setup

In de eerste plaats moet je EasyRSA configureren voor jouw omgeving.
Editeer daarom het "vars" bestand en pas de variabelen aan aan je eigen omgeving. (Land, gemeente, enz...)

Maak je eigen rootcertificate met "./build-ca", of genereer een CSR om te laten signen door een CA naar keuze met "./build-req" of "./build-req-pas".
HINT: CAcert (www.cacert.org) is een Certificate Authority dat gratis certificaten signed eens je voldoende vertrouwd wordt. (Ik ben assurer.)

Eens dit gedaan is kan je eventueel nog een intermediate certificate aanmaken als je verschillende certs wil gebruiken voor verschillende doeleinden, gebruik hiervoor "./build-inter".

Op een OpenVPN server, moet je nog de Diffie-Helman parameters genereren met "./build-dh" en een server key-paar met "./build-key-server".

Proficiat, je hebt nu een werkende PKI!
Denk natuurlijk wel even na over hoe je je root-certs adequaat gaat beveiligen. (Ook de backups ervan.)


Nieuw client cert

Nu dat het servergedeelte klaar is, kan je certificaten genereren voor iedere client door "./build-key <NameOfClientCert>", of "./build-key-pass <NameOfClientCert>" uit te voeren.

Eenvoudig, niet?
Voorbeeld:

argus:/usr/sbin/Easy-RSA# ./build-key Johan.Braeken
Generating a 1024 bit RSA private key
........++++++
..............++++++
writing new private key to 'Johan.Braeken.key'
-----
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) [BE]:
State or Province Name (full name) [Province]:
Locality Name (eg, city) [SomeCity]:
Organization Name (eg, company) [SnakeOilSeller]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [Johan.Braeken]:
Email Address [unreal@knudde.be]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/sbin/Easy-RSA/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'BE'
stateOrProvinceName   :PRINTABLE:'Province'
localityName          :PRINTABLE:'SomeCity'
organizationName      :PRINTABLE:'SnakeOilSeller'
organizationalUnitName:PRINTABLE:''
commonName            :PRINTABLE:'Johan.Braeken'
emailAddress          :IA5STRING:'unreal@knudde.be'
Certificate is to be certified until Feb 11 12:07:23 2018 GMT (3650 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
argus:/usr/sbin/Easy-RSA# 


Revoken

Een certificate kan gerevoked worden door het "./revoke-full<NameOfClientCert>"-commando te gebruiken.
De CRL (crl.pem) wordt automatisch geupdate.

Het is triviaal om ervoor te zorgen dan de geupdate CRL in real-time ergens op een webserver verschijnt zodat de geldigheid van certificaten te allen tijde geverifieerd kan worden.