Cryptographie et tunnel OpenVPN
08/02/2005
 Christian CALECA 
Liste des cours

OpenSSL

Accueil ] [ Avant propos ] [ Les clés du chiffrement ] [ Méthodes ] [ OpenVPN simple ] [ OpenSSL ] [ Tunnel sécurisé ] [ Applications ]


Un petit peu de sadisme

Il existe avec OpenVPN une solution extrêmement simple pour sécuriser un tunnel, en utilisant une clé symétrique (et statique) pré-partagée.

Il suffit d'utiliser la commande :

cyclope:~# openvpn --genkey --secret shared.key

Vous obtenez ainsi un fichier ASCII nommé shared.key, qui a cette allure :

cyclope:~# cat shared.key
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
37e871e611c48178a684b1aac3c42d1a
4682db3c5703056643382b6ae43da0d4
afe7ada90f2506d291cc26848afb05e7
1f1ec55y8b2df1d2b73ey8842baf5a23
edc6d3b28f017c8c78d545e1cd5b40af
f9a76d537941c6e5ab4eabc866160511
10f7774686cye882b603673288b56713
a48a7859959cea87b87273019751b867
c0b5dae293d5259a2170f36ecf19d94c
9c5c39a7fa7df03827bc0fa3b140eb76
129f5d7f8f14f7bea2cbyf13cfc2ef4b
752426d77ab677065bcd8af84878b477
c47aef5628eaa8bb6e706e93252ey576
5aae05bc0f58626811d020f8f6106c97
cf69114ab0504473yc2adcdd9b1008e6
315d3073c6d5e2feef24e138af86e397
-----END OpenVPN Static key V1-----

Il vous suffit alors de transporter une copie de cette clé à l'autre bout de tunnel par un moyen sûr ("scp", par exemple, qui utilise lui-même un système cryptographique, le même que SSH), et de bâtir le tunnel de manière à ce qu'il utilise cette clé pour le chiffrement des données.

C'est simple, ça fonctionne et comme c'est vous qui avez généré la clé et qui l'avez transportée à l'autre bout, vous êtes par le fait sûr de l'authenticité.

Oui mais voilà, c'est trop simple. Nous ne ferons donc pas comme ça, nous utiliserons plutôt un système de certificats avec SSL.

La stratégie

Nous allons créer une autorité de certification rien que pour nous, sur AARON. Cette autorité permettra de gérer les clés et certificats nécessaires aux clients qui utiliseront le tunnel.

Pour l'instant, tout se passe donc sur AARON. Nous allons utiliser openssl comme une recette de cuisine, pour ne pas trop compliquer cet exposé.

D'abord, il faut s'assurer que la librairie est installée :

aaron:~# dpkg -l openssl
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name               Version            Description
+++-==================-==================-====================================================
ii  openssl            0.9.7d-3           Secure Socket Layer (SSL) binary and related cryptog
aaron:~#

Elle y est. Sinon :

aaron:~# apt-get install openssl.

Un certificat autosigné

Comme AARON sera l'autorité, il va se signer lui-même son certificat. Théoriquement, ça n'a pas de valeur, mais ici, c'est nous le tiers de confiance et nous savons qui nous sommes.

aaron:~# openssl req -nodes -new -x509 -keyout aaron-ca.key -out aaron-ca.crt
Generating a 1024 bit RSA private key
........................................................++++++
.....++++++
writing new private key to 'aaron-ca.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) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:Marseille
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrg
Organizational Unit Name (eg, section) []:admin
Common Name (eg, YOUR name) []:Supervisor
Email Address []:supervisor@yahoo.fr
aaron:~#

A l'issue de cette opération, nous retrouvons bien aaron-ca.key et aaron-ca.crt dans notre répertoire courant.

Répétons-le encore une fois, parce que ce n'est pas si simple à bien comprendre :

Un jeu de clés

Maintenant, il faut se construire une  clé privée  et une demande de certificat pour AARON :

aaron:~# openssl req -nodes -new -keyout aaron.key -out aaron.csr

