Ristampa della CA principale autofirmata senza invalidare i certificati firmati da essa


12

Ho creato un'Autorità di certificazione radice autofirmata per alcuni servizi interni nella nostra azienda, che mi sono configurata (principalmente servita su HTTPS). Quindi ho creato certificati per tali servizi, firmati con questa CA.

Ora voglio aggiungere un'estensione x509 (punto di distribuzione CRL) alla CA principale senza invalidare i certificati server esistenti emessi da questa CA. È possibile?

Il mio istinto è "sì" perché, a quanto ho capito, l'accesso alla chiave privata corrispondente è necessario e sufficiente per la "piena autorità" sull'identità del certificato. Cioè, a meno che non vi sia una sorta di nonce incorporato insieme alla chiave pubblica nel certificato quando viene generato (probabilmente).

Sono ancora abbastanza nuovo nella gestione dei certificati SSL, ma (penso di) comprendere le basi della catena di fiducia standard. Sono anche a mio agio con l'uso di base di altre crittografie PKI: gestisco le chiavi SSH e utilizzo GPG per la firma e la crittografia. Ho studiato Informatica, anche se sono solo un dilettante autodidatta in crittografia.

Non ho mai realizzato un CSR per il IIRC originale (penso che sia stato il risultato diretto di openssl req -new -x509). Naturalmente ho ancora la chiave privata della CA originale e, usando questa opzione, sono stato in grado di "invertire" il certificato originale in una richiesta di firma del certificato: openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key

Speravo che questo avrebbe effettivamente "estratto" il nonce sopra menzionato e mi avrebbe permesso di ricreare il certificato ma questa volta con un crlDistributionPointscampo, e di conseguenza tutti i certificati firmati con la CA originale sarebbero ancora validi contro questa nuova CA, con l'eccezione che i client avrebbero recuperato il mio file CRL (attualmente vuoto) dall'URL HTTP designato nel campo.

Quindi ho creato un file di configurazione dell'estensione ext.conf:

[ cert_ext ] 
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl

E ho generato la nuova versione della CA principale dal CSR:

openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem

Ora quando visualizzo il certificato con openssl x509 -text -in MyNewCA.pem | less

Riesco a vedere la parte di estensione CRL:

X509v3 extensions:
    X509v3 Subject Key Identifier: 
        82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
    X509v3 CRL Distribution Points: 

        Full Name:
          URI:http://security.mycompany.co.za/root.crl`

Ma ahimè! I miei certificati precedentemente firmati non convalidano più rispetto a questo:

openssl verify -verbose -CAfile MyCA.pem git.pem 
git.pem: OK

openssl verify -verbose -CAfile MyNewCA.pem git.pem 
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate

Principalmente sto cercando maggiori informazioni su come funzionano i certificati e perché. Ma gradirei anche una soluzione al problema che porta a questo, quindi ecco anche alcune informazioni di base.

Come sono entrato in questo casino: HTTPS ai servizi interni funziona alla grande una volta che la mia CA è installata tramite Explorer RMB → Installa la GUI del certificato su Windows o /usr/local/share/ca-certificatesseguita da update-ca-certificatesDebian e Ubuntu. Ma di recente ho riscontrato un'eccezione: Git su Windows, in particolare se installato per utilizzare Windows Secure Channel come back-end SSL. Che apparentemente insiste per impostazione predefinita che ci deve essere un campo CRL nei certificati SSL.

Quindi immagino che sia davvero un problema di Windows Secure Channel perché il messaggio di errore che continuo a eseguire sembra interamente specifico di Microsoft: fatal: unable to access 'https://angery@git.mycompany.co.za/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.

Se installo Git con OpenSSL e concateno manualmente la mia CA sul file indicato da git.http.sslcainfo, allora funziona, ma temo che i miei utenti saranno inclini a non dare seguito alla verifica dell'identità SSL se ritengono che questo processo sia più impegnativo di facendo clic sulla "facile" GUI del programma di installazione dei certificati di Windows.


1
Solo la chiave pubblica e l'oggetto rendono un certificato univoco. Pertanto, se non si cambia neanche, si dovrebbe essere in grado di firmare nuovamente il certificato mentre si alterano tutti gli altri campi ed estensioni al contenuto del tuo cuore.
garethTheRed,

