# Key server

Nell'ambito della sicurezza informatica, un key server è un sistema che si occupa di fornire, attraverso appositi programmi, chiavi crittografiche agli utenti che le richiedono.
Le chiavi fornite quasi sempre fanno parte di un certificato digitale, solitamente in un formato standard (per esempio X.509 o PKCS), che contiene oltre alla chiave anche informazioni sul proprietario della chiave e sulla sua identità. La chiave che viene restituita dal key server è la parte pubblica della chiave, da utilizzare con algoritmi di crittografia asimmetrica.
I key server più importanti e maggiormente accessibili, sparsi in tutto il mondo, sono quelli che contengono le chiavi PGP (e GPG) e le distribuiscono agli utenti di tali sistemi crittografici. Questi server quasi sempre sono mantenuti da singoli individui e forniscono un servizio "pubblico", aiutando la costruzione della rete di fiducia, il sistema su cui si basa la garanzia dell'identità in PGP.
Esistono anche molti sistemi di infrastruttura a chiave pubblica proprietari che mantengono key server privati per i loro utenti.

## Storia

I key server giocano un importante ruolo nella crittografia asimmetrica. L'idea alla base della crittografia asimmetrica è quella di avere due chiavi distinte, una pubblica e una privata, che deve rimanere nascosta, usate per criptare e decriptare. Con questo metodo di crittografia a doppia chiave viene risolto:
* Il problema della riservatezza del messaggio, ovvero criptando il messaggio con la chiave pubblica del destinatario, solo il destinatario con la propria chiave privata può decriptarlo.
* Il problema dell'autenticità del mittente, ovvero criptando il messaggio con la propria chiave privata, solo con la corrispettiva chiave pubblica si può decriptarlo.
La necessità di avere la chiave pubblica per avviare una comunicazione è un problema.
Cercare le chiavi sul web o chiedere direttamente al destinatario l’invio della propria chiave pubblica risulta molto costoso dal punto di vista del tempo e anche poco sicuro. I key server, appunto, agiscono da Repository per mitigare la necessità di trasmettere chiavi pubbliche, essi si basano sul modello di Web of Trust (catena di fiducia). Il primo web key server basato su PGP è stato scritto, da Marc Horowitz, mentre studiava al MIT. Il key server di Horowitz fu chiamato HKP (HTTP Keyserver Protocol) per via dell'implementazione del protocollo HTTP su di un OpenPGP key server. Gli utenti erano in grado di caricare, scaricare e cercare “chiavi“ tramite HKP sulla porta 11371, o tramite pagine web che eseguivano script CGI.
Uno script CGI (Common Gateway Interface) è un programma che risiede sul server, che elabora l’input dell’utente e crea una risposta tramite un documento HTML che il server invia al browser. Prima della creazione degli HKP keyserver, ci si basava su email processing scripts.
Un keyserver separato, noto come PGP Certificate Server, è stato sviluppato da PGP Inc. e usato come software nella versione 8.x del key server PGP, keyserver.pgp.com. Network Associates ha concesso un brevetto di co-autore a Jon Callas (United States Patent 6336186) per il concept del keyserver.
Per sostituire il vecchio Certificate Server, Network Associates realizza un nuovo key server utilizzando il protocollo LDAP, questa modifica fu attribuita a Randy Harmon e Len Sassaman e chiamata PGP Keyserver 7.0. Con il rilascio di PGP 6.0, LDAP è stata l’interfaccia favorita per i key server, nelle versioni PGP di Network Associates. LDAP e LDAPS (LDAP + SSL) key server formano, anche, le basi per gli strumenti di amministrazione PGP per le chiavi private nelle soluzioni aziendali, insieme a uno schema per Netscape Directory Server. Successivamente è stato sostituito dalla nuova PGP Global Directory di PGP Corporation. Le caratteristiche di questo nuovo sistema di gestione delle chiavi sono:
* User Key Management: gli utenti di PGP Global DIrectory possono pubblicare o rimuovere la propria chiave in qualsiasi momento. Più account possono essere associati ad una singola chiave fornendo continuità anche se gli indirizzi email cambiano nel tempo;
* Advanced Search Options: L’interfaccia basata sul web consente agli utenti di cercare le chiavi per nome, indirizzo e-mail o keyID;
* Annunci verificati: PGP Corporation svolge un ruolo attivo nel garantire la precisione della directory di routine verificando l'elenco di ciascun utente. Le inserzioni non verificate vengono automaticamente rimosse, fornendo garanzia che la directory contiene solo chiavi utente attive e accurate.

## Key server pubblici vs key server privati

