TUTORIAL PER CREARE LE CHIAVI PER I SERVER HTTPSNOTA BENE: PER CREARE LE CHIAVI HTTPS
NON E' RICHIESTO ALCUN SERVER HTTPSSE NON CE L'HAI ANCORA, VAI A
https://letsencrypt.org/ E CREA UN NUOVO
DOMINIO GRATIS. IN QUESTO TUTORIAL SI SUPPONE TU POSSEGGA
my.server.orgSI SUPPONE CHE TU ABBIA WINDOWS CON WSL (Windows Subsystem for Linux)
DOVREMO USARE UACME PER CREARE LE NOSTRE CHIAVI.
HAI DUE SCELTE: COMPILARE UACME DAI SORGENTI OPPURE SEMPLICEMENTE INSTALLARLO.
[email protected]:/home/user# apt install uacme
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
uacme is already the newest version (1.7.2-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
[email protected]:/home/user# exit
CREO NUOVO ACCOUNT DI LET'S ENCRYPT
questo crea una nuova chiave privata
private/key.pemDi norma si fa una sola volta e per i rinnovi si usa quella che hai perche' e' solo il certificato pubblico che cambia, ma crearne una nuova ogni volta va bene lo stesso.
[email protected]:~$ mkdir myuacme
[email protected]:~$ cd myuacme
[email protected]:~/myuacme$ uacme -v -c . new
uacme: version 1.7.2 starting on Thu, 22 Dec 2022 12:37:39 +0100
uacme: created directory ./private
uacme: loading key from ./private/key.pem
uacme: ./private/key.pem not found
uacme: generating new 2048-bit RSA key
uacme: key saved to ./private/key.pem
uacme: fetching directory at https://acme-v02.api.letsencrypt.org/directory
uacme: creating new account at https://acme-v02.api.letsencrypt.org/acme/new-acct
uacme: type 'y' to accept the terms at https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf
y
uacme: account created at https://acme-v02.api.letsencrypt.org/acme/acct/883313507
[email protected]:~/myuacme$
ADESSO O SI HA IL DYNAMIC DNS SETTATO NEL MODEM PER IL DOMINIO
my.server.orgOPPURE FACCIO PUNTARE A MANO IL MIO DOMINIO
my.server.org AD UN IP CHE CONTROLLO
CIOE' L'IP
PUBBLICO DEL MODEM (
se non hai ip pubblico fine del tutorial)
PER FARE QUESTO, CON LA PASSWORD ACCEDO AL PANNELLO DI CONTROLLO DI LET'S ENCRYPT
E FACCIO PUNTARE
my.server.org ALL'IP
PUBBLICO DEL MODEM,
IN TAL MODO SARA' INDIFFERENTE USARE AD ESEMPIO
http://111.222.31.45 o
http://111.222.63.32(cioe' un ip esterno pubblico variabile) OPPURE
http://my.server.orgLA PORT, SE NON SPECIFICATA, SI INTENDE LA 80, NON SERVE SCRIVERE
http://my.server.org:80PER SERVIRE LE RICHIESTE, SCEGLIAMO UN PC DELLA LAN DOVE FARO' GIRARE IL
SERVER HTTP E TALE PC, IN QUESTO ESEMPIO, AVRA' IP LOCALE
192.168.1.40CI COLLEGHIAMO AL PANNELLO DI CONTROLLO DEL MODEM E CON LA FUNZIONE PORT FORWARD
FACCIAMO PUNTARE LA PORTA 80 ESTERNA AD UNA PORTA QUALSIASI DEL
PC DELLA NOSTRA LAN, IN QUESTO ESEMPIO SCELGO LA 8080 OVVERO
REINDIRIZZIAMO WAN=
80 ----> LAN=
192.168.1.40:8080(SE SCELGO LA STESSA PORTA, LA LAN=192.168.1.40:80 VA BENE,
MA IL SERVER DOVRA' GIRARE CON I PRIVILEGI DI ROOT)SUL PC DI CASA, 192.168.1.40, DOVRO' QUINDI INSTALLARE UN SERVER HTTP
SI PUO' INSTALLARE UN QUALSIASI SERVER HTTP IN PORT 8080 E POI CONFIGURARLO.
PER NON INSTALLARE NESSUN SERVER IO CONSIGLIO DI USARE
nodejs SOTTO WSL
SE NON PRESENTE, INSTALLIAMO NODEJS
[email protected]:/home/user$ sudo apt install nodejs
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
nodejs is already the newest version (18.12.1-deb-1nodesource1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
[email protected]:/home/user$
NELLA CARTELLA node-dir CREO IL FILE DEL SERVER, server.js
#!/usr/bin/node
const myhttp = require('http');
const myfs = require('fs');
const myserv = '0.0.0.0';
const myport = 8080;
const mytoken = 'hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4';
const mykauth = 'hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4.7nSoy3TidIwqfjaejJOiTAQyx_N0E6KyHe6rm5ggaqI';
const myurlst = '/.well-known/acme-challenge/' + mytoken;
function sfunz(req, res)
{
console.log(req.socket.remoteAddress.padStart(15,' ') + ' ' + req.method.padStart(4,' ') + ' ' + req.url);
if(req.url.startsWith(myurlst))
{
res.writeHead(200);
res.write(mykauth + '\n');
res.end();
}
else
{
res.writeHead(404);
res.write('ACME string not found<BR>\n');
res.end();
}
}
myhttp.createServer(sfunz).listen(myport,myserv);
console.log('Server running at ' + myserv + ':' + myport);
NEL server.js FACCIAMO ATTENZIONE A QUELLE 2 STRINGHE CHE DOVREMO CAMBIARE
QUESTE ***VARIANO AD OGNI CHIAMATA DI UACME** E IN QUESTO ESEMPIO SONO
hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4
CHE E' IL TOKENhwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4.7nSoy3TidIwqfjaejJOiTAQyx_N0E6KyHe6rm5ggaqI
CHE E' LA KEY_AUTHFACCIAMO PARTIRE IL SERVER
[email protected]:~/node-dir$ node server.js
Server is running at 0.0.0.0:8080
ORA LASCIAMO IL SERVER A GIRARE IN QUESTA FINESTRA
PER VERIFICARE CHE TUTTO IL SISTEMA FUNZIONI OVVERO CHE
my.server.org SIA REDIRETTO ALL'IP DEL PC DELLA MIA LAN 192.168.1.40
E CHE MI ATTIVI IL SERVER CHE GIRA IN PORT 8080 CON nodejs
SEMPLICEMENTE CON UN BROWSER APRIAMO
http://my.server.orge notiamo la scritta ACME string not found<BR>
OPPURE DA UN'ALTRA FINESTRA DIGITIAMO:
[email protected]:~$ curl http://my.server.org
ACME string not found<BR>
LA SCRITTA "ACME string not found<BR>" CONFERMA CHE E' TUTTO A POSTO:
IL SERVER GIRA COME SE FOSSE INSTALLATO SUL TUO DOMINIO MA SICCOME
NON E' STATO RICHIESTO IL TOKEN, RITORNA LA SCRITTA DI DEFAULT.
INFATTI COL TOKEN SPECIFICATO NEL server.js RITORNA LA STRINGA KEY_AUTH:
[email protected]:~$ curl http://my.server.org/.well-known/acme-challenge/hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4
hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4.7nSoy3TidIwqfjaejJOiTAQyx_N0E6KyHe6rm5ggaqI
FERMA PURE IL SERVER.
ORA TUTTO E' PRONTO PER FAR VERIFICARE IL DOMINIO E CREARE LE CHIAVI
[email protected]:~/myuacme$ uacme -v -c . issue my.server.org
uacme: version 1.7.2 starting on Thu, 22 Dec 2022 13:30:53 +0100
uacme: loading key from ./private/key.pem
uacme: loading key from ./private/my.server.org/key.pem
uacme: checking existence and expiration of ./my.server.org/cert.pem
uacme: ./my.server.org/cert.pem does not exist
uacme: generating certificate request
uacme: fetching directory at https://acme-v02.api.letsencrypt.org/directory
uacme: retrieving account at https://acme-v02.api.letsencrypt.org/acme/new-acct
uacme: account location: https://acme-v02.api.letsencrypt.org/acme/acct/883313507
uacme: creating new order at https://acme-v02.api.letsencrypt.org/acme/new-order
uacme: order location: https://acme-v02.api.letsencrypt.org/acme/order/883313507/154265112377
uacme: retrieving authorization at https://acme-v02.api.letsencrypt.org/acme/authz-v3/189066480387
uacme: challenge=http-01 ident=my.server.org token=hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4 key_auth=hwccLceoyzqliArrl6VVMCXuX4BbkKrovMwc1OumhW4.7nSoy3TidIwqfjaejJOiTAQyx_N0E6KyHe6rm5ggaqI
uacme: type 'y' followed by a newline to accept challenge, anything else to skip
NON PREMERE y E NON INTERROMPERE IL PROGRAMMA!
NELLA PENULTIMA RIGA E' SCRITTO IL VALORE CHE DOVRAI DARE A token e a key_auth
QUINDI PRIMA DI PREMERE y BISOGNA ANDARE NELLA FINESTRA DOVE GIRAVA server.js
BISOGNA EDITARE server.js E VANNO CAMBIATE LE STRINGHE COSTANTI
mytoken e mykauth. POI SI DEVE FAR RIPARTIRE IL SERVER WEB
[email protected]:~/node-dir$ node server.js
Server is running at 0.0.0.0:8080
ADESSO SI PUO' TORNARE NELLA FINESTRA DI UACME E PREMERE y
y
uacme: starting challenge at https://acme-v02.api.letsencrypt.org/acme/chall-v3/189066480387/8DK75A
uacme: polling challenge status at https://acme-v02.api.letsencrypt.org/acme/chall-v3/189066480387/8DK75A
uacme: polling challenge status at https://acme-v02.api.letsencrypt.org/acme/chall-v3/189066480387/8DK75A
uacme: polling order status at https://acme-v02.api.letsencrypt.org/acme/order/883313507/154265112377
uacme: finalizing order at https://acme-v02.api.letsencrypt.org/acme/finalize/883313507/154265112377
uacme: polling order status at https://acme-v02.api.letsencrypt.org/acme/order/883313507/154265112377
uacme: retrieving certificate at https://acme-v02.api.letsencrypt.org/acme/cert/037e325cd4f8f2bd0e4fd768081ca730daf0
uacme: saving certificate to ./my.server.org/cert.pem.tmp
uacme: renaming ./my.server.org/cert.pem.tmp to ./my.server.org/cert.pem
[email protected]:~/myuacme$
ABBIAMO TERMINATO. AVREMO DUE CARTELLE, my.server.org e private
[email protected]:~/myuacme$ ls
my.server.org private
[email protected]:~/myuacme$
nella cartella
my.server.orgci sara' il
cert.pem ovvero la chiave pubblica comprendente la catena di certificati (3)
che vanno al tuo sito: ISRG Root X1 -> R3 -> my.server.org
nella cartella
private c'e':
la tua chiave privata di base
key.pem (che potresti usare anche per altri siti) ora non serve
e nella sottocartella
my.server.org la chiave privata
key.pem ma relativa al tuo sito
LE CHIAVI CHE VANNO USATE PER COSTRUIRE UN SERVER HTTPS SONO QUINDI:
my.server.org/cert.pem e
private/my.server.org/key.pemRiconosci la chiave privata perche' inizia con un blocco
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
Riconosci il certificato pubblico da **tre** blocchi
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
le chiavi sono valide per tre mesi alla volta
VERIFICA DELLA VALIDITA' DELLE VOSTRE NUOVE CHIAVIMETTETE LE 2 CHIAVI IN UNA CARTELLA, IO HO SCELTO LA /home/user/.pem
PER SERVIRE LE RICHIESTE HTTPS, SCEGLIAMO IL PC DELLA LAN DOVE FARO' GIRARE IL
SERVER HTTPS E TALE PC, IN QUESTO ESEMPIO, AVRA' IP LOCALE
192.168.1.40QUANDO SCRIVO
https://my.server.org SI INTENDE
https://my.server.org:443 PERCIO'
CI COLLEGHIAMO AL PANNELLO DI CONTROLLO DEL MODEM E CON LA FUNZIONE PORT FORWARD
FACCIAMO PUNTARE LA PORTA 443 ESTERNA AD UNA PORTA QUALSIASI DEL SOLITO
PC DELLA NOSTRA LAN, IN QUESTO ESEMPIO SCELGO LA 8443 OVVERO
REINDIRIZZIAMO WAN=
443 ----> LAN=
192.168.1.40:8443(SE SCELGO LA STESSA PORTA, LA LAN=192.168.1.40:443 VA BENE,
MA IL SERVER DOVRA' GIRARE CON I PRIVILEGI DI ROOT)EDITATE QUESTO SERVER VELOCE
file test.js
#!/usr/bin/node
const myhttps = require('https');
const myfs = require('fs');
const myserv = '0.0.0.0';
const myport = 8443;
const options = {
key: myfs.readFileSync('/home/user/.pem/key.pem'), //chiave privata
cert: myfs.readFileSync('/home/user/.pem/cert.pem') //cert pubblico
};
function sfunz(req, res)
{
console.log(req.method + ' ' + req.url);
res.writeHead(200);
res.write('SERVER OK<BR>\n');
res.end();
}
myhttps.createServer(options,sfunz).listen(myport,myserv);
console.log('Server running at '+ myserv + ':' + myport);
FATE PARTIRE test.js
[email protected]:~/node-dir$ node test.js
Server is running at 0.0.0.0:8443
e poi in un'altra finestra
[email protected]:~$ curl -k https://my.server.org
SERVER OK<BR>
deve funzionare anche togliendo la -k se le chiavi e la redirezione del dominio sono ok.
[email protected]:~$ curl https://my.server.org
SERVER OK<BR>
Spero che il tutorial sia riuscito bene, ma se c'e' qualcosa mal spiegato scrivetemelo che cerchero' di chiarire meglio.