@garethTheRed ah, ha senso. Non sono sicuro di come farlo; potresti elaborare o pubblicare una risposta con maggiori dettagli? Speravo che -x509toreqavrebbe recuperato tutte le informazioni uniche dalla CA radice esistente, ma o non lo fa o c'è qualcosa di sbagliato nel mio processo da lì.
AngerySysadmin,

1
req -new -x509ed x509 -req -signkeyentrambi predefiniscono il seriale del certificato autofirmato su un numero casuale (sebbene questo possa essere sovrascritto) effettivamente un nonce. Se il tuo figlio cert (o uno di essi) contiene AuthorityKeyIdentifier utilizzando l'opzione 'issuer + serial' (invece di o in aggiunta all'opzione 'keyid'), che sarà il caso se hai usato cacon il file di configurazione predefinito upstream, tu è necessario creare il nuovo root con lo stesso seriale di quello vecchio; usare -set_serial. ...
dave_thompson_085,

... Ma alcuni sw potrebbero essere infelici se si tenta di importare un nuovo certificato con lo stesso nome e seriale di uno esistente; potresti aver bisogno di ripulire prima quello vecchio.
dave_thompson_085,

1
Vicino-cross-dupe security.stackexchange.com/questions/17331/... PS: Io penso che sia possibile ottenere Windows per memorizzare nella cache manualmente il CRL per una CA, nel qual caso la mancanza di CRLDP potrebbe non importa, ma come scomodo che sarebbe Non lo so.
dave_thompson_085,

Risposte:


6

Due certificati sono considerati uguali fintanto che il Nome soggetto e la Chiave pubblica dei certificati corrispondono.

Pertanto, tutto ciò che devi fare è riutilizzare le chiavi e assicurarti che il Nome soggetto nel nuovo certificato sia lo stesso del vecchio. Successivamente, è possibile modificare uno qualsiasi degli altri campi e / o estensioni e il certificato risultante verrà considerato lo stesso.

Ad esempio, crea il tuo file di configurazione OpenSSL:

[ req ]

prompt             = no
string_mask        = default
distinguished_name = x509_distinguished_name
x509_extensions     = x509_ext

