2011-08-25 27 views
7

Sto cercando di utilizzare i certificati a livello di codice anziché utilizzare lo store. Sto creando X509Certificate2 con nome file e password., verificare a livello di programmazione

Questo funziona correttamente quando ho aggiunto manualmente il certificato di origine all'archivio certificati in Trusted People. Tuttavia, preferirei non doverlo fare su ogni implementazione: preferirei farlo anche a livello di programmazione.

Quando rimuovo il certificato di origine dall'Archivio certificati ottengo un'eccezione.

Tutto ciò che ho letto sembra dire che devo aggiungere manualmente il certificato di root all'archivio certificati, altrimenti la catena di fiducia non funzionerà.

Domanda: C'è un modo programmatico per configurare la catena di trust, quindi non devo farlo manualmente?

Il codice si presenta come:

 var serverCert = new X509Certificate2("FullPathToMyCertificate.cer", "Password"); 
     Client.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert; 

L'eccezione, che occures quando cerco di utilizzare il client, è:

System.IdentityModel.Tokens.SecurityTokenValidationException 

The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US is not in the trusted people store. 
The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority. 

risposta

4

Il componente utilizzato verifica della catena di default - quando la catena non è possibile verificare se ottieni questa eccezione. SE si vuole fare tutto, compreso la verifica della catena nel codice allora avete bisogno di implement "custom validation" and integrate that into the WCF Host:

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.Custom; 
Client.ServiceCertificate.Authentication.CustomCertificateValidator = 
    new MyCertificateValidator(); 

Un'altra opzione potrebbe essere quella di disabilitare la convalida del tutto (NON per la produzione !!!)

Client.ServiceCertificate.Authentication.CertificateValidationMode = 
       X509CertificateValidationMode.None; 

EDIT - dopo il commento:

per la validazione del collegandoti a te stesso dovresti dare un'occhiata a X509Chain e X509Store - per avere un'idea di come si possa implementare tale verifica della catena dai un'occhiata a Mono's implementation del Verify ... in pratica si usa il metodo Find per cercare uno X509Certificate2Collection per il genitore e quindi su ... i criteri di verifica con una convalida personalizzata spetta a te (firma valida, non scaduta ...).

alcuni link di riferimento a MSDN:

+0

Grazie mille per la risposta rapida, Yahia. Quindi, diciamo che volevo implementare un ** CustomCertificateValidator ** che imitasse il comportamento predefinito che si verifica quando non uso un ** CustomCertificateValidator ** ma ho aggiunto manualmente il certificato di root all'archivio certificati in Trusted People. Cosa metterei nel mio ** CustomCertificateValidator **? Presumibilmente, il comportamento predefinito valuta il ** serverCert ** rispetto al certificato radice in Trusted People, decide che è OK e consente al client di ricevere la risposta.Che cosa fa per fare questa valutazione? Grazie ancora, Steve. – Steve

+0

a cosa si riferisce il client qui (ad esempio in Client.ServiceCertificate.), Naespace per favore? Grazie molto. – iTSrAVIE

+1

Questo NON è uno spazio dei nomi. Questo codice presuppone che si trovi in ​​una classe derivata da System.ServiceModel.ClientBase <> e questa "ClientBase" espone, dicendo semplicemente, una proprietà 'ClientCredentials' su cui è possibile eseguire '.ServiceCertificate' quindi '.Authentication' then '. CertificateValidationMode "e così via. Se hai bisogno di sapere esattamente, il ServiceCertificate è una classe X509CertificateRecipientClientCredential – quetzalcoatl

Problemi correlati