Best practice per verificare i dati rispetto a una CA.

3

Diciamo che ho firmato la mia chiave pubblica con una CA attendibile e che la CA ha fornito al mio un certificato firmato e voglio che qualsiasi applicazione client verifichi contro questo certificato. Il processo generale è che il client verifica contro la chiave pubblica della CA, e non la mia, quindi non ho nemmeno bisogno di trasmettere la chiave pubblica, ma qual è la migliore pratica per implementarla in un'applicazione client C #?

Il mio attuale approccio scelto è quello sull'applicazione server, sto memorizzando il certificato (che contiene la mia chiave privata) nel mio negozio locale, che uso per firmare i dati. Quindi, sull'applicazione client, sto caricando il root store dell'utente corrente e ho passato il nome del certificato della CA che ha firmato il mio certificato, e se questa CA è stata trovata nell'archivio, recupero la sua chiave pubblica e ho verificato contro quello. Se la mia chiave pubblica è stata firmata dalla CA, la verifica dovrebbe avere esito positivo, altrimenti fallirà. È questo il modo corretto di implementarlo? In caso contrario, fornisci soluzioni migliori.

Le seguenti sono le mie domande riguardo al mio approccio scelto:

  1. Il nome del certificato della CA può cambiare? Se così fosse, dovrei cambiarlo nel codice. Se questo può cambiare, cos'altro dovrei usare? cercare il certificato? Forse il numero di serie?.

  2. Qualcuno può creare lo stesso Nome certificato. Presumo che tu può. Ad esempio, un hacker potrebbe creare un nome di certificato che è lo stesso di una CA stabilita, ma è ovviamente l'utente a aggiungilo al negozio fidato sulla sua macchina. Se non lo fa, allora il l'hacker non ha alcun potere. Inoltre, non lo penso due certificati possono avere lo stesso numero di serie.

  3. Se la mia chiave privata viene dirottata e revoco il certificato, la verifica dovrebbe iniziare a fallire sulle applicazioni del client. esso inizierà a verificare correttamente una volta che avrò iniziato a firmare i messaggi con il nuovo certificato rilasciato dalla CA. È corretto?

Infine, al momento non possiedo un certificato firmato, quindi non posso verificarlo. Ecco perché sto facendo queste domande, così che se questo approccio è corretto, posso procedere all'acquisto di un certificato poiché conosco la strada da seguire. Inoltre, si spera, questa domanda potrebbe aiutare altre persone con lo stesso problema.

Grazie in anticipo.

    
posta seedg 15.10.2015 - 16:05
fonte

1 risposta

1

Let's say that I have signed my public key with a trusted CA and the CA provided my with a signed certificate, and I want any client applications to verify against this certificate. The general process is that the client verifies against the CA's public key, and not my own, so I do not even need to transmit the public key, but what is the best practice to implement this in a C# client application?

Hai bisogno della tua chiave pubblica (contenuta nel certificato) sui client per convalidare la firma che hai fatto con la tua chiave privata. Si utilizza il certificato CA per convalidare la firma del certificato (un certificato è una chiave pubblica + alcune informazioni sul proprietario (oggetto) del certificato).

Puoi inviare il tuo certificato su ogni richiesta o averlo memorizzato nella cache sul client, che è indipendente dalla lingua.

My current chosen approach is that on the server application, I am storing the certificate (which contains my private key) in my local store, which I use to sign data. Then, on the client application, I am loading the Root store of the Current User and I pass the certificate name of the CA which signed my certificate, and if this CA is found in the store, I retrieve its public key and I verify against that. If my public key has been signed by the CA, then verification should succeed, otherwise it will fail. Is this the correct way of implementing it? If not, please provide better solutions.

Non è il modo corretto. Dovresti avere il tuo certificato sul client. Verificare il certificato utilizzando il certificato CA e quindi utilizzare il certificato (che contiene una chiave pubblica) per verificare la firma.

The following are my questions regarding my chosen approach:

Tutti questi non si verificano se convalidi correttamente il certificato rispetto al certificato CA. Vorrei raccomandare di non reinventare la ruota qui, e utilizzare un percorso di certificazione standard da una buona libreria, poiché è complesso farlo funzionare correttamente. Spiegherò sopra come ogni cosa è risolta in una convalida del percorso del certificato:

Can the Certificate Name of the CA change? If so, I would have to change it in code. If this can change, what else should I use to search for the certificate? Maybe the SerialNumber?.

Il tuo certificato ha campi che identificano correttamente e esattamente chi lo ha emesso, utilizzando molti campi del certificato che non dovrebbero collidere. Se si colide, ancora, la firma del certificato deve corrispondere.

Can someone create the same Certificate Name. I am assuming that you can. For instance, a hacker might create a certificate name which is the same as an established CA, but it is obviously up the user to add it to the trusted store on his machine. If he does not, then the hacker does not have any power whatsoever. Also, I do not think that two certificates can have the same Serial Number.

Questo sarà sormontato dalla firma della CA sul certificato, che verificherà prima di utilizzarlo.

If my private key is hijacked and I revoke the certificate, verification should start failing on the client's applications. It will start verifying successfully once I start signing the messages with the newly issued certificate by the CA. Is this correct?

Questo sarà risolto dal controllo di revoca, che dovresti abilitare sulla verifica del percorso di certificazione. Quando la chiave privata viene dirottata, è necessario chiedere alla CA di revocarla e verrà aggiunta in un CRL (elenco di revoche di certificati) verificato sulla verifica del percorso di certificazione.

Finally, I do not currently possess a signed certificate so I cannot test this out. That is why I am asking these questions, so that if this approach is correct, I can proceed to buy a certificate since I know the way forward. Also, hopefully, this question might help other people with the same problem.

Potresti creare la tua CA e fare dei test, usando Microsofts CA, openssl o altri strumenti. Ci sono molti tutorial su questo disponibile.

    
risposta data 07.01.2016 - 13:43
fonte

Leggi altre domande sui tag