Créer un certificat SSL multi-domaines
Si vous administrez un serveur web avec de multiple domaines virtuels, vous avez sans doute été confronté à la problématique de la création de certificat SSL valide pour plusieurs domaines. Ce guide n'a pas pour but de vous expliquer la théorie des certificats SSL, mais de vous aider à créer des certificats valides pour plusieurs domaines. Il a été écrit pour fonctionner sur Debian 4.0 Etch.
Ce guide est obsolète. Utilisez la nouvelle version sur le Help Desk Biapy:
Créer un certificat SSL / TLS sur Debian
Présentation de la technologie SSL
Le certificat SSL
Un certificat SSL est composé de deux éléments:
- Une "clef" privée que seule la personne ayant créé le certificat possède. Cette clef doit être protégée du vol ! Si quelqu'un en fait une copie, il peut dupliquer votre site, et duper les internautes.
- Une "clef" publique que tout le monde peut télécharger.
La méthode de fonctionnement du cryptage SSL est simple:
- Lorsque le contenu est chiffré à l'aide de la clef privée, seule la clef publique peut le décoder: Certitude que le contenu a été créé par le propriétaire du certificat.
- Lorsque le contenu est chiffré à l'aide de la clef publique, seule la clef privé peut le décoder: Certitude que le contenu ne peut être lu que par le propriétaire du certificat.
Les autorités de certification
Il existe un type particulier de certificat SSL que l'on appelle autorité de certification.
Les autorités de certification vérifie que la personne ayant créé un certificat SSL pour un domaine est bien le propriétaire du domaine. Une fois l'identité du créateur vérifiée, l'autorité de certification signe le certificat serveur à l'aide de sa clef privée.
Les systèmes d'exploitations et navigateurs Web disposent des clefs publiques des autorités de certification. Il leur est ainsi possible de contrôler les certificats SSL des sites Web et autres serveurs.
Quelle autorité de certification pour quel besoin
- Vous disposez d'un serveur Internet d'entreprise: vous devez utiliser une autorité de certification payante. Personnellement, je vous propose Trustico qui fournit des certificats à des coûts très abordables.
- Vous disposez d'un serveur Internet personnel: vous pouvez utiliser l'autorité de certification gratuite CACert.
- Vous disposez d'un serveur Intranet: vous devez créer votre propre autorité de certification (voir plus bas dans cette page).
Mise en place de l'environnement
En premier lieu, nous installons les outils de création des certificats SSL :
command apt-get install openssl
Une fois ceci fait, nous créons un dossier destinés à contenir les certificats nouvellement créé:
command mkdir /etc/openssl
Et nous téléchargeons le script qui nous aidera à créer les certificats et son fichier de configuration:
command wget 'http://howto.landure.fr/gnu-linux/debian-4-0-etch/creer-un-certificat-ssl-multi-domaines/ca_openssl.cnf' \ --output-document='/etc/openssl/ca_openssl.cnf' command wget 'http://howto.landure.fr/gnu-linux/debian-4-0-etch/creer-un-certificat-ssl-multi-domaines/cert_manager.sh' \ --output-document='/etc/openssl/cert_manager.sh' command chmod +x '/etc/openssl/cert_manager.sh'
Une fois le script installé, nous initialisons l'environnement de création des certificats, c'est à dire les valeurs par défaut que vous allez utiliser le plus fréquemment:
/etc/openssl/cert_manager.sh --init
Le script vous pose alors des questions concernant votre domaine, et votre emplacement géographique.
Important : La description du domaine doit correspondre au nom du propriétaire du certificat ! Sans cela, le certificat ne sera pas accepté par l'autorité de certification. En général, il s'agit du nom de votre société.
You will now be asked to give informations for your certificate authority. Description du domaine [défaut : My Company]: Nom de société Code de votre pays [défaut : FR]: Nom de votre région [défaut : Ile de France]: Nom de votre ville [défaut : Paris]: Nom de votre domaine [défaut : my-domain.com]: landure.fr Email de l'administrateur [défaut : root@my-domain.com]: none@landure.fr
Une fois ceci fait, vous êtes prêts pour la création de vos certificats.
Création d'un certificat serveur
La création d'un certificat SSL pour un serveur consiste en 3 étapes:
- La création d'un couple clef privée / clef publique et de la demande de signature de certificat (CSR) associée.
- L'envoi du CSR à l'autorité de certification choisie.
- La récupération de la clef publique du certificat signée par l'autorité de certification.
En premier lieu, nous créons nos clefs privée et publique, et la demande de signature associée:
/etc/openssl/cert_manager.sh --generate-csr="www.domaine.fr"
Remarque: www.domaine.fr est utilisé comme préfixe pour les noms des fichiers du certificat. Il est préférable que cette valeur ne contienne ni espace, ni caractères spéciaux.
Vous devez alors saisir les informations de votre certificat. Dans l'exemple ci-dessus, nous créons un certificat dit "wildcard". C'est à dire que ce certificat peut être utilisé pour tous les sous-domaine de votre domaine. Un certificat est dit "wildcard" quand le nom de domaine qu'il protège débute par le caractère '*'. Par exemple : "*.mon-domain.com". Voici comment créer un certificat Rapid SSL Wildcard :
You will now be asked to give informations for your certificate authority. Description du domaine [défaut : My Company]: Nom de société Type de serveur [défault : HTTP server]: HTTPS server Code de votre pays [défaut : FR]: Nom de votre région [défaut : Ile de France]: Nom de votre ville [défaut : Paris]: Email de l'administrateur [défaut : root@my-domain.com]: Nom de votre domaine [défaut : my-domain.com]: *.my-domain.com Noms de domaines supplémentaires, un par ligne. Finissez par une ligne vide. SubjectAltName: DNS:
Remarque: Comme vous pouvez le voir, cet outil vous donne la possibilité de générer des certificats valides pour plusieurs noms de domaines. Pour ce faire, il suffit de les saisir dans les SubjectAltName. Cette méthode est intéressante si votre serveur HTTP ne dispose que d'une seule adresse IP, et désert plusieurs noms de domaines, mais la signature de certificats wildcard multidomaines coûte cher. Voici un exemple de domaines supplémentaires pouvant être utilisé pour créer un certificat Power Server ID Wildcard :
SubjectAltName: DNS:*.my-other-domain.com SubjectAltName: DNS:*.some-more-domain.com
A la fin de la procédure, l'outil vous affiche la requête créée car vous pouvez, si vous le souhaitez :
- Faire signer votre certificat par Trustico.
- faire signer gratuitement votre certificat serveur par le site CACert
Vous pouvez aussi choisir de le signer avec votre autorité de certification locale (voir plus bas) ou encore par une autorité de certification commerciale.
Votre demande de signature de certificat se compose de deux fichiers:
- /etc/openssl/PRIVATE_KEYS/www.domaine.fr_key.pem : La clef privée et confidentielle de votre futur certificat.
- /etc/openssl/CERTIFICATES_REQUESTS/www.domaine.fr_csr.csr : La clef publique non signée de votre futur certificat.
Vous devez fournir le contenu du fichier https_csr.csr à votre autorité de certification. En retour, une fois votre identité vérifiée, celle-ci vous fournira la clef publique signée. Placez-la dans le fichier /etc/openssl/CERTIFICATES/www.domaine.fr_cert.cert.
Votre certificat SSL consiste alors en deux fichiers:
- /etc/openssl/PRIVATE_KEYS/www.domaine.fr_key.pem : La clef privée et confidentielle de votre certificat.
- /etc/openssl/CERTIFICATES/www.domaine.fr_cert.cert : La clef publique signée de votre certificat.
Il ne vous reste plus qu'a configurer votre serveur pour utiliser ce certificat.
Mise en place d'une autorité de certification locale
Création de l'autorité de certification locale
Si vous souhaitez signer un certificat destiné à votre réseau local, vous devez créer une autorité de certification pour votre réseau local. Pour ce faire, utilisez la commande:
/etc/openssl/cert_manager.sh --create-ca
Vous disposez à présent du nécessaire pour signer vos propres certificats. Elle consiste en deux fichiers:
- /etc/openssl/CERTIFICATE_AUTHORITY/ca-key.pem : Votre clef privé. Elle est confidentielle. Conservez-la précieusement.
- /etc/openssl/CERTIFICATE_AUTHORITY/ca-cert.pem : La clef publique de votre autorité de certification. Ajoutez-la aux navigateurs Internet présent sur votre réseau local afin qu'ils n'affichent pas d'alerte lorsqu'ils accédent à vos serveurs sécurisés.
Signature d'un certificat par l'autorité de certification locale
Si le certificat est destiné à votre réseau local, vous pouvez utiliser votre autorité de certification pour le signer :
/etc/openssl/cert_manager.sh --sign-csr="www.domaine.fr"
Remarque: www.domaine.fr est le même préfixe que celui que vous avez utilisé lors de la création de votre certificat.
Cette commande vous affiche les informations incluses dans la demande de certificat et vous demande si vous acceptez de le signer.
Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y
Votre certificat SSL consiste alors en deux fichiers:
- /etc/openssl/PRIVATE_KEYS/www.domaine.fr_key.pem : La clef privée et confidentielle de votre certificat.
- /etc/openssl/CERTIFICATES/www.domaine.fr_cert.cert : La clef publique signée de votre certificat.
Il ne vous reste plus qu'a configurer votre serveur pour utiliser ce certificat.
Pour aller plus loin
Si vous souhaitez aller plus loin avec les certificats SSL, je vous conseille les lectures suivantes :
- Vérifier automatiquement l’expiration de certificats SSL sur Tux Planet.
- Créer sa propre (mini) PKI sur l'excellent site Artisan Numérique.
Remerciements
- Merci à Jeremy Mates pour son article OpenSSL Certificate Authority Setup.
- Merci à CACert pour leur article VhostTaskForce.
- Merci à l'auteur et aux traducteurs du howto Guide pratique des certificats SSL.
de mémoire ca marche
Personnellement, j'ai créé un unique certificat pour:
smtp.landure.fr, smtp.landure.org, smtp.landure.com, smtp.landure.net
sans aucun problème. Je pense donc que ton problème vient plus de la validation des domaines que de la création du certificat.
Bon courrage
openssl
j'ai pourtant un ping ok sur toutes mes requetes dns ??
Que dois-je faire ??
merci
je me suis peut etre trompé
personnellement, je signe mes certificats avec CACERT, je me suis donc peut être trompé sur le nom de fichier pour les certificats auto signés. Je pense que https_cert.cert est le même fichier que celui que je nomme https_cert.pem.
je vérifierai quand j'aurais 5 mn.
Bon courrage
Ajout d'un autre domaine ?
est-il possible d'ajouter un autre domaine après avoir généré le certificat multidomaine ou faut-il tout refaire ?
Merci
Lolo
malheureusement,
Bon courrage.
authentification vhosts
Tout d'abord, il faut préciser que je suis nul en config Apache.
Je suis intéressé par l'inverse des certificats multi-domaines ou wildcards.
Récemment, on a mis en place une architecture PKI rapidement grace aux scripts inclus dans easy-rsa (livré avec OpenVPN).
Notre souhait est d'autoriser l'accès à un virtualhost Apache selon le certificat de l'utilisateur.
On a changé la valeur de SSLCACertificatePath pour chaque vhost vers le dossier contenant les certificats qu'on souhaite autoriser.
En parcourant certains sites comme celui du reverse-proxy Pound, j'ai bien compris que ça vient du protocole HTTPS et son ordre de négociation.
D'ailleurs, ça se vérifie quand je change le port.
Si je mets à l'un des virtualhosts le port 444 au lieu de 443, la restriction par certificat fonctionne et Apache ne crie plus que je n'ai pas de virtualhost déclaré.
Auriez-vous des liens ou astuces à me donner pour authentifier des utilisateurs sur un virtualhost selon leurs certificats un peu comme ce qu'on fait avec un .htaccess mais sans restriction de mot de passe ou IP... ?
Merci.
Configuration Apache
il vous manque juste la directive NameVirtualHost pour le port 444 de votre Apache. Il faut autoriser explicitement les virtualhost pour chaque port ouvert de apache.
Je vous invite par ailleurs a vous reporter à un forum comme celui d'apache france (http://apache-france.org) pour obtenir des réponses spécifiques à vos problèmes Apache.
Sincèrement,
re: Configuration Apache
Mais le problème, c'est que si les 2 virtualhosts sont paramétrés sur le port 443, j'obtiens l'erreur suivante :
[Thu Apr 02 12:25:28 2009] [warn] NameVirtualHost site2.mydomain.tld:443 has no VirtualHosts
Si je change uniquement le port de l'un des virtualhosts, je n'ai plus de warning et aussi j'ai bien la restriction qui fonctionne comme je veux.
J'entends par là que l'accès à site1 n'est possible qu'avec un certificat qui est posé dans le dossier renseigné par SSLCACertificatePath dans le virtualhost.
Bon, j'ai installé un nouveau serveur pour suivre votre tuto au lieu de faire avec easy-rsa.
Merci pour votre réponse.
re: Configuration Apache
<IfModule mod_ssl.c>
# SSL name based virtual hosts are not yet supported, therefore no
# NameVirtualHost statement here
Listen 443
</IfModule>
C'est donc explicitement précisé les vhosts SSL ne sont pas supportés.
Je ne sais plus quoi faire.
Bon, comme je dispose de plusieurs IP publiques, je vais peut-être choisir la solution de facilité : 1 IP == 1 virtualhost
les virtuals hosts ssl fonctionnent mais ....
Bon courrage
résolu
j'ai trouvé une solution pour autoriser l'accès à un virtualhosts selon le certificat présenté.
Il s'agit d'utiliser la directive SSLRequire qui permet l'équivalent des .htaccess
hi
mod ssl
la commande suivante devrait faire l'affaire :
command a2enmod ssl
/etc/init.d/apache2 force-reload
bon courage
config apache multi ip ssl
<VirtualHost XX.XX.XX.XX:443>
domain.com sans sous domaine.
j'utilise ton systeme de certificat multi domaine et j'en suis tres content
malheureusement je ne trouve pas de moyen de faire en sorte que le certificat marche a la fois pour
*.domain.com
et
domaine.com
en creant un certificat avec comme domaine *.domaine.com
si je me rends sur domain.com
je me retrouve avec l'erreur suivante :
Le certificat n'est valide que pour *.domain.com
si je cree un certificat en mettant domain.com et *.domaine.com
je me retrouve avec l'erreur :
Le certificat n'est valide que pour domain.com
sur tout mes sous domaine
a croire que le certificat ne prend pas en compte le fait que je mette domain.com puis une wilcard sur ce meme domaine ...?
aurai tu plus d'info la dessus ? et eventuellement une solution ?
domain.com sans sous domaine.
j'utilise ton script pour signer mes certificats
et dailleur quand je signe ceux ci
je ne vois que le premier domaine de la liste dans les details du certificat
affiches lors de la signature de celui ci.
serai-ce de la que viendrais mon probleme ...?
Signature CA avec SubjectAltName
copy_extensions=copy
en dessous de [ CA_Default ] dans le fichier "/etc/openssl/ca_openssl.cnf" de façon à avoir :
...
[ CA_default ]
copy_extensions = copy
...
Après il faut refaire sa propre clef CA ( c'est le coté pas cool :( )
Refaire le certificat serveur:
et mettre tout les url dans SubjectAltName, même le site de base, à priori apache ou firefox ne n'utilise plus "Nom de votre domaine [défaut : my-domain.com]" quand on signe plusieurs sites
Ex:
Nom de votre domaine [défaut : my-domain.com]: mon-site.com
Noms de domaines supplémentaires, un par ligne. Finissez par une ligne vide.
SubjectAltName: DNS: mon-site.com
SubjectAltName: DNS: *.mon-site.com
SubjectAltName: DNS: encore.com
SubjectAltName: DNS:
puis signé la clef avec le nouveau CA et bien vérifier que les DNS apparaisse bien dans la signature
/etc/openssl/cert_manager.sh --sign-csr=https
...
Netscape CA Revocation Url:
https://www.mon-site.com/ca-crl.pem
X509v3 Subject Alternative Name:
DNS:mon-site.com, DNS:*.mon-site.com
Certificate is to be certified until Jun 25 12:04:12 2011 GMT (365 days)
...
Voilà qui devrais déjà bien aider :)
Signature CA avec SubjectAltName
C'est pas la mort de tout refaire pour le CA.
Moi sa ma prit 3min a peine pour l'autorité et le certificat serveur.
Par contre le *.ndd.tld voulait pas.
Mais sa marche pépère.
Bonne continuation
ne marche pas
ça ne marche pas, ne semble être recevable que pour domain.com