Apache/HTTPS

Un livre de Wikilivres.
Aller à : navigation, rechercher
Apache
La plume, symbole d'Apache
Plan
  1. Installation d'Apache
  2. Plusieurs sites par machine
  3. Serveurs virtuels (vhost)
  4. Répertoires utilisateurs
  5. Ré-écriture d'URL
  6. .htaccess
  7. Cache web
  8. Connexion sécurisée (HTTPS)
  9. Common Gateway Interface (CGI)
  10. Débogage
Modifier ce modèle
Avertissement à accepter par les visiteurs en cas de certificat autosigné.

Généralités[modifier | modifier le wikicode]

Contrairement au protocole HTTP, HTTPS garantit la confidentialité et l'intégrité des données échangées entre un serveur web et ses clients, et par conséquent il convient mieux aux transactions sensibles comme les flux bancaires. En effet il permet de se prémunir de l'attaque de l'homme du milieu en cryptant les communications.

Pour mettre en place ce protocole, il faut juste activer l'extension Apache et ajouter une directive pour le port 443[1] avec un certificat électronique.

Types de clé[modifier | modifier le wikicode]

Un certificat électronique (.crt) est issu d'une demande d'identification (.csr pour Certificate Signing Request[2]). Ce dernier est généralement payant, à renouveler chaque année, car délivré par une autorité de certification, mais :

  • Il est possible le créer soi-même[3], ce qui aura pour effet d'afficher un avertissement d'exception de sécurité aux visiteurs.
  • Sur Ubuntu, il existe déjà /etc/ssl/private/ssl-cert-snakeoil.key, mais l'avertissement sera le même.
  • StartSSL en fournit gratuitement à des fins non commerciales :
    1. S'authentifier sur https://www.startssl.com/ (bouton avec des clés en haut à droite).
    2. Menu Validations Wizard, Domain Validation, préciser l'adresse du site vers lequel accéder en HTTPS.
    3. Certificates Wizard, Generate private key, entrer un mot de passe supérieur à 10 lettres et chiffres (sans symbole spécial). Puis copier la clé SSL générée pour l'installer sur le serveur Apache.
    4. Préciser le sous-domaine du site pour obtenir le certificat après validation manuelle de StartCom.
  • GeoTrust en propose également un valide 30 jours[4].
  • SSLmarket France offre aussi des certificats SSL Gratuits de Symantec , RapidSSL , Geotrust et Thawte pour 30 jours.

Linux[modifier | modifier le wikicode]

OpenSSL est une implémentation open source des protocoles SSL et TLS[5].

Prérequis[modifier | modifier le wikicode]

Apache + Mod SSL + OpenSSL (disponible depuis Synaptic).

Ajouter le module SSL à Apache 2[6] :

commande nécessitant les privilèges root

# a2enmod ssl

Ajouter Listen 443 à /etc/apache2/ports.conf

commande nécessitant les privilèges root

# echo "Listen 443" >> /etc/apache2/ports.conf

Générer un certificat autosigné :

commande nécessitant les privilèges root

# apache2-ssl-certificate

Si la commande est introuvable :

commande nécessitant les privilèges root
# apt-get install ssl-cert
# /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem


Pour rendre possible la connexion en SSL, la configuration Apache suivante :

 vim /etc/apache2/apache2.conf
# ou
 vim /etc/apache2/sites-available/default-ssl
 a2ensite default-ssl

doit comprendre dans chaque vhost concerné :

 Fichier : le fichier de configuration
 <VirtualHost *:443>
   SSLEngine on
   #SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
   #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
   SSLCertificateFile /etc/apache2/ssl/apache.crt
   SSLCertificateKeyFile /etc/apache2/ssl/apache.key
   ...

Puis on relance Apache :

service apache2 reload

Pour tester :

curl https://monURL

Si la clé nécessite un mot de passe :

 SSLPassPhraseDialog exec:/etc/ssl/nomdedomaine.fr.pwd

Personnalisation[modifier | modifier le wikicode]

Pour personnaliser les directives (ex : ajouter SuexecUserGroup), il suffit de copier le contenu de :

vim /etc/apache2/apache2.conf

dans

vim /etc/apache2/sites-available/default-ssl.conf

en remplaçant :80 par :443.

Création de la clé[modifier | modifier le wikicode]

