Le 15 mai 2014 j’ai fais une présentation à Cocoaheads Paris. Le sujet était l’obtention d’un certificat SSL valide et reconnus par les navigateurs.
En voici les slides, un peu retravaillés pour pluis de clareté sur ce blog.
Certificats TLS valide pour distribution OTA (par exemple)
Présentation en deux parties
- Première partie : théorie
- Seconde partie : pratique
Première Partie
Qu’est-ce qu’un certificat TLS ?
C’est le nouveau nom des certificats SSL.
SSL → Secure Socket Layer
TLS → Transport Layer Security
Le certificat permet de prouver que le site sur lequel on se balade est bien celui qu’il prétend être.
Les données transférées entre votre navigateur et le serveur sont chiffrées.
Principe de base
Une CA (Certificate Authority) reçoit un CSR (Certificat Sign Request) et retourne un certificat signé avec la clef de la CA et la clef incluse dans le CSR.
Deux types de CA :
- Privée, faite à la maison pour des besoins propres ;
- Publique, cette autorité de certification dispose de certificats “Racine” qui sont inclus dans les navigateurs (et dans la keychain sur Mac).
La CA privée
Pour faire une CA Privée (qui n’est pas l’objet de cette présentation) on crée une clef de chiffrement, un fichier de données aléatoire et le tour est joué.
Il est aussi possible de faire des certificats autosignés, sans faire de CA.
Il existe beaucoup de littérature détaillée sur ces aspects que nous n’aborderons pas ici.
Pourquoi faire sa CA ?
- Besoin de plusieurs certificats qui se rapportent à la même entitée (le certificat du VPN, celui de l’Intranet, etc).
À moins de distribuer votre certificat racine, vos certificats ne seront pas reconnus et engendreront une alerte de sécurtié.
Pourquoi demander un certificat à une autorité de certification ?
- Bien moins enquiquinant (une fois que l’on sait faire) ;
- Certificat racine dans les navigateurs donc pas d’alerte de sécurité, donc pas de crise cardiaque chez les clients.
En revanche, les certificats ainsi obtenus sont payants (ou presque).
Deuxième partie
Nous allons voir que StarSSL.com propose des certificats gratuits.
Oui, ils sont gratuits à la création. En revanche la révocation, elle est payante.
Entrée libre → Sortie payante.
Le site de StarSSL
Création d’un compte
Cette étape est fastidieuse, mais nécessaire. Elle permet la reconnaissance de votre identité numérique. StartSSL va faire en sorte de s’assurer que vous êtes bien le propriétaire du domaine pour lequel vous allez demander des certificats.
Pré-requis
- Vous devez posséder un nom de domaine. C’est pour ce nom de domaine,
example.com
que vous allez faire des demandes de certificat.
Il y a une possibilité d’obtenir un certificat Express. Nous n’utiliserons pas cette possibilité.
Création de compte (2, on y va)
Depuis la page maison de StartSSL, choisissez StartSSL Free (Class 1).
En bas de la page suivante, cliquez sur le lien Certificate Control Panel.
Et de là, nous choisissons Sign-up.
Il faut remplir le formulaire (comme indiqué, TOUS les champs doivent recevoir une valeur).
Vous pouvez indiquer ici une adresse email à laquelle vous avez accès facilement.
Si cette adresse email, vous allez recevoir un code de vérification (valable 30 jours) qu’il vous faudrait utiliser sur la page suivante.
Tout de suite, la suite
Vous allez recevoir un certificat qui va vous permettre de vous authentifier sur le site de StartSSL sans utiliser votre mot de passe. Ce certificat est à mettre dans votre keychain sur Mac et dans certains navigateur (Firefox, Chrome).
Utilisation du compte
La première chose à faire est d’indiquer le nom de domaine pour lequel nous voulons des certificats.
Il est bien sûr possible d’avoir plusieurs domaines.
- Cela se fait dans l’onglet validations Wizard
- On choisit la validation de domaine.
- On indique le domaine.
- On indique sur quelle adresse email on désire recevoir le mail de confirmation.
Attention, c’est un mail “administratif” (postmaster, webmaster,…) il est donc nécessaire de recevoir les mails addressés à ces utilisateurs.
- On donne le code de vérification reçu par mail et on termine.
Notre domaine est maintenant connu et certifié. On peux maintenant passer à la demande de certificat.
Demande de certificat
Nous allons maintenant demander un certificat signé par StartSSL.com pour notre domaine. Nous aurons besoin d’une clef et d’une demande signature de certificat (CSR, Certificate Signing Request).
Il est possible de faire générer la clef de nos certificats (cette clef servira pour TOUS nos certificats) par StartSSL. C’est une bêtise qu’il ne faut pas commettre.
Nous allons générer notre clef et nos CSR sur notre machine.
Génération de la clef
La création de la clef est très simple. Nous allons faire une grosse clef histoire d’être tranquille (supposément) pendant un bon bout de temps :
Cette génération se fait dans le Terminal :
$ openssl genrsa -out foucry.net.key 4096
Generating RSA private key, 4096 bit long modulus
.........................................................................................................................++................................++
e is 65537 (0x10001)
Génération du CSR
Le CSR est le fichier que nous allons envoyer à StartSSL pour que ceux-ci nous délivrent un certificat.
Faites attention au nom du serveur (server FQDN or YOUR name). Il faut que cela correspondent avec le nom du serveur qui va effectivement utiliser ce certificat.
NOTE : StartSSL ne délivre pas de certificat wildcard en version gratuite (pas de certificat *.foucry.net
qui serait valable sur tous les serveurs, pour tous les services).
Génération du CSR
$ openssl req -new -key foucry.net.key -out foucry.net.csr
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]:Ile de France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Foucry.net
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:ota.dedibox.foucry.net
Email Address []:jacques@foucry.net
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Nous pouvons effectuer une vérification de notre CSR avant de le soumettre :
$ openssl req -noout -text -in foucry.net.csr
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=FR, ST=Ile de France, L=Vitry sur Seine, O=Foucry.net, OU=IT, CN=Jacques Foucry/emailAddress=jacques@foucry.net
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:da:7f:48:cd:72:70:c4:23:64:ce:1b:99:a8:34:
9b:33:cf:5a:48:a9:13:ce:f2:84:f0:99:f8:9c:c2:
b8:8b:83:ab:35:f2:a0:14:a1:ef:ca:af:02:45:67:
28:d7:37:3c:93:c4:22:91:41:c0:21:a6:28:79:d8:
1d:8d:77:d9:8e:12:a4:6b:0d:8f:01:41:5b:3d:d7:
34:c9:f2:dc:1e:6f:2c:70:70:23:01:df:62:6a:b1:
4d:6b:eb:28:35:1a:35:d2:ec:77:c1:5b:13:5f:3f:
2a:04:1e:a1:98:f9:f7:94:50:31:b2:36:a3:b0:a3:
8c:ca:9a:59:43:7c:96:a8:0b:59:46:75:5f:94:27:
af:51:f7:74:7e:69:f8:f7:a0:ab:d3:5d:e4:ec:50:
b0:09:02:b8:47:df:50:36:0e:c8:68:64:e9:c9:c7:
a6:6b:36:45:be:95:19:44:87:9a:ed:4a:49:bb:3f:
e3:90:36:13:9f:00:4a:fd:4d:21:53:1b:5b:52:c7:
a2:fd:b7:35:5b:ab:f6:fa:8b:01:71:35:d0:f7:09:
22:28:5a:40:b4:fe:16:08:7e:02:75:23:68:d5:67:
80:95:2d:d3:52:b0:61:bf:bf:a4:6e:8d:29:8c:2c:
c1:d6:ad:17:47:a8:58:1a:1e:d1:26:d8:7d:20:b8:
ce:5f:fa:63:f3:1f:72:41:28:71:94:d9:27:fd:13:
14:4d:a8:b6:38:25:54:1d:b0:27:e2:0d:17:ac:22:
a1:05:4f:77:07:e4:66:7a:9f:4b:c6:f4:98:41:af:
2a:61:3b:71:06:69:96:db:1a:6c:4a:eb:b6:ed:40:
7f:86:56:b1:3b:15:03:8e:fc:94:83:18:46:33:5b:
0a:1d:c9:6e:04:9d:78:6f:bc:52:14:f2:f4:8d:20:
a4:ad:0b:18:ec:ee:eb:f9:fc:90:07:b7:4c:ef:d5:
7c:6e:36:97:64:81:21:fa:c7:72:a7:33:26:30:b9:
76:24:0e:fb:39:08:5c:49:92:d8:46:38:ca:21:fb:
36:13:d2:b3:f1:7a:59:85:a3:77:c0:34:03:bf:fe:
a2:9a:11:3a:4c:f8:7d:71:b5:90:22:5a:b8:5b:36:
74:49:17:ac:75:26:c6:8e:20:2f:b6:9a:cd:42:08:
6d:7a:e7:bb:91:7e:f9:7f:e6:5d:ab:b5:cb:bc:98:
93:6e:0d:99:bd:71:87:88:b6:62:01:65:b6:3c:63:
ad:49:08:f6:e5:14:de:2a:61:44:6a:fe:c1:57:e8:
9f:a0:4c:e5:b2:4e:d3:16:17:05:99:75:92:01:2f:
da:4b:50:a0:51:0f:43:67:03:d0:1e:f1:0e:2f:95:
fb:33:e7
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha1WithRSAEncryption
44:98:b3:a7:03:88:4e:98:ec:87:c4:eb:7a:9c:a3:37:0c:a9:
72:42:31:8b:87:3c:ff:df:ce:d7:c2:e7:03:e1:ad:56:1d:a7:
50:64:13:07:9b:f2:96:b1:5e:b5:79:76:ee:27:46:77:0f:f4:
54:38:30:b9:e5:41:fd:b3:52:5e:c4:2d:12:4a:2d:1a:e8:ea:
68:3d:87:07:9c:c8:f6:33:45:9b:2b:db:b2:5a:03:a3:23:41:
05:e4:4e:f6:b9:51:31:08:f5:7f:ee:4a:2c:0f:87:74:46:86:
a5:c9:e3:24:c5:39:75:c4:ef:c1:0b:9e:33:c0:9a:7f:9d:55:
61:d4:9b:f9:ff:67:66:28:bb:d3:45:ee:bf:7d:5f:bd:a0:03:
9b:32:9c:f8:d6:1a:80:88:18:f1:be:15:6f:62:c4:7e:12:35:
dc:cc:2c:f4:a8:55:01:ea:8c:43:5d:16:be:1a:3e:26:cc:dd:
c3:50:61:0a:db:84:10:bb:0c:c3:cf:fc:71:d3:f0:b1:c3:88:
f9:c0:16:f1:b9:0d:a7:f9:79:e4:4a:ad:5b:27:c9:bd:f7:4e:
17:ce:01:82:21:5b:e2:12:a2:16:fe:e1:83:0b:3b:c5:8e:17:
ad:69:69:83:84:57:78:e4:5b:b0:bc:14:71:85:11:c4:24:4d:
1d:b4:29:ae:c5:c3:63:ca:4e:3b:5f:e4:e3:f1:17:46:b6:fe:
3e:49:11:63:fa:31:22:52:1a:2d:27:1b:4b:a7:a7:2a:7f:77:
fc:d1:d3:98:d6:2e:69:01:7d:b5:7a:5a:fa:8d:a0:e8:7b:3d:
5a:bd:ce:00:54:1b:a4:b5:bb:d7:5c:67:bc:61:7f:3f:75:21:
dc:6d:7d:b6:b1:9a:b2:e5:b0:e4:03:0d:a6:c9:1f:81:6e:1e:
80:42:dd:ee:42:bc:c9:cd:d0:e2:44:1c:76:58:f2:6c:94:16:
4a:de:2d:71:66:96:8c:b1:87:f4:8f:4a:09:91:b7:e9:9f:5c:
4e:6f:00:e6:61:f7:a7:17:0c:20:c0:3b:2a:b7:73:70:45:3c:
ed:08:95:7e:8b:64:70:d0:4c:23:3a:ac:86:8f:c6:34:2a:9f:
4a:d5:8d:be:45:9a:76:65:89:6d:a7:1f:7d:11:6a:02:64:50:
bc:ac:93:a4:d7:a9:23:85:a1:5a:a6:41:8b:26:ed:e5:8c:b3:
f8:21:67:87:4f:99:7f:16:38:97:d5:a3:80:fe:05:77:a0:72:
4e:c1:c9:30:25:fa:6b:4f:96:bb:bd:54:8a:06:4f:23:dc:cb:
2d:52:90:04:b4:90:1b:3d:97:42:86:17:a7:58:70:9d:88:f1:
95:3b:88:4f:14:12:1b:37
Et sur un Mac ?
Sur un Mac nous allons faire les deux opérations en une seule, en utilisant Keychain Access (Trousseau).
-
Dans le menu Keychain Access → Certificate Assistant → Request a Certificate From a Certificate Authority.
-
Indiquez les informations nécessaires, en particulier le nom du serveur qui va utiliser ce certificat (tout comme nous l’avons vu précédement).
Obtention du certificat
Pour obtenir un certificat signé par StartSSL à partir de notre CSR, nous devons nous rendre sur le site de StartSSL et demander, dans Certificate Wizard, un Web Server TLS/SSL Certificate.
-
Nous sautons l’étape de création de clef pour passer directement à l’étape suivante qui consiste à copier/coller le CSR que nous avons généré.
-
Nous devons choisir le domaine auquel s’applique notre certificat et le nom pleinement qualifié de la machine qui l’utilisera.
-
Après un court laps de temps (3 heures au maximum d’après StarSSL) nous recevons un message qui nous permet de récupérer notre certificat.
Celui-ci est dans la toolbox, dans la rubrique Retrieve Certificate. Il est nécessaire de choisir le certificat que nous désirons (pour l’instant nous n’en avons qu’un mais cela pourra changer rapidement).
Et de le copier dans un fichier texte, sur le serveur de destination. Nous appelerons ce fichier ota.dedibox.foucry.net.crt
. Comme son nom l’indique, il servira pour la sécurisation des distributions OTA d’application iPhone.
Vérification du certificat
Cette opération n’est pas obligatoire mais elle nous permet de mettre en place certains éléments dont nous aurons besoin plus tard.
Pour vérifier le certificat nous avons besoin du certificat racine de StartSSL. Celui-ci nous est fournis en standard dans /etc/ssl/certs
et se nomme StartCom_Certification_Authority.pem
.
Nous avons aussi besoin du certificat intermédiare de StartSSL. Il ne nous est pas fournis, il faut aller le chercher sur le site de StartSSL.
Il s’agit de sub.class1.server.ca.pem
.
Une fois récupéré il est placé, avec le certificat Racine, dans /etc/ssl/cert
.
Ces deux éléments ne sont toutefois pas exploitable tel quel. Il est nécessaire de les concaténer dans un nouveau fichier, StartSSLCA.pem
:
$ cat /etc/ssl/certs/StartCom_Certification_Authority.pem > /etc/ssl/certs/StartSSLCA.pem
$ cat /etc/ssl/certs/sub.class1.server.ca.pem >> /etc/ssl/certs/StartSSLCA.pem
Il est désormais possible de vérifier notre certificat :
$ openssl verify -CAfile StartSSLCA.pem ota.dedibox.foucry.net.crt ota.foucry.net.crt: OK
Mise en place pour Apache
Nous avons tous les éléments nécessaire maintenant, il nous reste à mettre en place ce certificat pour notre distribution OTA. Nous allons supposer que nous avons déjà un site qui fonctionne (avec le virtualhost qui correspond).
Nous allons donc simplement modifier ce virtualhost pour qu’il utilise notre certificat.
VirtualHost de départ
<VirtualHost *:80>
ServerName ota.foucry.net
Serveradmin hostmaster@foucry.net
DocumentRoot /var/www/foucry/OTA
<Directory /var/www/foucry/OTA>
AllowOverride
Options +Indexes
</Directory>
</VirtualHost>
Notre VirtualHost actuel que nous allons transformer.
Redirection
<VirtualHost *:80>
ServerName ota.foucry.net
ServerAdmin hostmaster@foucry.net
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
La première partie est transformée pour faire une redirection vers le VirtualHost https.
<VirtualHost *:443>
ServerName ota.foucry.net
ServerAdmin hostmaster@foucry.net
DocumentRoot /var/www/foucry/OTA
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ota.foucry.net.crt
SSLCertificateKeyFile /etc/ssl/private/foucry.net.key
SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem
SSLCACertificateFile /etc/ssl/certs/StartCom-ca.pem
<Directory /var/www/foucry/OTA>
AllowOverride
Options +Indexes
</Directory>
</VirtualHost>
La nouvelle partie du VirtualHost pour la connexion sécurisée.
On relance apache
$ apachectl graceful
Et normalement l’accès se fait maintenant en HTTPS.