2013-01-31 7 views
6

Abbiamo creato un certificato CA autofirmato che usiamo per firmare altri certificati per scopi SSL. Questi certificati verranno installati in altri server a cui non abbiamo accesso e saranno strettamente comunicanti con altri client come le applicazioni mobili.Come ottenere l'identificazione personale o la chiave pubblica del certificato dell'emittente?

Quando questi client (scritti in .NET) effettuano una richiesta ai server tramite HTTPS, viene visualizzato l'errore "Certificato non valido ricevuto dal server" perché il certificato CA non è una CA attendibile su tale client.

Vogliamo aggirare questa sicurezza utilizzando lo ServicePointManager.ServerCertificateValidationCallback, ma solo se il certificato utilizzato è stato firmato dal nostro certificato CA.

Posso controllare lo certificate.Issuer, ma questo può essere facilmente falsificato da chiunque. Come posso ottenere l'identificazione personale o la chiave pubblica del certificato emittente del certificato non valido? Se riesco ad accedere a questo, posso facilmente confrontarlo con quello che so essere valido e ignorare l'errore del certificato e continuare con la richiesta.

UPDATE

penso io sono sempre più vicini. Sembra che quello che stiamo cercando di fare non sia fattibile, quindi è andata in una direzione leggermente diversa.

Utilizzando la X509Chain possiamo verificare se il certificato è un figlio del CA usando il codice seguente:

var caCert = new X509Certificate2(@"[path]\MyCA.cer"); 

var newChain = new X509Chain(); 
newChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
newChain.ChainPolicy.ExtraStore.Add(caCert); 

var res = newChain.Build(certInQuestion); 

Build() restituisce ancora false (come previsto perché il CA non è attendibile sul client), ma ora newChain.ChainStatus[0].Status restituisce UntrustedRoot. Sulla base dei miei test, ciò significa che la catena è stata convalidata perché se fornisco un certificato CA diverso non riesce con InvalidChain.

In conclusione, che mi dice che se lo stato è UntrustedRoot, il certificato era creata con il nostro certificato CA e quindi è valido, tutto il resto si tratta di un falso!

sono le mie ipotesi corretta?

+0

Se ho la chiave pubblica dell'Emittente, forse posso fare qualcosa per convalidare il certificato contro quella chiave? –

risposta

0

Non sono del tutto sicuro che questo questo è quello che stai cercando, ma potrebbe spingere nella giusta direzione. Ecco uno script PowerShell che uso per trovare un cert che ho appena creato e estratto usando Makecert.exe & Certmgr.exe:

# get certificate thumbprint 
$appCertificate = Get-PfxCertificate -FilePath $certificateFullPath 

Write-Host " .. adding certificate to local machine root" -ForegroundColor Gray 
& $ExeCertManager /add $certificateFullPath /s /r localMachine root 
Write-Host " Certificate installed on local machine" -ForegroundColor Gray 

Write-Host " .. exporting private key for certificate" -ForegroundColor Gray 
Get-ChildItem cert:\\localmachine\my | Where-Object {$_.Thumbprint -eq $appCertificate.Thumbprint} | ForEach-Object { 
    $CertPfxName = (Get-Item -Path $certificateFullPath).BaseName 
} 
+0

Grazie Andrew, ma sto provando a convalidare la chiave pubblica o l'identificazione digitale dell'emittente di un certificato a livello di codice all'interno di un'applicazione mobile. –

0

Questa è la soluzione sbagliata. È necessario installare il certificato autofirmato come certificato CA attendibile in tutti i client, o meglio ancora farlo firmare da una CA già affidabile. Non scrivere codice per questo.

+0

l'installazione del certificato CA in tutti i client non è gestibile. Mi piacerebbe essere in grado di firmarlo con una CA di fiducia, ma ci sono decisioni aziendali sul perché lo stiamo facendo in questo modo. –

+0

A * pessima scelta commerciale *. Lo ha recensito. Ottenere la firma ti costerà cinquanta dollari, impiega circa 24 ore e funziona immediatamente, correttamente e in modo sicuro. Scrivere codice e testarlo ecc. Costerà migliaia, impiega giorni se non settimane e introduce rischi per la sicurezza che non puoi neppure quantificare. – EJP

+0

non è un singolo certificato. Questi certificati sono installati sui server del cliente, quindi sarebbe un certificato per cliente. La decisione aziendale è di rendere l'installazione del server pezzo il più semplice possibile e passare il processo di certificazione SSL ogni anno non è un'opzione che vogliono che i clienti passino. –

0

Sembra che una possibile soluzione sarebbe quella di poter inviare il certificato via e-mail, in base a questa risposta: https://stackoverflow.com/a/4473799/674700.

+0

sì, sono consapevole che posso installare CA certs, ma preferirei stare lontano da esso a questo punto. I client mobili sono iOS ora e saranno Android e WP in seguito. –

0

Ecco alcuni link con informazioni e alcuni strumenti per generare pubblico gratuito e chiavi private:

https://www.igolder.com/pgp/

https://www.igolder.com/pgp/generate-key/

Credo che la soluzione di EJP è la più [email protected] EJP, puoi darci alcuni esempi di applicazioni che possono aiutarci a diventare una "piccola CA".

+0

[TinyCA] (http://tinyca.sm-zone.net/) è uno (da cui il nome). [XCA] (http://xca.sourceforge.net/) è un altro (anche multipiattaforma). – Bruno

+0

Grazie, stavo cercando quel tipo di strumenti ...! – user2088532

Problemi correlati