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?
Se ho la chiave pubblica dell'Emittente, forse posso fare qualcosa per convalidare il certificato contro quella chiave? –