Molti key server pubblici sono computer che memorizzano e forniscono chiavi OpenPGP su internet per gli utenti. In questo caso, possono essere, e in gran parte lo sono, gestiti da singolo come servizio pro bono, favorendo così il modello Web of Trust che utilizza PGP per la distribuzione delle chiavi.
Sono disponibili, anche, diversi key server S/MIME ad accesso pubblico per la pubblicazione o il recupero dei certificati (certificati digitali X.509) usati proprio da questo standard per l’autenticazione dell’utente.

## Privacy

Per molti l’utilizzo della crittografia è sinonimo di maggiore privacy. È stato però reso noto che caricare una chiave pubblica su di un key server quando si usa un sistema crittografico decentralizzato basato sul web of trust, come il PGP, può rivelare una buona quantità di informazioni che l’utente non vorrebbe che siano rivelate. Poiché PGP si basa sulle firme della chiave pubblica di un utente per determinare l’autenticità, potenziali relazioni possono essere rivelate analizzando i firmatari di una determinata chiave.

## Problemi con i key server

I key server OpenPGP sviluppati negli anni ‘90 soffrivano di alcuni problemi. Il problema principale era che: quando una chiave veniva memorizzata sul server, era difficile da rimuovere. Capitava che molti utenti dovessero abbandonare la propria chiave pubblica poiché la chiave privata era stata compromessa o persa oppure si era dimenticato il passphrase. In questi casi, era difficile eliminare la chiave pubblica dal server, e anche se questa fosse stata eliminata, qualcun altro poteva caricare una copia della chiave appena eliminata sul server. Ciò porta ad un accumulo di vecchie chiavi pubbliche, chiamato “keyserver plaque”. Un altro problema era che chiunque poteva caricare una falsa chiave pubblica sul server, con il nome di una persona che, in realtà, non possedeva quella chiave. Il key server non avevano modo di provare se una chiave era legittima.
Per risolvere a questi problemi, PGP Corp sviluppa una nuova generazione di keyserver, chiamato PGP Global Directory. Quest’ultimo invia una mail di richiesta di conferma al proprietario della chiave, domandando all’utente se la chiave in questione è la sua. Se l’utente conferma che è la propria chiave, PGP Global Directory accetta la chiave. Tutto questo viene fatto periodicamente, per prevenire l’accumulo di chiavi nel keyserver (“keyserver plaque”). Il risultato è una raccolta di chiavi pubbliche di qualità superiore, ed ogni chiave è stata controllata tramite mail con il proprietario apparente di quest’ultima.
Tuttavia poiché PGP Global Directory consente la manutenzione degli account e verifica solo tramite mail, basta avere accesso all’account e-mail del possessore della chiave per eliminarla e inserire una falsa.

## PGP key server

Come detto in precedenza, vi sono vari protocolli per il recupero delle chiavi PGP, i più conosciuti sono LDAP e HTTP tramite query.

### HTTP protocol

I server che sfruttano HTTP come protocollo, implementano due tipi di URL, uno per l’inserimento delle chiavi e uno per la ricerca:
* Il primo URL, /pks/lookup, serve per eseguire delle ricerche. Esso ha diverse proprietà, tra cui op che può avere tre valori. Se questo valore è index o vindex (verbose index), la pagina restituita è equivalente a quella emessa da pgp -kv o pgp - kvv, ovvero restituisce lo userid sulle chiavi corrispondenti al valore inserito nel campo search. Inoltre, se la proprietà fingerprint ha il valore on, l'output è equivalente a quello emesso rispettivamente da pgp -kvc o pgp -kvcv. Se la proprietà op ,invece, ha come valore get la pagina restituita è equivalente a quella emessa da pgp -kxa sulle chiavi corrispondenti al valore inserito nel campo search.
* Il secondo URL, /pks/add, serve per aggiungere o modificare chiavi nel database. Ha un'unica proprietà (o campo) (“keytext”) dove va inserita la chiave PGP.
Un esempio di interfaccia web per un key server che utilizza il protocollo HTTP si può facilmente reperire al seguente link: http://www.pgp.net/pgpnet/pks-commands.html Archiviato il 24 gennaio 2018 in Internet Archive..
Il server che sfruttano HTTP ascoltano le connessioni su una porta TCP, ed interpreta i dati come richieste HTTP. L'URL, la stringa di query e il corpo di ogni richiesta vengono analizzati e convertiti in argomenti per il database. Quest’ultimo esegue la query effettiva e restituisce una risposta testuale. Questa risposta è contrassegnata con HTML e successivamente vengono aggiunte le intestazioni HTTP. Il risultato viene trasmesso al client.

### LDAP protocol