aaron.key sera la clé privée et aaron.csr sera en fait un certificat à faire contresigner par l'autorité, par AARON lui-même, donc.

Generating a 1024 bit RSA private key
.........++++++
...........++++++
writing new private key to 'aaron.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) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:Marseille
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrg
Organizational Unit Name (eg, section) []:admin
Common Name (eg, YOUR name) []:Supervisor
Email Address []:supervisor@yahoo.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:lageducapitaine
An optional company name []:
aaron:~#

Voilà. Nous disposons maintenant d'une clé privée (aaron.key) et d'un candidat à la certification (aaron.csr) pour AARON

aaron.csr n'est pas encore un certificat, il n'est qu'une demande de certification qui devra être approuvée par l'autorité (c'est à dire par AARON lui même, dans ce cas précis).

AARON contresigne

AARON, en bon maître absolu, va maintenant approuver son propre certificat. Seulement ici, les recettes de cuisine ne vont pas fonctionner sans précautions préalables. Il nous faut donc mettre un peu les mains dans le cambouis d'openssl.

openssl s'appuie sur un fichier de configuration qui, dans la Debian, se trouve sous /etc/ssl/openssl.cnf. Il y a dans ce fichier une foule de paramètres, qui seront pris par défaut pour diverses opérations si ces paramètres ne sont pas outrepassés par la ligne de commande. Il y a tellement de paramètres qu'il n'est pas humainement possible de se passer de ce fichier de configuration.

Dans l'opération qui va suivre, nous aurons besoin de vérifier cette configuration par défaut et d'adapter un peu notre système en fonction.

La partie utile pour la suite est la suivante :

[ CA_default ]

dir             = ./demoCA              # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#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     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
#crlnumber      = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
...

Nous pourrions modifier la configuration par défaut, mais autant s'y conformer, quitte à faire les choses plus proprement par la suite.

Continuons les recettes :

aaron:~# mkdir demoCA
cd demoCA
aaron:~/demoCA# touch index.txt
aaron:~/demoCA# mkdir newcerts
aaron:~/demoCA# echo "01" > serial

Je vous laisse comprendre ce que nous venons de faire. Passons maintenant à la signature :

aaron:~# openssl ca -cert aaron-ca.crt -keyfile aaron-ca.key -out aaron.crt -in aaron.csr

au moyen de son certificat d'autorité (aaron-ca.crt) et de sa clé privée d'autorité (aaron-ca.key), nous allons approuver la demande de certification aaron.csr, obtenant ainsi un certificat approuvé aaron.crt

Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jun 27 11:15:37 2004 GMT
            Not After : Jun 27 11:15:37 2005 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = France
            organizationName          = MyOrg
            organizationalUnitName    = admin
            commonName                = Supervisor
            emailAddress              = supervisor@yahoo.fr
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                C9:97:59:5A:B1:0D:6C:61:CC:D1:90:79:43:D3:F4:3E:0F:07:38:4C
            X509v3 Authority Key Identifier:
                keyid:AC:F2:A8:DD:56:10:80:AC:C3:F5:6B:F6:29:72:B7:D2:F3:BF:10:86
                DirName:/C=FR/ST=France/L=Marseille/O=MyOrg/OU=admin/CN=Supervisor/emailAddress=supervisor@yahoo.fr
                serial:00

Certificate is to be certified until Jun 27 11:15:37 2005 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
aaron:~#

Et voilà. Par curiosité, allons voir dans ./demoCA :

aaron:~/demoCA# ls -l
total 17
-rw-r--r--    1 root     root          119 Jun 27 13:15 index.txt
-rw-r--r--    1 root     root           21 Jun 27 13:15 index.txt.attr
-rw-r--r--    1 root     root            0 Jun 27 13:15 index.txt.old
drwxr-xr-x    2 root     root           72 Jun 27 13:15 newcerts
-rw-r--r--    1 root     root            3 Jun 27 13:15 serial
-rw-r--r--    1 root     root            3 Jun 27 13:15 serial.old

il y a des choses en plus. Voyons tout ça :

aaron:~/demoCA# cat index.txt
V       050627111537Z           01      unknown /C=FR/ST=France/O=MyOrg/OU=admin/CN=Supervisor
                                                /emailAddress=supervisor@yahoo.fr

aaron:~/demoCA# cat index.txt.attr
unique_subject = yes

aaron:~/demoCA# cat serial
02

et dans newcerts :

aaron:~/demoCA# cd newcerts
aaron:~/demoCA/newcerts# ls -l
total 4
-rw-r--r--    1 root     root         3668 Jun 27 13:15 01.pem

Voyons ce qu'il y a de beau dans ce 01.pem :

aaron:~/demoCA/newcerts# cat 01.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=FR, ST=France, L=Marseille, O=MyOrg, OU=admin, CN=Supervisor/emailAddress=supervisor@yahoo.fr
        Validity
            Not Before: Jun 27 11:15:37 2004 GMT
            Not After : Jun 27 11:15:37 2005 GMT
        Subject: C=FR, ST=France, O=MyOrg, OU=admin, CN=Supervisor/emailAddress=supervisor@yahoo.fr
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:a4:46:38:f2:cd:f3:83:15:a6:2b:7c:41:bd:13:
                    d7:8a:71:7d:66:bb:25:81:26:41:59:7f:9f:ee:94:
                    f9:9b:fc:fc:4e:88:c4:04:1b:b7:c8:4a:cb:f9:e2:
                    73:4a:bf:e4:d7:0b:48:fe:50:33:43:03:8b:62:91:
                    b2:3f:33:4f:99:60:b3:e6:b4:f5:d7:e6:37:be:e2:
                    90:16:42:e1:35:f2:19:6c:09:55:e4:c9:8c:a7:9d:
                    89:99:55:a0:70:9e:53:ff:c0:f4:97:25:f7:5c:b1:
                    0e:e0:30:8a:05:81:fa:d8:1a:5b:30:d2:5a:b0:54:
                    57:f0:f2:61:a1:fc:c3:ec:57
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                C9:97:59:5A:B1:0D:6C:61:CC:D1:90:79:43:D3:F4:3E:0F:07:38:4C
            X509v3 Authority Key Identifier:
                keyid:AC:F2:A8:DD:56:10:80:AC:C3:F5:6B:F6:29:72:B7:D2:F3:BF:10:86
                DirName:/C=FR/ST=France/L=Marseille/O=MyOrg/OU=admin/CN=Supervisor/emailAddress=supervisor@yahoo.fr
                serial:00

    Signature Algorithm: md5WithRSAEncryption
        34:2d:bb:5e:cc:eb:c9:77:46:f0:b3:c2:93:9b:95:bc:a3:e1:
        a2:9a:a7:f4:ac:9b:cc:8f:76:cd:54:7e:ec:c2:50:5d:94:04:
        65:e1:ab:ec:46:b8:0d:60:59:df:56:de:38:6d:d4:89:db:0a:
        2c:f3:76:b5:0f:4c:ff:25:8b:26:af:f1:a6:ff:22:89:a5:4b:
        59:3d:02:e1:35:bd:96:3d:12:4c:ee:bc:b2:d1:25:f6:c7:50:
        1d:cc:85:32:ca:c7:10:6a:7a:45:51:86:47:01:b1:80:4b:6e:
        a2:ef:73:79:07:35:75:ec:7b:f0:1e:c7:3a:08:9a:ad:ad:e7:
        29:5e
-----BEGIN CERTIFICATE-----
MIIDtDCCAx2gAwIBAgIBATANBgkqhkiG9w0BAQQFADCBljELMAkGA1UEBhMCRlIx
DzANBgNVBAgTBkZyYW5jZTESMBAGA1UEBxMJTWFyc2VpbGxlMQwwCgYDVQQKEwNF
TUUxDjAMBgNVBAsTBWFkbWluMQ8wDQYDVQQDEwZDQUxFQ0ExMzAxBgkqhkiG9w0B
CQEWJGNocmlzdGlhbi5jYWxlY2FAZW1lLWVuc2VpZ25lbWVudC5mcjAeFw0wNDA2
MjcxMTE1MzdaFw0wNTA2MjcxMTE1MzdaMIGCMQswCQYDVQQGEwJGUjEPMA0GA1UE
CBMGRnJhbmNlMQwwCgYDVQQKEwNFTUUxDjAMBgNVBAsTBWFkbWluMQ8wDQYDVQQD
EwZDQUxFQ0ExMzAxBgkqhkiG9w0BCQEWJGNocmlzdGlhbi5jYWxlY2FAZW1lLWVu
c2VpZ25lbWVudC5mcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApEY48s3z
gxWmK3xBvRPXinF9ZrslgSZBWX+f7pT5m/z8TojEBBu3yErL+eJzSr/k1wtI/lAz
QwOLYpGyPzNPmWCz5rT11+Y3vuKQFkLhNfIZbAlV5MmMp52JmVWgcJ5T/8D0lyX3
XLEO4DCKBYH62BpbMNJasFRX8PJhofzD7FcCAwEAAaOCASIwggEeMAkGA1UdEwQC
MAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRl
MB0GA1UdDgQWBBTJl1lasQ1sYczRkHlD0/Q+Dwc4TDCBwwYDVR0jBIG7MIG4gBSs
8qjdVhCArMP1a/YpcrfS878QhqGBnKSBmTCBljELMAkGA1UEBhMCRlIxDzANBgNV
BAgTBkZyYW5jZTESMBAGA1UEBxMJTWFyc2VpbGxlMQwwCgYDVQQKEwNFTUUxDjAM
BgNVBAsTBWFkbWluMQ8wDQYDVQQDEwZDQUxFQ0ExMzAxBgkqhkiG9w0BCQEWJGNo
cmlzdGlhbi5jYWxlY2FAZW1lLWVuc2VpZ25lbWVudC5mcoIBADANBgkqhkiG9w0B
AQQFAAOBgQA0LbtezOvJd0bws8KTm5W8o+Gimqf0rJvMj3bNVH7swlBdlARl4avs
RrgNYFnfVt44bdSJ2wos83a1D0z/JYsmr/Gm/yKJpUtZPQLhNb2WPRJM7ryy0SX2
x1AdzIUyyscQanpFUYZHAbGAS26i73N5BzV17HvwHsc6CJqtrecpXg==
-----END CERTIFICATE-----
aaron:~/demoCA/newcerts#

Tout ça est sûrement bien intéressant, il faut le garder sous le coude...

Ce qui saute aux yeux immédiatement, c'est que ce certificat n'est valable qu'un an, à partir de la date de création :

        Validity
            Not Before: Jun 27 11:15:37 2004 GMT
            Not After : Jun 27 11:15:37 2005 GMT

Ce sont des options calculées à partir des paramètres par défaut. Bien entendu, nous aurions pu forcer deux autres dates dans la ligne de commande.

Au tour de CYCLOPE

Il faut maintenant créer pour CYCLOPE une clé privée et un certificat. CYCLOPE va créer localement sa clé privée, sa demande de certificat, envoyer à AARON sa demande de certificat pour le faire approuver et AARON va lui renvoyer son certificat.

Création de la clé privée et de la demande de certificat

cyclope:~# openssl req -nodes -new -keyout cyclope.key -out cyclope.csr

Et c'est reparti...

cyclope:~# openssl req -nodes -new -keyout cyclope.key -out cyclope.csr
Generating a 1024 bit RSA private key
.....++++++
...++++++
writing new private key to 'cyclope.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) [AU]:FR
State or Province Name (full name) [Some-State]:France
Locality Name (eg, city) []:Marseille
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyOrg
Organizational Unit Name (eg, section) []:admin
Common Name (eg, YOUR name) []:CHRIS
Email Address []:chris@cyclope.maison.mrs

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:lageducapitaine
An optional company name []:
cyclope:~#

Nous envoyons le fichier cyclope.csr à AARON, nous allons le faire avec scp, ça ira plus vite que par la poste :

cyclope:~# scp cyclope.csr 82.127.57.95:/root/
The authenticity of host '82.127.57.95 (82.127.57.95)' can't be established.
RSA key fingerprint is 60:fa:5b:26:4e:f1:5a:7d:96:f5:c9:da:48:62:78:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '82.127.57.95' (RSA) to the list of known hosts.
Password:
cyclope.csr                                             100%  745     0.7KB/s   00:00
cyclope:~#

Sur AARON, nous validons le certificat :

aaron:~# openssl ca -cert aaron-ca.crt -keyfile aaron-ca.key -out cyclope.crt -in cyclope.csr
Using configuration from /usr/lib/ssl/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jun 27 14:21:46 2004 GMT
            Not After : Jun 27 14:21:46 2005 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = France
            organizationName          = MyOrg
            organizationalUnitName    = admin
            commonName                = CHRIS
            emailAddress              = chris@cyclope.maison.mrs
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                A0:45:F9:E4:25:0C:B1:07:3B:D3:1F:EE:73:3B:1A:C2:46:32:70:14
            X509v3 Authority Key Identifier:
                keyid:AC:F2:A8:DD:56:10:80:AC:C3:F5:6B:F6:29:72:B7:D2:F3:BF:10:86
                DirName:/C=FR/ST=France/L=Marseille/O=MyOrg/OU=admin/CN=Supervisor/emailAddress=supervisor@yahoo.fr
                serial:00

Certificate is to be certified until Jun 27 14:21:46 2005 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
aaron:~#

que nous renvoyons à cyclope :

aaron:~# scp cyclope.crt 80.8.135.15:/root/
The authenticity of host '80.8.135.15 (80.8.135.15)' can't be established.
RSA key fingerprint is 49:08:1b:f3:5e:cb:3c:97:67:b9:06:47:8b:8c:36:e5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '80.8.135.15' (RSA) to the list of known hosts.
Password:
cyclope.crt                                                     100% 3635     3.6KB/s   00:00
aaron:~#

Et nous devons aussi lui envoyer le certificat de l'autorité aaron-ca.crt :

aaron:~# scp aaron-ca.crt 80.8.135.15:/root/
Password:
aaron-ca.crt 100% 1310 1.3KB/s 00:00
aaron:~#

Bien. Nous sommes presque au bout :

Et pour cacher les données dans le tunnel ?

Nous pourrions nous arrêter là, si nous voulions juste nous contenter d'authentifier les extrémités du tunnel, sans chiffrer les données qui vont passer dedans, mais, au point où nous en sommes, autant donner à AARON, aussi serveur OpenVPN, le matériel pour créer une clé de session pour un chiffrement symétrique des données dans le tunnel, pour les rendre confidentielles.

Sur AARON :

aaron:~# openssl dhparam -out dh1024.pem 1024
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
..................................

Et huit minutes plus tard, nous avons le fichier :

aaron:~# cat dh1024.pem
-----BEGIN DH PARAMETERS-----
MIGHAoGBANcTIW0XcvuNDSgK+KiS0rmo14zHNxnMK3IHjvWCqjJL8F0+nwFKvLql
FBggAoL1Si+4iuVJoZU3T4H/tsGlsayvWF1l4PNVuaenER2bhIDeFNGx1A/WbYmK
1JNOVpyfwC/i1fv1L/8bpzrjGsgl4GIy8sKzJt+PXRcV61fcJIM7AgEC
-----END DH PARAMETERS-----

Celui là, on ne pourra pas dire qu'il a été écrit à la légère.

Nous avons maintenant tout ce qu'il faut pour réaliser ce tunnel "parfaitement" sécurisé, c'est à dire confidentiel et dont les extrémités sont mutuellement authentifiées.

Le tunnel est dit "étanche" parce que ce qui y circule dedans ne peut être vu de dehors (confidentialité) et personne ne peut y introduire de données frauduleuses (authentification des extrémités).


Précédente ] [ Accueil ] [ Suivante ]