È possibile creare un certificato CA (anche senza segno), che può solo firmare i certificati per specifici domini limitati, in modo che non possa essere utilizzato in modo improprio per altri domini?
È possibile creare un certificato CA (anche senza segno), che può solo firmare i certificati per specifici domini limitati, in modo che non possa essere utilizzato in modo improprio per altri domini?
(presumo tu stia parlando dei certificati per i server SSL.)
Tecnicamente no. Quello che sarebbe più vicino sarebbe l'estensione Name Constraints
(vedi sezione 4.2.1.10 di RFC 5280 ) ( OID 2.5.29.30 ), che teoricamente consente di restringere un sottoalbero PKI completo ad un esplicito insieme di domini (e relativi sottodomini). L'estensione supporta sia la whitelist che la semantica blacklist (nel tuo caso, ti piacerebbe una whitelist). In pratica, tuttavia, ciò non riesce per due motivi:
L'estensione Name Constraints
è in gran parte non supportata dalle implementazioni esistenti di SSL. È probabile che ignorino l'estensione.
Quando un client SSL si connette a un server, cerca il nome server nel certificato del server, come specificato in RFC 2818, sezione 3.1 . Cercherà nomi di tipo dNSName
in un'estensione Subject Alt Name
, e questi nomi sono coperti (teoricamente) da Name Constraints
. Tuttavia, se il certificato del server manca di un'estensione Subject Alt Name
, i client ricadranno sul nome comune (in subjectDN
). Il nome comune non rientra nell'ambito di Name Constraints
. Ciò significa che un certificato può eludere i vincoli del nome omettendo l'estensione Subject Alt Name
e inserendo un nome arbitrario del server nel suo nome comune.
(Questa è l'intera storia di X.509: molti ganci e disposizioni per molte utili funzioni, che non funzionano a causa della mancanza di supporto da parte dell'implementazione e della mancanza di coordinamento tra i corpi delle specifiche.)
Thomas Pornin 's risposta è buona, ma un po 'obsoleta. Il supporto per Name Constraints
è in crescita.
Ho trovato che OpenSSL 1.0.1k e Windows 7 supportano l'estensione.
Utilizzando XCA , ho creato un certificato CA autofirmato e aggiunto un'estensione Name Constraints
critica 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 not avere un punto iniziale. È tecnicamente scorretto, ma il supporto per questo è in espansione: link
Quindi, ho utilizzato il 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 utilizzato questo % modificato% di% di conversione 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 nel trust del sistema operativo, ho quindi provato a visitare ciascun sito con diversi client.
OpenSSL 1.0.1k sembra supportare questo. simple-https-server.py
mi ha dato il seguente errore quando ho provato a visitare curl
:
curl: (60) The Certifying Authority for this certificate is not permitted to issue a certificate with this name.
Chrome su Windows 7 fa anche la cosa giusta. Chrome offre un bad.google.com
piuttosto generico, ma il visualizzatore di certificati di Windows è piuttosto esplicito:
The certificate has an invalid name. The name is not included in the permitted list or is explicitly excluded.
Ho anche provato a firmare un certificato che non specifica un nome alternativo soggetto, facendo invece affidamento solo sul vecchio nome comune.
OpenSSL / curl ha ancora rifiutato di accettare il certificato.
Sia Chrome che IE11 su Windows hanno rifiutato di accettare il certificato su Windows, anche se Windows stesso (durante la visualizzazione del certificato del server) non si è lamentato. Per me, questo significa che i browser stanno facendo di più che semplicemente chiedere al sistema operativo di verificare il certificato, che è una buona cosa.
Tuttavia, sembra che i vincoli dei nomi siano non supportato su OSX .
Mi sento al sicuro nel chiedere ad altri di installare il certificato CA root, senza metterli a rischio.
Leggi altre domande sui tag public-key-infrastructure tls certificates certificate-authority