2011-08-25 11 views
7

Estoy tratando de usar certificados programáticamente, en lugar de usar la tienda. Estoy creando X509Certificate2 con nombre de archivo y contraseña.WCF Certificate Chain, verifique programáticamente

Esto funciona bien cuando agregué manualmente el certificado raíz al almacén de certificados en Trusted People. Sin embargo, preferiría no tener que hacer eso en cada implementación; prefiero tratarlo programáticamente también.

Cuando elimino el certificado raíz del almacén de certificados obtengo una excepción.

Todo lo que he leído parece indicar que tengo que agregar manualmente el certificado raíz al Certificate Store o que la cadena de confianza no funcionará.

Pregunta: ¿Existe alguna manera programática de configurar Trust Chain, por lo que no tengo que hacerlo manualmente?

El código es el siguiente:

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

La excepción, que occures cuando trato de usar el cliente, es:

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. 

Respuesta

4

El componente utilizado verifica la cadena por defecto - cuando la cadena No se puede verificar que obtienes esa excepción. SI usted quiere hacer todo, incluyendo la verificación de la cadena en el código, entonces tienes que implement "custom validation" and integrate that into the WCF Host:

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

Otra opción sería la de desactivar la validación completo (para la producción de NO !!!)

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

EDITAR - después del comentario:

Para validar la encadenarte debes echar un vistazo a X509Chain y X509Store - para hacerte una idea de cómo se podría implementar una verificación de cadena de este tipo echa un vistazo a Mono's implementation del Verify ... básicamente utilizas el método Find para buscar un X509Certificate2Collection para el padre y así en ... los criterios de verificación con una validación personalizada dependen de usted (firma válida, no caducada ...).

algunos enlaces de referencia en MSDN:

+0

Muchas gracias por la rápida respuesta, Yahia. Entonces, digamos que quería implementar un ** CustomCertificateValidator ** que imitaba el comportamiento predeterminado que ocurre cuando no uso ** CustomCertificateValidator ** pero he agregado manualmente el certificado raíz al Certificate Store en Trusted People. ¿Qué pondría en mi ** CustomCertificateValidator **? Presumiblemente, el comportamiento predeterminado evalúa el ** serverCert ** contra el certificado raíz en Trusted People, decide si está correcto y permite que el cliente reciba la respuesta.¿Qué hace para hacer esta evaluación? Gracias de nuevo, Steve. – Steve

+0

¿a qué se refiere el cliente aquí (por ejemplo, en Client.ServiceCertificate), naespace, por favor? Muchas gracias. – iTSrAVIE

+1

Este NO es un espacio de nombres. Este código supone que se encuentra en una clase derivada de System.ServiceModel.ClientBase <> y esta "ClientBase" expone, diciendo simplemente, una propiedad 'ClientCredentials' en la que puede hacer '.ServiceCertificate' y luego '.Authentication' then '. CertificateValidationMode "y así sucesivamente. Si necesita saber exactamente, el ServiceCertificate es una clase X509CertificateRecipientClientCredential – quetzalcoatl

Cuestiones relacionadas