{"id":10466,"date":"2019-06-19T15:53:10","date_gmt":"2019-06-19T13:53:10","guid":{"rendered":"https:\/\/www.dreamsworld.it\/emanuele\/?p=10466"},"modified":"2019-06-19T16:34:42","modified_gmt":"2019-06-19T14:34:42","slug":"freenas-nextcloud-nginx-https","status":"publish","type":"post","link":"https:\/\/www.dreamsworld.it\/emanuele\/2019-06-19\/freenas-nextcloud-nginx-https\/","title":{"rendered":"FreeNAS Nextcloud plugin &#8211; nginx e HTTPS"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Come descritto nell&#8217;articolo <a href=\"https:\/\/www.dreamsworld.it\/emanuele\/2019-06-08\/il-mio-cloud-a-casa-mia\/\">sulla mia configurazione cloud<\/a>, il webserver della mia istanza Nextcloud <strong>non esce fuori dalla rete locale<\/strong> se non attraverso una VPN con OpenVPN.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Idealmente dunque, utilizzare HTTP invece di HTTPS <strong>potrebbe sembrare una scelta ragionevole<\/strong>: handshake iniziale pi\u00f9 rapido, numero minore di componenti da configurare e intuitivamente performance migliori.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In realt\u00e0, HTTPS con <a rel=\"noreferrer noopener\" aria-label=\"HTTP2 (opens in a new tab)\" href=\"https:\/\/it.wikipedia.org\/wiki\/HTTP\/2\" target=\"_blank\">HTTP2<\/a> (<em>tecnologia costruita su <a rel=\"noreferrer noopener\" aria-label=\"SPDY (opens in a new tab)\" href=\"https:\/\/it.wikipedia.org\/wiki\/SPDY\" target=\"_blank\">SPDY<\/a><\/em>) <strong>garantisce performance migliori<\/strong> in quanto aggiunge la compressione degli header, la parallelizzazione delle richieste e un eventuale <a href=\"https:\/\/en.wikipedia.org\/wiki\/HTTP\/2_Server_Push\">push proattivo<\/a> da parte del webserver che pu\u00f2 decidere che certe risorse saranno necessarie al client ancora prima che questi ne faccia richiesta. Non mi credete? <a rel=\"noreferrer noopener\" aria-label=\"Provate voi stessi (opens in a new tab)\" href=\"https:\/\/imagekit.io\/demo\/http2-vs-http1\" target=\"_blank\">Provate voi stessi<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A tutta questa (bella) roba si aggiunge <strong>uno strato di sicurezza in pi\u00f9<\/strong>: anche all&#8217;interno della mia rete locale le richieste (<em>e le autenticazioni<\/em>) verso nextcloud saranno cifrate e illeggibili da un aggressore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tutto molto bello insomma, non potevo lasciarmelo scappare. <strong>Non c&#8217;\u00e8 ragione di usare HTTP invece di HTTPS<\/strong> in tutti i tuoi progetti web.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il plugin di NextCloud per <a rel=\"noreferrer noopener\" aria-label=\"FreeNAS (opens in a new tab)\" href=\"https:\/\/www.freenas.org\/\" target=\"_blank\">FreeNAS<\/a> si basa su nginx, un webserver pi\u00f9 moderno e performante del robustissimo Apache.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configurare nginx per usare SSL e HTTP2 \u00e8 semplicissimo. Entriamo via SSH nella Jail dedicata a nextcloud con <a href=\"https:\/\/www.unix.com\/man-page\/freebsd\/8\/jexec\/\">jexec<\/a>.<\/p>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">1. Verifichiamo <strong>se OpenSSL \u00e8 installato<\/strong> (eventualmente installiamolo usando <em>pkg<\/em>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@nextcloud:\/ # openssl version\nOpenSSL 1.0.2o-freebsd 27 Mar 2018<\/code><\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">2. Verifichiamo <strong>se i moduli nginx relativi a SSL<\/strong> (<code>--with-http_ssl_module<\/code>) <strong>e HTTP2<\/strong> (<code>--with-http_v2_module<\/code>) sono installati.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@nextcloud:\/ # nginx -V\nnginx version: nginx\/1.16.0\nbuilt with OpenSSL 1.0.2o-freebsd  27 Mar 2018\nTLS SNI support enabled\nconfigure arguments: --prefix=\/usr\/local\/etc\/nginx --with-cc-opt='-I \/usr\/local\/include' --with-ld-opt='-L \/usr\/local\/lib' --conf-path=\/usr\/local\/etc\/nginx\/nginx.conf\n--sbin-path=\/usr\/local\/sbin\/nginx --pid-path=\/var\/run\/nginx.pid --error-log-path=\/var\/log\/nginx\/error.log --user=www --group=www --modules-path=\/usr\/local\/libexec\/nginx --with-file-aio\n--http-client-body-temp-path=\/var\/tmp\/nginx\/client_body_temp --http-fastcgi-temp-path=\/var\/tmp\/nginx\/fastcgi_temp --http-proxy-temp-path=\/var\/tmp\/nginx\/proxy_temp --http-scgi-temp-path=\/var\/tmp\/nginx\/scgi_temp --http-uwsgi-temp-path=\/var\/tmp\/nginx\/uwsgi_temp --http-log-path=\/var\/log\/nginx\/access.log\n--with-http_v2_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-pcre --with-http_secure_link_module --with-http_slice_module\n--with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --without-mail_imap_module --without-mail_pop3_module --without-mail_smtp_module --with-mail_ssl_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-mail=dynamic --with-stream=dynamic\nroot@nextcloud:\/ #\n<\/code><\/pre>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">3. <strong>Generiamo i certificati necessari<\/strong> (<em>Certificate Authority, chiave privata e cos\u00ec via&#8230;<\/em>).<br \/>Il CA sar\u00e0 di tipo <strong>self-authority<\/strong> (non legato ad un ente certificatore esterno come potrebbe essere Let&#8217;s Encrypt  <a id=\"supnote-10466-1\" href=\"#note-10466-1\">[1]<\/a>). Nessun problema, semplicemente il browser <strong>ci dar\u00e0 un warning<\/strong> (<em>ma noi sappiamo di aver emesso noi quel certificato: possiamo fidarci<\/em>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Personalmente ho creato una directory <code>openssl<\/code> dentro <code>\/usr\/local\/etc\/ssl\/<\/code> nella quale ho salvato i file del mio certificato.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>openssl req -new > cert.csr\nopenssl rsa -in privkey.pem -out key.pem\nopenssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1095\ncat key.pem>>cert.pem\nopenssl dhparam 2048 -out dhparam.pem<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Durante la generazione dei vari certificati vi verranno chieste <strong>un paio di password<\/strong> e qualche informazione per descrivere il certificato. Conservate le password con cura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Occhio che il parametro <code>-days<\/code> <strong>indica i giorni di validit\u00e0 del certificato<\/strong>: 1095 sono 3 anni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A questo punto sarete gi\u00e0 al 50% del lavoro.<\/p>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">4. Raggiungete la <strong>cartella di configurazione della vostra istanza web nextcloud<\/strong>.<br \/>Di default si trova in \/<code>usr\/local\/etc\/nginx\/conf.d\/<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per non far danni fate una copia di <code>nextcloud.conf<\/code> e successivamente modificate la configurazione in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server {\n  listen 443 ssl http2;\n  server_name nextcloud.local;\n  ssl_certificate \/usr\/local\/etc\/ssl\/openssl\/cert.pem;\n  ssl_certificate_key \/usr\/local\/etc\/ssl\/openssl\/key.pem;\n  ssl_prefer_server_ciphers on;\n  ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DHE+AES128:!ADH:!AECDH:!MD5;\n  ssl_dhparam \/usr\/local\/etc\/ssl\/openssl\/dhparam.pem;\n  add_header Strict-Transport-Security \"max-age=31536000; includeSubDomains\" always;\n...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tutto il resto del file di configurazione potete lasciarlo immutato.<\/p>\n\n\n\n<p class=\"has-drop-cap wp-block-paragraph\">5. <strong>Riavviamo<\/strong> la lettura dei file di configurazione da parte di nginx:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@nextcloud:\/usr\/local\/etc\/nginx\/conf.d # service nginx reload\nPerforming sanity check on nginx configuration:\nnginx: the configuration file \/usr\/local\/etc\/nginx\/nginx.conf syntax is ok\nnginx: configuration file \/usr\/local\/etc\/nginx\/nginx.conf test is successful\nroot@nextcloud:\/usr\/local\/etc\/nginx\/conf.d #<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Modifica completata! Se non avete fatto errori <strong>potrete loggarvi<\/strong> su <code>https:\/\/&lt;nextcloud-ip-address&gt;:443\/<\/code> \ud83c\udf89<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a id=\"note-10466-1\" href=\"#supnote-10466-1\">[1]<\/a> Non ho potuto usare <a rel=\"noreferrer noopener\" aria-label=\"Let's Encrypt (opens in a new tab)\" href=\"https:\/\/letsencrypt.org\/\" target=\"_blank\">Let&#8217;s Encrypt<\/a> perch\u00e9 come dicevo il mio webserver \u00e8 isolato e non possiede un dominio. Se non siete nelle mie condizioni potrete usare <a href=\"https:\/\/certbot.eff.org\/lets-encrypt\/freebsd-nginx\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"CertBot (opens in a new tab)\">CertBot<\/a> e gestire l&#8217;intera catena di certificazione configurando il porting di Certbot per FreeBSD e nginx.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Come descritto nell&#8217;articolo sulla mia configurazione cloud, il webserver della mia istanza Nextcloud non esce fuori dalla rete locale se non attraverso una VPN con OpenVPN. Idealmente dunque, utilizzare HTTP invece di HTTPS potrebbe sembrare una scelta ragionevole: handshake iniziale &hellip; <a href=\"https:\/\/www.dreamsworld.it\/emanuele\/2019-06-19\/freenas-nextcloud-nginx-https\/\">Leggi ancora &rarr;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[3],"tags":[2782,2753,1844,653,640,2718,2754,2785,356,1392,23],"class_list":["post-10466","post","type-post","status-publish","format-standard","hentry","category-computer","tag-freebsd","tag-freenas","tag-guida","tag-guide","tag-how-to","tag-https","tag-nas","tag-nextcloud","tag-servizi-web","tag-ssl","tag-web"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts\/10466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/comments?post=10466"}],"version-history":[{"count":0,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/posts\/10466\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/media?parent=10466"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/categories?post=10466"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamsworld.it\/emanuele\/wp-json\/wp\/v2\/tags?post=10466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}