Hébergement virtuel en SSL avec VirtualDocumentRoot

Je fais mon travail de développement sur une machine virtuelle Ubuntu 16.04

Comme je travaille sur un certain nombre de projets, pour me faciliter la vie, j’utilise VirtualDocumentRoot et le fichier hosts sur les sites de serveur à partir de mon dossier de départ en utilisant les domaines * .dev:

En 000-default.conf j’ai:

 VirtualDocumentRoot /home/steve/websites/%-2/%-2/public_html ServerAlias *.dev  

alors dans les hôtes j’ai les différents sites sur lesquels je travaille:

 127.0.0.1 somesite.dev 127.0.0.1 another.dev 127.0.0.1 athirdone.dev 127.0.0.1 blog.athirdone.dev 

De cette façon, lorsque j’ajoute un nouveau projet, il me suffit de créer la structure de dossiers appropriée dans le répertoire des sites Web et d’append une ligne aux hôtes, par exemple si je souhaite travailler sur un nouveau projet, somecoolproject.dev.

 /home/steve/websites/somecoolproject/somecoolproject/public_html 

et une ligne dans les hôtes:

 127.0.0.1 somecoolproject.dev 

Et je vais bien.

Quoi qu’il en soit, à peu près tout ce que je travaille fonctionne maintenant sur https, et beaucoup de projets ont du code pour l’appliquer, que ce soit dans le code source ou htaccess, etc.

Je voudrais créer un certificate auto-signé sur ma machine de développement, et idéalement d’une manière que je n’ai pas besoin d’en générer un nouveau pour chaque projet, donc une sorte de caractère générique * .dev serait génial.

Mais même si je dois en créer un pour chaque projet, je n’arrive toujours pas à comprendre comment l’installer avec ma configuration – tout ce que je trouve suppose un document fixe et un nom de serveur codé en dur.

Si je comprends bien les exigences, vous voulez savoir:

  • Comment générer un certificate SSL générique pour * .dev
  • comment configurer apache localement avec une configuration qui permettrait au serveur n’importe quel domaine * .dev sur SSL / TLS sans modifier la configuration car de nouveaux domaines * .dev sont créés.

Si j’ai bien compris cela, c’est certainement faisable.

Comment cela fonctionnera-t-il : indication du nom du serveur SNI, extension du protocole TLS dans laquelle le nom d’hôte est transmis lors de l’établissement de la connexion TLS, alors que les données HTTP (telles que l’en-tête de l’hôte) sont disponibles. Tous les navigateurs Web populaires, curl, tous les serveurs Web populaires le supportent.

Pas:

Premier. Générez le cert:

 mindaugas@mindaugas-ubuntu-14:/usr/local/apache2/conf$ sudo openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt Generating a 2048 bit RSA private key .............+++ ..................+++ writing new private key to 'domain.key' ----- You are about to be asked to enter information that will be incorporated into your certificatee 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]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg server FQDN or YOUR name) []:*.dev Email Address []: 

La partie clé est la suivante:

Common Name (eg server FQDN or YOUR name) []:*.dev

Seconde.

Configuration du serveur:

 Listen 443  SSLEngine on SSLCertificateFile "/usr/local/apache2/conf/domain.crt" SSLCertificateKeyFile "/usr/local/apache2/conf/domain.key" VirtualDocumentRoot /home/mindaugas/websites/%-2/pubic/ ServerAlias *.dev  Options Indexes FollowSymLinks MultiViews AllowOverride All Allow from All Require all granted   

Activez ssl et redémarrez apache:

 sudo a2enmod ssl sudo service apache2 restart 

Vous pouvez tester ceci par:

  • créer deux structures de fichiers de documents;
  • les remplir avec une simple page HTML;
  • émettre des requêtes en fournissant le mappage domain-ip dans le fichier hosts OU, comme je l’ai fait, avec le plugin “Modify headers”, en émettant différents en-têtes d’hôtes si nécessaire:

entrer la description de l'image ici

Nous aimons les primes car c’est un peu long d’écrire la solution pour vous 🙂 La vraie réponse à votre question est de savoir comment la faire fonctionner, alors que VirtualDocumentRoot ne fonctionnera pas en SSL. Je suggère de proxy les demandes de l’hôte virtuel SSL par défaut, à l’hôte virtuel non-ssl dynamic. Ceci est possible en conservant le nom d’hôte demandé.

Tout d’abord, faites tout le travail préliminaire: 1 / générez votre clé privée et votre certificate (un joker si vous le voulez), il y a beaucoup de tutoriels pour cela, 2 / dans votre httpd.conf principal, vous activez le ssl.conf

Dans le httpd-ssl.conf, vous avez besoin de cette conf (je l’ai testée avec succès):

 UseCanonicalName Off ProxyPreserveHost On SetEnvIf Server_Addr "(.*)" sname=$1 RewriteEngine On RewriteCond "%{HTTPS}" =on RewriteRule ^/(.*)$ "http://%{ENV:sname}:80/$1" [P] 

Je suggère également de personnaliser le format du journal, puis vous voyez mieux ce qui est demandé. Cela facilitera le débogage ultérieur, et voici quelques directives pour vous connecter avec le nom d’hôte demandé, et vous pouvez reconnaître le trafic SSL ou non SSL par la longueur des lignes de journal. Dans httpd.conf, recherchez l’endroit où le LogFormat est défini et ajoutez:

 LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" enhanced LogFormat "%V %h %l %u %t \"%r\" %>s %b" enhancedSSL CustomLog "logs/access_log" enhanced 

dans httpd-ssl.conf, vous avez juste besoin de celui-ci:

 CustomLog "logs/access_log" enhancedSSL 

Dites-nous si cela fonctionne comme prévu. Une fois le travail effectué, l’étape suivante consiste probablement à désactiver le trafic non-SSL au moins depuis la télécommande. Pour ce faire, configurez le pare-feu local pour qu’il bloque les requêtes sur le port 80 ou (mieux) configurez VirtualHost pour qu’il n’écoute que localement (VirtualHost 127.0.0.1:80 au lieu de *: 80).