-- Leo's gemini proxy

-- Connecting to it.omarpolo.com:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=it

Autenticare gli utenti con gmid


Un paio di giorni fa ho aggiunto una funzione piuttosto interessante a gmid: la possibilità di richiede ai client un certificato firmato da una specifica CA.


I server HTTP in genere hanno opzioni per proteggere alcune sezioni mediante password. L’idea è la stessa, solo che su Gemini per autenticare gli utenti si fa uso dei certificati TLS.


Sebbene non sia una pratica molto diffusa, TLS prevede che anche i client possano fornire un certificato, al pari dei server.


Inizialmente avevo pensato di usare una whitelist di hash di certificati, ma poi mi sono convinto che richiedere certificati generati da una CA fosse meglio: evita di dover mantenere una lista statica e ricaricare il demone dopo ogni modifica. L’idea della whitelist comunque non è scartata, è solo rimandata!


La sintassi per quest’opzione è:


server "example.com" {
    # …
    require client ca "/path/to/my/ca.pem"
}

Come molte opzioni di gmid, è possibile usarla dentro un blocco “location”:


server "example.com" {
    # …
    location "/file/privati/*" {
        require client ca "/path/to/my/ca.pem"
    }
}

in modo da richiedere l’autenticazione solo per vedere i documenti dentro “file/privati”.


Dato che le regole “location” vengono considerate all’inizio della gestione della richiesta, è possibile proteggere alcuni script CGI in questo modo.


Creare il certificato per una CA è facile, usando openssl(1):

$ openssl genrsa -out myca.key 4096
$ openssl req -x509 -new -sha256 -key testca.key -out myca.pem -days 365 -nodes

(Effettivamente è un po’ verboso…)


L’opzione ‘-nodes’ disabilita la criptazione del certificato, in quanto gmid supporta certificati criptati.


A questo punto possiamo iniziare a generare certificati per i nostri dispositivi. Creare dei certificati firmati è simile, ha solo un passaggio, di più dove bisogna creare una “richiesta”, da poi firmare con il certificato della nostra CA:


$ openssl genrsa -out client.key 4096
$ openssl req -new -key client.key -out client.csr
$ opennsl x509 -req -in client.csr -CA myca.pem -CAkey myca.key  \
        -CAcreateserial -out client.CRT -days 365 -sha256        \
        -extfile client.ext

Ah, e serve anche un file ‘client.ext’ con questo contenuto:


authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment

Dopo aver scritto la spiegazione sono tentato di includere degli script per automatizzare il tutto ed aggiungerli a gmid…


In ogni caso, questo è tutto quello che serve. gmid risponderà con “60 client certificate required” a tutte le richieste per le quali un certificato è richiesto ma non è stato fornito, e “61 certificate not authorised” nel caso di un certificato non valido.


$BlogIt: client-certs-con-gmid.gmi,v 1.1 2021/10/20 07:41:39 op Exp $

-- Response ended

-- Page fetched on Thu Apr 25 17:11:03 2024