it-swarm-eu.dev

Posso limitare un'autorità di certificazione alla firma solo di determinati domini?

È possibile creare un certificato CA (anche senza segno), a cui è consentito firmare certificati solo per domini limitati specifici, in modo che non possa essere utilizzato in modo improprio per altri domini?

37
Smit Johnth

No.

(Presumo che tu stia parlando di certificati per server SSL.)

Tecnicamente no. Quale sarebbe il più vicino a quello sarebbe il Name Constraints extension (vedi sezione 4.2.1.10 di RFC 528 ) ( OID 2.5.29. ), che teoricamente consente di limitare una sottostruttura PKI completa a un insieme esplicito di domini ( e relativi sottodomini). L'estensione supporta sia la whitelist che la semantica della blacklist (nel tuo caso, desideri una whitelist). In pratica, tuttavia, ciò non riesce per due motivi:

  • Il Name Constraints L'estensione è per lo più non supportata dalle implementazioni esistenti di SSL. È probabile che ignorino l'estensione.

  • Quando un client SSL si connette a un server, cerca il nome del server nel certificato del server, come specificato in RFC 2818, sezione 3.1 . Cercherà i nomi di tipo dNSName in un Subject Alt Name estensione e questi nomi sono coperti (teoricamente) dal Name Constraints. Tuttavia, se nel certificato del server manca un Subject Alt Name estensione, i client torneranno al nome comune (in subjectDN). Il nome comune non rientra nell'ambito di Name Constraints. Ciò significa che un certificato potrebbe eludere i vincoli del nome omettendo il simbolo Subject Alt Name estensione e inserendo un nome di server arbitrario nel nome comune.

(Questa è l'intera storia di X.509: molti hook e disposizioni per molte funzioni utili, che non funzionano a causa della mancanza di supporto dall'implementazione e della mancanza di coordinamento tra gli organismi di specifica.)

25
Thomas Pornin

Thomas Pornin 's answer è buono, ma un po 'datato. Il supporto per Name Constraints È in crescita.

Ho scoperto che OpenSSL 1.0.1k e Windows 7 supportano l'estensione.

Test

Usando XCA , ho creato un certificato CA autofirmato e ho aggiunto un'estensione critica Name Constraints Per .lab.example.com, Aggiungendo la seguente riga nella scheda "Avanzate" durante la creazione del certificato:

nameConstraints=critical,permitted;DNS:.lab.example.com

Nota: il vincolo dovrebbe non avere un punto iniziale. È tecnicamente errato, ma il supporto per questo si sta espandendo: https://github.com/golang/go/commit/e4dafa32620e80e4e39937d8e2033fb2ee6085f8

Quindi, ho usato quel certificato CA per firmare altri due certificati per i server HTTPS:

  • test.lab.example.com - Valido
  • bad.google.com - Chiaramente non valido

Successivamente, dopo aver impostato le voci DNS di conseguenza, ho usato questo modificato simple-https-server.py per eseguire un server HTTPS, una volta con ciascuno dei certificati generati:

./simple-https-server --certfile test.lab.example.com.pem --hostname test.lab.example.com

e

./simple-https-server --certfile bad.google.com.pem --hostname bad.google.com

Dopo aver installato il certificato CA nell'affidabilità del sistema operativo, ho quindi provato a visitare ogni sito con diversi client.

Risultati

OpenSSL 1.0.1k sembra supportare questo. curl mi ha dato il seguente errore quando ho provato a visitare bad.google.com:

curl: (60) L'autorità di certificazione per questo certificato non è autorizzata a rilasciare un certificato con questo nome.

Chrome su Windows 7 fa anche la cosa giusta. Chrome fornisce un net::ERR_CERT_INVALID Abbastanza generico, ma il visualizzatore di certificati di Windows è abbastanza esplicito:

Il certificato ha un nome non valido. Il nome non è incluso nell'elenco consentito o è esplicitamente escluso.

Riferimenti


Aggiornamento 1

Ho anche provato a firmare un certificato che non specifica un nome alternativo soggetto, basandosi invece solo sul vecchio nome comune.

OpenSSL/curl si è ancora rifiutato di accettare il certificato.

Entrambi Chrome e IE11 su Windows si sono rifiutati di accettare il certificato su Windows, anche se Windows stesso (durante la visualizzazione del certificato del server) non se ne è lamentato. Per me, ciò significa che i browser sono fare di più che semplicemente chiedere al sistema operativo di verificare il certificato, il che è positivo.


Tuttavia, sembra che i vincoli del nome siano non supportato su OSX .


Conclusione

Mi sento sicuro nel chiedere ad altri di installare il mio certificato CA radice, senza metterli a rischio.

44