[ x509_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.
# Adjust for your setup:

countryName = za
organizationName = My Company
organizationalUnitName = Security
commonName = My Root CA

[ x509_ext ]

basicConstraints = critical,CA:true
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier = hash
crlDistributionPoints = URI:http://security.mycompany.co.za/root.crl

e salvalo come ad es rootca.cnf. Assicurarsi che gli elementi del [req_distinguished_name]siano identici a quelli nel certificato CA radice originale (questa è la parte identica del nome soggetto).

Quindi, esegui:

openssl req -new -x509 -key rootca.key -out MyNewCA.pem -config rootca.cnf

dove si rootca.keytrova la chiave privata utilizzata nel certificato originale (questa è la parte identica della chiave pubblica / privata).

Questo crea MyNewCA.pem, che puoi verificare con:

$ openssl x509 -noout -text -in MyNewCA.pem

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 17564687072266118846 (0xf3c24dd49d5166be)
Signature Algorithm: sha256WithRSAEncryption
    Issuer: C=za, O=My Company, OU=Security, CN=My Root CA
    Validity
        Not Before: Jul 15 05:05:54 2017 GMT
        Not After : Aug 14 05:05:54 2017 GMT
    Subject: C=za, O=My Company, OU=Security, CN=My Root CA
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
            Public-Key: (2048 bit)
            Modulus:
                00:c8:3d:32:8a:56:31:f6:27:1a:ce:9e:b2:1d:fb:
                ce:9f:ce:5b:42:25:aa:fe:8b:f4:34:32:ac:b3:02:
                50:71:f8:c3:43:0c:c7:2c:9f:fe:48:1b:c6:c0:e7:
                d6:44:a9:e7:d7:a0:7e:58:f4:b6:38:61:7e:d0:af:
                0f:56:21:e7:49:7a:66:13:f5:7a:fe:3d:ab:65:f8:
                01:eb:52:a7:3b:ae:a0:cf:50:57:b9:e0:09:0b:1f:
                90:14:fb:18:56:1d:57:99:a9:76:a2:63:d1:c2:d3:
                a3:f4:3a:ff:91:0d:ee:8d:44:13:58:00:09:93:da:
                e8:6a:fd:64:5f:c3:42:8e:2a:49:6e:0d:73:b7:b9:
                d4:6c:c6:ce:30:c5:82:24:a5:00:37:17:a0:1d:f1:
                c9:e9:e3:18:48:22:4f:33:96:a7:3c:a9:31:f1:3f:
                14:40:6a:74:e8:78:82:45:04:d4:4b:56:0b:cd:be:
                48:8d:03:fb:39:70:0b:91:99:70:06:bd:5e:8b:f2:
                d1:f4:6f:fc:ce:e7:f8:3c:0a:20:ea:35:b8:5f:2f:
                ee:8d:ff:d3:93:85:6b:fb:71:db:1b:e6:e9:1d:a7:
                f8:e4:ae:f4:71:fe:35:a7:89:24:af:69:a4:34:3b:
                14:66:05:02:5e:2a:1d:ac:e0:d2:48:6c:13:4e:75:
                58:93
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Basic Constraints: critical
            CA:TRUE
        X509v3 Key Usage: critical
            Certificate Sign, CRL Sign
        X509v3 Subject Key Identifier: 
            3B:45:93:3A:2A:BC:39:29:36:13:6C:BD:B6:B4:31:C7:E7:BB:32:73
        X509v3 CRL Distribution Points: 

            Full Name:
              URI:http://security.mycompany.co.za/root.crl

Signature Algorithm: sha256WithRSAEncryption
     4d:96:d4:03:4f:e3:7c:26:be:59:f8:23:87:60:f7:4c:d3:a1:
     1c:77:a1:14:e3:e7:da:c8:2a:a3:1b:06:2a:4d:55:1c:83:26:
     73:46:0d:8a:e4:b7:d1:1e:38:cc:78:90:00:01:b3:8e:f9:3c:
     62:be:04:09:90:4e:22:87:b1:aa:bd:f9:73:bd:a7:76:ad:d5:
     ae:2d:7a:1c:1e:1a:67:c8:57:4c:f9:6d:8b:62:d6:e5:ea:e0:
     40:5c:12:28:7e:ea:f0:0c:d6:cd:f4:1d:d5:56:09:ad:43:b4:
     eb:8c:68:ce:56:a2:a8:ae:a4:d5:35:bb:58:b8:ed:82:82:b5:
     ef:cb:e2:6d:76:61:ed:ee:a5:1f:68:95:07:ed:5b:f0:65:92:
     d2:dc:1d:c6:fa:7f:e0:c9:38:c2:c6:6f:03:38:e7:3a:b0:24:
     06:e0:bc:07:dd:e7:a0:dc:74:09:e5:37:7b:66:e1:6f:47:4c:
     71:ff:02:48:7f:d4:4f:ce:cb:91:e9:ee:cd:b6:f1:0a:03:19:
     3e:19:05:7d:8f:48:e7:f1:cc:07:37:3d:91:3c:6f:54:71:3c:
     a2:6c:55:c3:03:c1:7f:eb:9e:70:f1:8f:a1:fb:62:33:8b:86:
     2c:79:bc:76:e2:01:9a:68:df:af:40:a1:b2:9c:f6:a1:e1:6e:
     2a:dd:1a:d6

Utilizzare questo nuovo certificato al posto dell'originale.

Puoi modificare altri campi ed estensioni, come il periodo di validità del certificato, ma tieni presente che non dovresti avere alcun vincolo (diverso da basicConstraints = critical,CA:true) sul certificato CA principale.


Dopo ulteriori considerazioni, il problema potrebbe dipendere semplicemente dal fatto che il certificato CA radice sostitutivo non ha le basicConstrainted eventualmente le keyUsageestensioni. Potrebbe valere la pena provare ad aggiungere queste due estensioni al tuo ext.confprimo e testare il nuovo certificato CA radice risultante utilizzando il -x509toreqmetodo che hai pubblicato.


Grazie per la risposta esaustiva, mi ha davvero aiutato a capire meglio le cose. Con questo e i commenti di @ dave_thompson_085 sono riuscito a rigenerare la mia CA in un modo che non invalida i certificati secondari. Ci sono state alcune cose che non andavano nel mio tentativo originale (probabilmente dovrei pubblicare una risposta con maggiori dettagli?) Grazie anche per quell'ovvia retrospettiva ma importante punto che "Nome soggetto" è un campo composto da quei campi particolari. In qualche modo dubito che qualcun altro pubblicherà una risposta, quindi accetto questo.
AngerySysadmin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.