[Tuto] Serveur WEB – Nginx PHP7, HTTPS et HTTP2

Ce guide va vous expliquez comment avoir un certificat SSL chez Gandi et comment mettre en place un serveur WEB avec la configuration SSL.
Nous utiliserons Nginx qui est un serveur WEB très léger et très performant avec php-fpm.

Nous allons commençer par obtenir notre certificat, pour cela il va falloir dans un premier temps générer la CSR qui est un fichier contenant les informations de votre demande de certificat, y compris votre clé publique. Vous devez générer cette clé à partir de votre serveur.

1 – Creation d’une clé privé et une demande de certificat
2 – Creation d’un certificat chainé
3 – Installation de nginx
4 – Modifier les droits sur la clé privée
5 – Générez un dhpram
6 – Configuration de nginx
7 – Création d’un répertoire de logs
8 – Configuration de php-fpm
9 – Redémarrer les services

.

$ sudo -s
password :
#

1 – Creation d’une clé privé et une demande de certificat

# openssl req -nodes -newkey rsa:4096 -sha256 -keyout domain.tld.key -out domain.tld.csr

Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: Region
Locality Name (eg, city) []: Votre ville
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Votre Société
Organizational Unit Name (eg, section) []: IT
Common Name (eg, YOUR name) []: domaine.tld
Email Address []:
A challenge password []:
An optional company name []:

Le processus va créer 2 fichiers : un public en .csr et un privé en .key qu’il faudra absolument garder

Les champs optional company name et challenge password sont facultatifs.

Il est préférable de remplir le champ Email Address.
domaine.tld indique l’adresse que vous voulez protéger.

Copier le contenu du fichier domain.tld.csr :

# cat domain.tld.csr

-----BEGIN CERTIFICATE REQUEST-----
...encrypted text...
...encrypted text...
...encrypted text...
-----END CERTIFICATE REQUEST-----

Rendez vous sur https://www.gandi.net/ssl/create/csr et coller le contenue de domain.tld.csr dans le formulaire CSR*, si vous n’avez pas fait d’erreur le champ Domaine (CN) principal doit afficher votre nom de domaine.
-> Dans la liste déroulante “Logiciel utilisé” sélectionnez : nginx

Suivez les instructions, le certificat coute environ 12€, une fois vous recevez votre certificat .crt copier le contenue dans le fichier domain.tld.crt
Nous avons donc maintenant 3 fichiers :
– domain.tld.crt
– domain.tld.csr
– domain.tld.key

.

2 – Creation d’un certificat chainé

# wget https://www.gandi.net/static/CAs/GandiStandardSSLCA2.pem
# wget http://crt.usertrust.com/USERTrustRSAAddTrustCA.crt

# cat USERTrustRSAAddTrustCA.crt GandiStandardSSLCA2.pem > TrustedCA.pem
# cat USERTrustRSAAddTrustCA.crt GandiStandardSSLCA2.pem >> domain.tld.crt

.

3 – Installation de nginx

# aptitude install nginx php7.0-fpm

Deplacez les certicats dans le dossier /etc/nginx/certs

# mkdir /etc/nginx/certs
# mv domain.* TrustedCA.pem /etc/nginx/certs

.

4 – Modifier les droits sur la clé privée

# chmod 400 domain.tld.key

.

5 – Générez un dhpram

# openssl dhparam -out /etc/nginx/certs/dhparam.pem 4096

.

6 – Configuration de nginx

$ vim /etc/nginx/conf.d/domain.tld.conf

upstream php-handler {
  server 127.0.0.1:9000;
  #server unix:/var/run/php7.0-fpm.sock;
}

server {
  listen 80;
  listen [::]:80;
  server_name site.domain.tld;
  # Obliger la connexion en https
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name site.domain.tld;

  # Fichier de log
  access_log /var/log/nginx/site-access.log;
  error_log /var/log/nginx/site-error.log;

  # Parametres pour SSL/TLS
  ssl_certificate /etc/nginx/certs/certificat.crt;
  ssl_certificate_key /etc/nginx/certs/certificat.key;
  ssl_dhparam /etc/nginx/certs/dhparam.pem;
  ssl_ciphers 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECD
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;
  ssl_prefer_server_ciphers on;

  # Ajout de header liés à la sécurité
  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; prel
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Robots-Tag none;
  add_header Alternate-Protocol 443:npn-spdy/3;

  # Répertoire dans lequel est installé Owncloud
  root /var/www/site/;

  # Forcer l'encodage en UTF8
  charset utf-8;

  # Taille de fichier maximum  que l'on peut téléverser/uploader
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  # Désactivation de la compression pour éviter la suppression du header ETag
  gzip off;

  # Page index du site
  index index.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
  }

  location / {
    try_files $uri $uri/ /index.php;
  }

  location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HTTPS on;
    fastcgi_param modHeadersAvailable true;
    fastcgi_pass php-handler;
  }

  # Optionnel : positionne un header EXPIRES long sur les ressources statiques
  location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
    expires 30d;
    # Optionnel : ne pas logger l'accès aux ressources statiques
    access_log off;
  }
}

.

7 – Création du répertoire de logs

# mkdir /var/log/nginx/domain.tld
# chown www-data:www-data /var/log/nginx/domain.tld/

.

8 – Configuration de php-fpm

# vim /etc/php/7.0/fpm/pool.d/www.conf

Remplacer : listen = /var/run/php7.0-fpm.sock
par : listen = 127.0.0.1:9000

.

9 – Redémarrer les services

# service nginx restart
# service php7.0-fpm restart

Enjoy, votre si est désormée en HTTPS avec un certificat SSL signer et reconnus.
Vous pouvez tester sur https://www.ssllabs.com/ssltest/ et avoir un jolie A+ 🙂

2 thoughts on “[Tuto] Serveur WEB – Nginx PHP7, HTTPS et HTTP2

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *