[ Accueil ] [ Avant propos ] [ Les clés du chiffrement ] [ Méthodes ] [ OpenVPN simple ] [ OpenSSL ] [ Tunnel sécurisé ] [ Applications ]
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.
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.
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 :
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, 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.
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.
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 :
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).