{"id":11940,"date":"2016-09-21T10:47:59","date_gmt":"2016-09-21T08:47:59","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11940"},"modified":"2016-09-21T10:47:59","modified_gmt":"2016-09-21T08:47:59","slug":"un-server-https-con-node-js","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/un-server-https-con-node-js\/","title":{"rendered":"Un server HTTPS con Node.js"},"content":{"rendered":"<p>Node.js permette una rapida implementazione di API REST sfruttando il framework Express ma, ad oggi, la sicurezza in servizi remoti riveste un&#8217;importanza cruciale. Una delle possibilit\u00e0 pi\u00f9 importanti per blindare i propri servizi \u00e8 applicare uno strato di crittografia alla comunicazione\u00a0aderendo al protocollo HTTPS, una volta caratteristica quasi esclusiva dei portali di home banking, oggi sempre pi\u00f9 diffuso in ogni tipo di &#8220;dialogo&#8221; tra applicazioni attraverso Internet.<\/p>\n<p>Come siamo abituati, Node.js offre gi\u00e0 praticamente tutto il necessario: quello su cui dobbiamo lavorare per prima cosa \u00e8 la definizione di un certificato digitale per il nostro server. Per le soluzioni in produzione, sarebbe necessario acquistarne uno validato da una <em>Certification Authority<\/em>, ma a scopo di debug o per soluzioni ad uso interno va benissimo uno self-signed: garantir\u00e0 comunque le funzioni di crittografia ma non sar\u00e0 garantito da nessun Ente di rilevanza mondiale.<\/p>\n<p>Lo prepariamo con OpenSSL\u00a0conducendo questo esperimento su una macchina Linux: come si immagina, si pu\u00f2 fare altrimenti in base ai sistemi di cui si \u00e8 dotati.<\/p>\n<p><strong>Generiamo una chiave<\/strong>, per prima cosa:<\/p>\n<pre class=\"lang:sh decode:true\">openssl genrsa -out privkey.pem 1024<\/pre>\n<p>che troveremo nel file privkey.pem (il formato .pem \u00e8 tipicamente dedicato alla conservazione di chiavi e certificati).<\/p>\n<p>Produciamo con la chiave una <strong>richiesta di certificato<\/strong>, fase in cui sar\u00e0 necessario rispondere ad alcune domande:<\/p>\n<pre class=\"lang:sh decode:true \">openssl req -new -key privkey.pem -out myserver.csr<\/pre>\n<p>Ed infine <strong>creiamo il certificato<\/strong> pubblico utilizzando la richiesta appena prodotta:<\/p>\n<pre class=\"lang:sh decode:true\">openssl x509 -req -days 366 -in myserver.csr -signkey privkey.pem -out pubcert.pem<\/pre>\n<p>I file pubcert.pem e privkey.pem serviranno nel nostro script per Node.js dove, per il resto, conoscendo un p\u00f2 l&#8217;ambiente, c&#8217;\u00e8 davvero\u00a0poco da spiegare:<\/p>\n<pre class=\"lang:sh decode:true\">  var fs = require('fs'),\r\n    https = require('https'),\r\n    express = require('express'),\r\n    app = express();\r\n\r\n    https.createServer({\r\n      key: fs.readFileSync('privkey.pem'),\r\n      cert: fs.readFileSync('pubcert.pem')\r\n    }, app).listen(6789);\r\n\r\n    app.get('\/', function (req, res) {\r\n      res.header('Content-type', 'text\/html');\r\n      return res.end('&lt;h1&gt;Ciao Mondo ... su HTTPS&lt;\/h1&gt;');\r\n    });<\/pre>\n<p>Nella prima fase, richiediamo i framework necessari, poi avviamo il server sulla porta 6789 fornendogli chiave e certificato ed infine definiamo la nostra API di esempio.<\/p>\n<p>Per provarlo si potr\u00e0 contattare con il browser l&#8217;indirizzo https:\/\/localhost:6789: saremo avvisati che il certificato non \u00e8 garantito da una CA conosciuta (infatti l&#8217;abbiamo firmato noi) ma la crittografia sar\u00e0 garantita.<\/p>\n<p>Abbiamo visto un altro esempio in cui Node.js dimostra la ricchezza di potenzialit\u00e0 nel giro di pochissime righe di codice:\u00a0voi avete mai provare a creare il vostro server HTTPS con o senza Node.js ? Commentate e diteci!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Node.js permette una rapida implementazione di API REST sfruttando il framework Express ma, ad oggi, la sicurezza&#8230;<\/p>\n","protected":false},"author":561,"featured_media":11863,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1624,1643,1537,1663,1662,1661],"class_list":["post-11940","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-api-rest","tag-https","tag-node-js","tag-openssl","tag-ssl","tag-tls"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11940","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=11940"}],"version-history":[{"count":4,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11940\/revisions"}],"predecessor-version":[{"id":12376,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11940\/revisions\/12376"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/11863"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11940"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11940"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11940"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}