La structure des commandes est celle du shell Unix :

openssl command [ command_opts ] [ command_args ]

Exemples[modifier | modifier le wikicode]

Générer un fichier ".key"[modifier | modifier le wikicode]

On choisit de générer une clef de 2048 bits, car c'est le minimum pour les vendeurs de certificats SSL. Voici la commande :

openssl genrsa -out nomdedomaine.fr.key 2048

Demande de chiffrement[modifier | modifier le wikicode]

Générer une demande de certificat avec la commande :

openssl req -new -key nomdedomaine.fr.key -out nomdedomaine.fr.csr

Pour la question State or Province Name, mettre son département (français).

Puis on peut l'envoyer à une autorité de certification, ou bien l'autosigner avec :

openssl x509 -req -days 365 -in nomdedomaine.fr.csr -signkey nomdedomaine.fr.key -out nomdedomaine.fr.crt

Récapitulatif testé sur Ubuntu[7] :

openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Ensuite il faut dire à Apache d'utiliser le .crt.

Windows[modifier | modifier le wikicode]

Prérequis[modifier | modifier le wikicode]

Ajouter le module SSL en décommentant la ligne suivante de httpd.conf :

#LoadModule ssl_module modules/mod_ssl.so

La directive sur le port 443 s'effectue ensuite dans le fichier suivant (vide par défaut), selon le logiciel :

  • C:\Program Files (x86)\EasyPHP\binaries\apache\conf\inc_virtual_hosts.conf
  • C:\Program Files (x86)\WAMP\bin\apache\Apache2.2.21\conf\extra\httpd-vhosts.conf

Mais httpd.conf contient un commentaire avec : #<VirtualHost _default_:443>.

Il faut y renseigner l'emplacement du ssl.crt ci-dessous à créer avant de décommenter, sous peine d'erreur Apache.

Création du certificat autosigné[modifier | modifier le wikicode]

Lancer une console DOS :

>cd "C:\Program Files (x86)\EasyPHP\binaries\apache\bin"
>openssl req -config "C:\Program Files (x86)\EasyPHP\binaries\php\php_runningversion\extras\ssl\openssl.cnf" -new -out Certificat_1.csr
WARNING: can't open config file: c:/openssl-1.0.1e/ssl/openssl.cnf
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
..........++++++
.........++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
...
>openssl rsa -in privkey.pem -out Certificat_1.key
>openssl x509 -in Certificat_1.csr -out Certificat_1.cert -req -signkey Certificat_1.key -days 365

Cela a généré les fichiers à renseigner dans la directive :

  • C:\Program Files (x86)\EasyPHP\binaries\apache\bin\Certificat_1.csr.
  • C:\Program Files (x86)\EasyPHP\binaries\apache\bin\Certificat_1.key.
  • C:\Program Files (x86)\EasyPHP\binaries\apache\bin\Certificat_1.cert.

Le CSR n'a pas besoin d'être renseigné dans les directives, le certificat fichier expire après 365 jours[8].

Autres aspects de sécurité[modifier | modifier le wikicode]

Le module headers[9] peut assurer la protection contre le XSS[10] et le clickjacking. Exemple :

  <IfModule mod_headers.c>
        # Filtre sur les provenances des scripts, séparées par des espaces
        Header set Content-Security-Policy "default-src 'self' *.nomdedomaine.fr *.nomdedomaine.com"
        # Indication anti-XSS pour les navigateurs
        Header always set X-XSS-Protection "1; mode=block" 
        # Anti-clickjacking             
        Header always set X-FRAME-OPTIONS "SAMEORIGIN"
        # Antivol de cookie         
        Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
  </IfModule>
link={{{link}}}Attention !

Cela bloque les iFrames.

Pour tester une configuration, mieux vaut commencer par un .html plutôt que de la déployer sur tout le serveur en le redémarrant puis de faire machine arrière. Si en définissant la règle la plus permissive Firefox bloque tout de même quelque chose (Content Security Policy: Les paramètres de la page ont empêché le chargement d'une ressource à self ), il s'agit d'un bug connu qui n'affecte pas les autres navigateurs :

<head>
    <meta http-equiv="Content-Security-Policy" content="default-src *">
</head>

Par ailleurs, des sites d'audit gratuits peuvent ensuite révéler s'il reste des failles[11].

Références[modifier | modifier le wikicode]