Un esempio di PGP key server basato su LDAP si può creare autonomamente tramite OpenLDAP utilizzando linux Ubuntu: https://help.ubuntu.com/lts/serverguide/openldap-server.html The Lightweight Directory Access Protocol, o LDAP, è un protocollo per l’interrogazione (query) e la modifica di un servizio di directory basato su X.500. L’ultima versione è LDAPv3,definita in RFC4510.

### SKS key server

SKS è un server di chiavi OpenPGP il cui obiettivo è quello di fornire una sincronizzazione facile da implementare, decentralizzata e altamente affidabile. Ciò significa che una chiave inviata a un server SKS verrà rapidamente distribuita a tutti i key server, e anche server estremamente obsoleti o server con connettività spotty possono sincronizzarsi completamente con il resto del sistema. Gli keyserver SKS sono al giorno d’oggi i più usati. Essi hanno rimpiazzato i PKS che per sincronizzarsi utilizzavano le email e non includevano gli aggiornamenti delle funzionalità di OpenPGP presentate in RFC4880.
Le caratteristiche di SKS key server sono:
* Algoritmo di riconciliazione dati altamente efficiente e affidabile;
* Segue RFC2440 e RFC4880 molto attentamente, SKS supporta pacchetti nuovi e vecchi, pacchetti photoID, sottochiavi multiple e praticamente tutto ciò che è consentito dalle RFC, comprese le chiavi Elliptic Curve Public Keys (ECDH,ECDSA) che si trovano in RFC6637;
* Pienamente compatibile con il sistema PKS (Public Key Server), può sia ricevere che inviare sincronizzazioni dai server PKS, garantendo una connettività senza interruzioni;
* Configurazione semplice: ogni host necessita solo di un elenco (parziale) degli altri key server partecipanti. Viene utilizzato il protocollo Gossip per distribuire le informazioni senza sovraccaricare nessun host;
* Supporta query HKP e HTTP.
Il design di SKS è volutamente semplice, il server è costituito da due processi a thread singolo. Il primo, "sks db", soddisfa i normali lavori associati a un server a chiave pubblica, come rispondere alle richieste web. L'unica funzionalità speciale di "sks db" è che mantiene un log che riepiloga le modifiche al database delle chiavi. "sks recon" fa tutto il lavoro relativo alla riconciliazione dei database degli host. Inoltre tiene traccia delle informazioni di riepilogo specializzate sul database e può utilizzare tali informazioni per determinare in modo efficiente le differenze tra il proprio database e quello di un altro host.
Le pool principali sono gestite da Kristian Fiskerstrand, sul sito: https://www.sks-keyservers.net/ Archiviato l'8 gennaio 2018 in Internet Archive..
HKP è di default attivo sulla porta 11371, quindi per accedere al server SKS basta digitare il seguente URL: http://pool.sks-keyservers.net:11371 Archiviato il 16 dicembre 2019 in Internet Archive. . Ogni singola pool mette a disposizione una pagina contenente le statistiche dei vari keyserver, tramite il seguente URL: http://[keyserver]:11371/pks/lookup?op=stats dove al posto di “[keyserver]” ci va il nome del server che si vuole controllare le statistiche.

### SRV Records

Il Record SRV è un record del sistema DNS (Domain Name System) utilizzato a identificare il server, la porta e il tipo di protocollo di un determinato servizio all’interno di un Dominio. Un Keyserver è designato come “Authoritative” (Autorevole) per un dominio aggiungendo un Service Record (SRV) ai record DNS per il dominio. Questo significa che tutti gli utenti di quel dominio che hanno chiavi PGP avranno la versione ufficiale (aggiornata, valida, ecc...),che si trova sul “Authoritative” Keyserver (HAKP).
Un record SRV potrebbe apparire come segue:
In questo esempio, keys.example.com., è l’Authoritative Keyserver per example.com, ed è accessibile sulla porta 80.
HAKP è disponibile su HTTP e HTTPS, quindi le porte più comuni saranno 80 e 443. Tuttavia, la porta HKP tradizionale 11371 potrebbe essere scelta. Se il Keyserver viene usato sia da HKP Keyserver che da HAKP Keyserver, entrambi i servizi devono essere designati separatamente all'interno dei record DNS.
HAKP è basato su HKP, ma usa un'API sostanzialmente diversa, in quanto il suo caso d'uso è molto diverso. HAKP pone l'accento sui principi REST e sull'uso di un Keyserver come Authoritative Keyserver. In quanto tale, non implementa gli stessi metodi di HKP, e i metodi implementati vengono eseguiti in modo sostanzialmente diverso. HAKP dovrebbe essere considerato incompatibile con HKP. Tuttavia, a causa dei numerosi vantaggi offerti da HKP, incluso l'uso di tecnologie esistenti come SKS, il protocollo è progettato in modo tale che un server possa utilizzare sia HAKP che HKP.