Post

Configuration nginx , ssl (tls1.2 tls1.3) , Diffie Hellman ,Headers et OCSP

Obtenir A+ sur SSL Labs

Configuration nginx , ssl (tls1.2 tls1.3) , Diffie Hellman ,Headers et OCSP

Configuration nginx

fichier /etc/nginx/ssl_dh_header_ocsp

  • Les certificats Let’s Encrypt du domaine dans /etc/ssl/private/
  • Remplacer le domaine xoyize.xyz par le votre
  • Diffie-Hellman : openssl dhparam -out /etc/ssl/private/dh2048.pem -outform PEM -2 2048
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    ##
    # SSL Settings
    ##
    ssl_certificate /etc/ssl/private/xoyize.xyz-fullchain.pem;
    ssl_certificate_key /etc/ssl/private/xoyize.xyz-key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    ssl_dhparam /etc/ssl/private/dh2048.pem;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;


    add_header Content-Security-Policy "upgrade-insecure-requests; "; 
    add_header Content-Security-Policy "default-src 'self'; font-src *;img-src * data:; script-src *; style-src *;";
    add_header Feature-Policy "geolocation none;midi none;microphone none;camera none;fullscreen self;payment none;";

    # Add headers to serve security related headers
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;
    add_header X-Frame-Options "SAMEORIGIN"; 
    add_header Referrer-Policy "no-referrer" always;

    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

    # OCSP settings
    ssl_stapling on;
    ssl_stapling_verify on;
    #ssl_trusted_certificate /etc/ssl/private/xoyize.xyz-fullchain.pem;
    ssl_trusted_certificate /etc/ssl/private/ocsp-certs.pem;
    resolver 127.0.0.1;

Le fichier est à inclure dans tous les fichiers de configuration des VHOST , exemple

1
/etc/nginx/conf.d/sub.xoyize.xyz.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
    listen 80;
    listen [::]:80;

    ## redirect http to https ##
    server_name sub.xoyize.xyz;
    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name sub.xoyize.xyz;

    include ssl_dh_headers_ocsp;

    location / {
	proxy_pass http://192.168.0.45:4040;
    }

}

Que sont les dossiers de la CAA ?

CAA signifie “Certificate Authority Authorization” et est un type spécial d’enregistrement DNS qui indique quelles autorités de certification peuvent émettre des certificats pour votre domaine et sous-domaines. Il a également une méthode d’envoi d’alertes chaque fois qu’une autorité de certification reçoit une demande pour un nouveau certificat qui est interdit selon vos dossiers CAA.

DNS OVH → Domaines (sélectionner le domaine) → Zone DNSAjouter une entrée de type CAA

1
    3600 IN CAA    0 issue "letsencrypt.org"

Vérification : CAA record check

SSL cipher dh

Modifier le fichier /etc/nginx/conf.d/default.conf ou le fichier de configuration du VHOST

1
2
3
4
5
6
7
8
9
10
11
12
    # certificats ssl let's encrypt
    ssl_certificate /etc/ssl/private/xinyiczen.xyz.crt.pem;
    ssl_certificate_key /etc/ssl/private/xinyiczen.xyz.key.pem;

    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!3DES:+HIGH:+MEDIUM;

    # Clé Diffie-Hellman (DH)
    ssl_dhparam /etc/ssl/private/dh4096.pem;

OCSP Stapling (Online Certificate Status Protocol )

Mise en place de l’OCSP Stapling (Online Certificate Status Protocol ) sur NGINX
On va télécharger les certificats que Let’s Encrypt utilise pour signer les certificats qu’il délivre.
Let’s Encrypt utilise uniquement Let’s Encrypt Authority X3 pour signer les certificats et garde Let’s Encrypt Authority X4 en cas de problèmes. X1 et X2 ne sont plus utilisés.
Intégration de X3 et X4 dans un fichier par concaténation :

1
2
3
cd /etc/ssl/private
rm -f ocsp-certs.pem
wget -O- https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem https://letsencrypt.org/certs/lets-encrypt-x4-cross-signed.pem | tee -a ocsp-certs.pem > /dev/null

Modification du fichier de configuration principal /etc/nginx/nginx.conf:

1
nano /etc/nginx/nginx.conf

Et ajoutez ceci dans la balise http { :

1
2
3
4
5
6
7
    ##OCSP settings
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/ssl/private/ocsp-certs.pem;
    # Facultatif (utiise par défaut les DNS contenus dans resolv.conf)
    #resolver 8.8.4.4 8.8.8.8 valid=300s;
    #resolver_timeout 5s;

headers

Tout ce qui suit peut être à l’intérieur d’un fichier .conf situé soit sous /etc/nginx/conf.d ou dans le cas d’une installation yunohost , sous /etc/nginx/conf.d/domaine.tld.d/
domaine.tld est à remplacé par le nom du domaine déclaré à l’installation de yunohost

L’en-tête CSP permet d’autoriser seulement les domaines déclarés à exécuter du script JavaScript, une feuille de style css, etc… (ici domaine xinyiczen.xyz et uniquement en https)

Content Security Policy

1
2
3
    ## CSP nginx
    # add_header Content-Security-Policy "default-src 'self' *.xinyiczen.xyz; img-src 'self' data: https: *.xinyiczen.xyz"; # TROP BLOQUANT
    add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'";

X-Frame-Options

1
2
    # autoriser uniquement les Iframes provenant du même domaine
    add_header X-Frame-Options SAMEORIGIN;

X-XSS-Protection

1
2
    # activer la protection contre les attaques Xss et MIME
    add_header X-XSS-Protection "1; mode=block";

X-Content-Type-Options

1
    add_header X-Content-Type-Options nosniff;

Vérification de la mise en place des headers

Pour la prise en compte des ajouts dans la configuration du block serveur, il faut relancer le service nginx :

1
systemctl restart nginx

Avec l’aide de la commande curl, on va vérifier les différentes en-têtes (headers) :

1
curl -I https://xinyiczen.xyz

Résultat :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HTTP/1.1 200 OK
Server: nginx/1.10.1
Date: Thu, 24 Nov 2016 09:14:27 GMT
Content-Type: text/html
Content-Length: 868
Last-Modified: Wed, 23 Nov 2016 19:43:09 GMT
Connection: keep-alive
ETag: "5835f14d-364"
Strict-Transport-Security: max-age=31536000;includeSubDomains
Content-Security-Policy: default-src 'self' *.xinyiczen.xyz; img-src 'self' data: https: *.xinyiczen.xyz
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Accept-Ranges: bytes

Liens

Cet article est sous licence CC BY 4.0 par l'auteur.