{"id":64,"date":"2020-01-12T20:10:36","date_gmt":"2020-01-12T19:10:36","guid":{"rendered":"http:\/\/tartine.linkpc.net\/?p=64"},"modified":"2020-01-12T20:10:36","modified_gmt":"2020-01-12T19:10:36","slug":"site-web-sur-raspberry-pi-partie-5-https","status":"publish","type":"post","link":"https:\/\/blog.nibelheim.fr\/?p=64","title":{"rendered":"Site Web sur Raspberry Pi, partie 5 : HTTPS"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Les certificats<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sur la route du tant convoit\u00e9 HTTPS, nous allons maintenant nous faire certifier.<br>Je vais l\u00e0 encore suivre des tutoriels, mais sachez qu&#8217;il existe des certificats <strong>autosign\u00e9s <\/strong>et des certificats <strong>sign\u00e9s par une autorit\u00e9 reconnue<\/strong>.<br>Il va sans dire que les premiers sont beaucoup moins consid\u00e9r\u00e9s comme valides, l\u00e0 o\u00f9 les deuxi\u00e8mes sont le standard de fait <em>(quelle est la valeur de la certification si tout le monde peut la faire, s&#8217;pas?)<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si vous \u00eates pass\u00e9s par un site payant ou DNSExit pour obtenir votre domaine, sachez que ces sites peuvent vous proposer des certificats tout faits.<br>Nous, comme on mange des gu\u00eapes frites dans l&#8217;huile de bo\u00eete de vitesses, on va faire \u00e7a \u00e0 l&#8217;ancienne avec l&#8217;ami Certbot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Oui, mais attends, tu dis qu&#8217;on fait \u00e7a nous-m\u00eames, alors quelle est la valeur de ces certificats?<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tr\u00e8s juste, Auguste, mais Certbot obtient des certificats sign\u00e9s <strong>aupr\u00e8s d&#8217;une autorit\u00e9 reconnue<\/strong>, <strong>il n&#8217;autosigne pas<\/strong> les certificats, et la diff\u00e9rence est cruciale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les choses ont bien chang\u00e9 depuis mes premi\u00e8res tentatives de HTTPS, merci donc \u00e0 <a href=\"https:\/\/howto.wared.fr\/ubuntu-certificats-ssl-tls-certbot\/\">cet excellent tuto<\/a> pour la simplicit\u00e9 de la m\u00e9thode (de mon temps, il fallait toucher \u00e0 la config du site dans nginx pour que les challenges n\u00e9cessaires \u00e0 la cr\u00e9ation des certifs fonctionnent&#8230;).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsque vous en serez \u00e0  <strong>Modifiez votre <em>virtual host<\/em> en fonction de votre serveur <em>Nginx<\/em> ou <em>Apache<\/em><\/strong>, revenez ici \ud83d\ude42<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configuration SSL dans nginx<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons donc notre certificat en poche <em>(\u00e7a a fonctionn\u00e9 du premier coup en suivant pas \u00e0 pas son tuto, dans mon cas)<\/em>, il va donc falloir modifier notre descripteur de site en cons\u00e9quence.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano \/etc\/nginx\/sites-available\/monsite<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous allons cr\u00e9er un deuxi\u00e8me bloc server {} qui ne va contenir que la redirection en HTTPS. Pourquoi? Parce que tous les navigateurs, selon leurs r\u00e9glages, n&#8217;interrogent pas d&#8217;abord sur le <strong>port 443<\/strong> <em>(SSL, donc s\u00e9curis\u00e9, donc bien)<\/em>, mais sur le <strong>port 80<\/strong> (celui que nous avons utilis\u00e9 jusqu&#8217;\u00e0 pr\u00e9sent, qui est le port HTTP, et pas HTTPS).<br>L&#8217;id\u00e9e va donc \u00eatre <strong>d&#8217;accepter les communications sur port 80, mais seulement pour les renvoyer vers le port 443<\/strong>, en mode beau gosse. Vous allez voir, \u00e7a se fait comme qui rigole. Voici notre descripteur de site avec ses modifs en gras :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">server {\n    listen 80;\n    listen [::]:80;\n    server_name domaine.com www.domaine.com;\n    # Renvoi vers le port 443\n    location \/ {\n        return 301 https:\/\/$server_name$request_uri;\n    }\n}\nserver {\n    listen 443 ssl;\n    listen [::]:443 ssl;\n    server_name domaine.com www.domaine.com;\n    index index.php index.html;\n    root \/var\/www\/html;\n    access_log \/var\/www\/logs\/access.log;\n    error_log  \/var\/www\/logs\/error.log;\n    <strong># En avant pour SSL :)\n    ssl_certificate     \/etc\/letsencrypt\/live\/domaine.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/domaine.com\/privkey.pem;\n    ssl_trusted_certificate \/etc\/letsencrypt\/live\/domaine.com\/chain.pem;\n    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;\n    ssl_prefer_server_ciphers on;\n    ssl_ciphers         ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;\n    ssl_ecdh_curve      secp384r1;\n    ssl_session_cache   shared:SSL:4m;\n    ssl_session_timeout 1440m;\n    ssl_stapling        on;\n    ssl_stapling_verify on;\n    resolver        8.8.8.8 8.8.4.4;\n    add_header      Strict-Transport-Security max-age=31536000;\n    # Hop fini !<\/strong>\n    open_file_cache max=1000 inactive=20s;\n    open_file_cache_valid 30s;\n    open_file_cache_min_uses 2;\n    open_file_cache_errors on;\n    set $cache_uri $request_uri;\n    # POST requests and urls with a query string should always go to PHP\n    if ($request_method = POST) {\n        set $cache_uri 'null cache';\n    }\n    if ($query_string != \"\") {\n        set $cache_uri 'null cache';\n    }\n    # Don't cache uris containing the following segments\n    if ($request_uri ~* \"(\/wp-admin\/|\/xmlrpc.php|\/wp-(app|cron|login|register|mail).php|wp-.<em>.php|\/feed\/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(index)?.xml|[a-z0-9-]+-sitemap([0-9]+)?.xml)\") {\n        set $cache_uri 'null cache';\n    }\n    # Don't use the cache for logged in users or recent commenters\n    if ($http_cookie ~<\/em> \"comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in\") {\n        set $cache_uri 'null cache';\n    }\n    include \/etc\/nginx\/fcgiwrap.conf;\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$args;\n    }\n    location ~ .php$ {\n    # FASTCGI CACHE\n    set $skip_cache 1;\n    if ($cache_uri != \"null cache\") {\n        add_header X-Cache-Debug \"$cache_uri $cookie_nocache $arg_nocache$arg_comment $http_pragma $http_authorization\";\n        set $skip_cache 0;\n    }\n    fastcgi_cache_bypass $skip_cache;\n    fastcgi_cache microcache;\n    fastcgi_cache_key $scheme$host$request_uri$request_method;\n    fastcgi_cache_valid any 8m;\n    fastcgi_cache_use_stale updating;\n    fastcgi_cache_bypass $http_pragma;\n    fastcgi_cache_use_stale updating error timeout invalid_header http_500;\n    # \/FASTCGI CACHE\n    fastcgi_pass unix:\/var\/run\/php\/php7.0-fpm.sock;\n    # fastcgi_pass 127.0.0.1:9000;\n    fastcgi_split_path_info ^(.+.php)(\/.+)$;\n    fastcgi_index index.php;\n    include fastcgi_params;\n    fastcgi_param SCRIPT_FILENAME $document_root\/$fastcgi_script_name;\n    fastcgi_read_timeout 300;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Au terme de la modification du descripteur, comme d&#8217;habitude, proc\u00e9dez \u00e0 un petit :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo service nginx reload<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Et s&#8217;il n&#8217;y a pas de rat\u00e9, tout devrait se passer comme sur des roulettes! Vous devriez maintenant pouvoir acc\u00e9der \u00e0 votre site depuis l&#8217;ext\u00e9rieur, avec un nom de domaine <em>(aussi glorieux &#8211; ou non &#8211; qu&#8217;il puisse \u00eatre)<\/em> ET le tout avec le petit cadenas du HTTPS! Elle est pas belle, la vie ?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ceci fait, n&#8217;oubliez pas de proc\u00e9der \u00e0 l&#8217;ouverture du port 443 au m\u00eame titre que vous l&#8217;avez fait pour le port 80 (<a href=\"https:\/\/tartine.linkpc.net\/site-web-sur-raspberry-pi-partie-5-obtenir-son-nom-de-domaine-gratuit-moyennant-certains-compromis\/\">durant cette partie du tuto<\/a>)!<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Renouvellement et mot de la fin<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Les certificats \u00e9mis par Certbot sont renouvelables une fois par mois pour un domaine.<br>Attendu que ces certificats ont une validit\u00e9 <em>(90 jours)<\/em>, il faut donc les renouveler.<br>Fort heureusement, Certbot dispose d&#8217;une commande pour ne faire que \u00e7a, et comme Linux est un syst\u00e8me qu&#8217;il est fort bien, il dispose d&#8217;un planificateur de t\u00e2che qui fait peur de prime abord, mais qui fait le caf\u00e9 quand on l&#8217;a un peu apprivois\u00e9.<br>Je ne vais pas me creuser la soupi\u00e8re tout en sachant que le m\u00eame tuto (<a href=\"https:\/\/howto.wared.fr\/ubuntu-certificats-ssl-tls-certbot\/\">celui-ci<\/a>, partie 4) le traite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le planificateur de t\u00e2ches s&#8217;appelle Cron et la commande <strong>crontab -e<\/strong> <em>(sans sudo devant!!)<\/em> permet d&#8217;\u00e9diter le planificateur pour l&#8217;utilisateur courant.<br>Cependant, comme nous allons utiliser Certbot qui a besoin des autorisation <strong>root<\/strong>, nous allons utiliser :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo crontab -e<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">qui \u00e9dite le planificateur pour <strong>root<\/strong> (si vous voulez en savoir plus sur Cron, <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Cron\">commencez donc par l\u00e0<\/a>).<br>Si c&#8217;est la premi\u00e8re fois que vous lancez Cron, il vous sera demand\u00e9 de choisir un \u00e9diteur; personnellement, je pr\u00e9f\u00e8re <strong>nano<\/strong>, mais les hardcore du Nord pr\u00e9f\u00e8rent <strong>vi <\/strong>(standard mais abscons comme pas deux).<br>Ajoutez la ligne :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">@weekly \/usr\/bin\/certbot renew &gt;&gt; \/var\/log\/certbot-renew.log<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Notez ici qu&#8217;en bon fain\u00e9ant, j&#8217;utilise <strong>@weekly<\/strong> au lieu de la ligne indiqu\u00e9e dans le tuto. La raison \u00e0 cela est qu&#8217;il n&#8217;existe de toute fa\u00e7on pas de moyen de planifier Cron pour un <strong>nombre de jours sp\u00e9cifique<\/strong>. Toute commande doit \u00eatre li\u00e9e au <strong>syst\u00e8me calendaire gr\u00e9gorien<\/strong> (jour, semaine, mois, ann\u00e9e), et toute autre intervalle temporel <strong>doit \u00eatre g\u00e9r\u00e9 via script<\/strong> (appel\u00e9 p\u00e9riodiquement via Cron, vous l&#8217;aurez compris).<br>Partant du principe que Certbot <strong>ne renouvelle pas s&#8217;il n&#8217;y a pas besoin<\/strong> et ne permet le renouvellement que lorsque le certificat arrive \u00e0 <strong>10 jours avant sa date d&#8217;expiration<\/strong>, la p\u00e9riode <strong>@monthly<\/strong> nous expose dans le pire cas \u00e0 21 jours de certificat invalide.<br>La p\u00e9riode imm\u00e9diatement pr\u00e9c\u00e9dente \u00e9tant <strong>@weekly<\/strong>, nous aurons donc 8 tentatives de renouvellement refus\u00e9es et la 9\u00e8me r\u00e9ussira car arrivera dans la p\u00e9riode de 10 jours avant l&#8217;expiration.<br>Notez enfin que la partie <strong><em>&gt;&gt; \/var\/log\/certbot-renew.log<\/em><\/strong> est purement optionnelle et permet d&#8217;avoir le retour des tentatives de renouvellement, sachant que vous aurez en plus des mails de certbot pour vous indiquer que vous arrivez \u00e0 expiration, normalement, c&#8217;est bord\u00e9.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les certificats Sur la route du tant convoit\u00e9 HTTPS, nous allons maintenant nous faire certifier.Je vais l\u00e0 encore suivre des tutoriels, mais sachez qu&#8217;il existe des certificats autosign\u00e9s et des certificats sign\u00e9s par une autorit\u00e9 reconnue.Il va sans dire que les premiers sont beaucoup moins consid\u00e9r\u00e9s comme valides, l\u00e0 o\u00f9 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[12,17,22,27],"class_list":["post-64","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi","tag-certbot","tag-letsencrypt","tag-nginx","tag-ssl"],"_links":{"self":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=64"}],"version-history":[{"count":0,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/64\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}