2011-09-07 12 views
6

Me gustaría utilizar cifrado y verificación basados ​​en certificados cuando me comunico con un servicio WCF. Así que creé certificados de prueba, "TempCA" como mi CA raíz y "SignedByCA" como un certificado de cliente firmado por esa CA.Autenticación de confianza de cadena de certificado WCF: "El servicio no autenticó a la persona que llama".

Cuando coloco el certificado del cliente en "Computadora local \ Gente de confianza" y uso certificateValidationMode="PeerTrust", el servicio reconoce al cliente y todo funciona como se espera. Pero con la verificación de la cadena de confianza (certificateValidationMode="ChainTrust"), me encuentro con el error "La persona que llama no fue autenticada por el servicio".

relevante de configuración de servidor:

<behaviors> 
     <serviceBehaviors> 
     <behavior name="customServiceBehavior"> 
      [...] 
      <serviceCredentials> 
       <clientCertificate> 
        <authentication certificateValidationMode="ChainTrust" trustedStoreLocation="LocalMachine" mapClientCertificateToWindowsAccount="false" /> 
       </clientCertificate> 
       <serviceCertificate findValue="TempCA" 
            storeLocation="LocalMachine" 
            storeName="My" 
            x509FindType="FindBySubjectName" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="soapBindingConfiguration"> 
       <security mode="Message"> 
        <message clientCredentialType="Certificate" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 

relevante de configuración del cliente (resto de auto-creada por "Agregar referencia de servicio"):

<endpointBehaviors> 
    <behavior name="customClientBehavior"> 
     <clientCredentials> 
      <clientCertificate findValue="SignedByCA" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" /> 
     </clientCredentials> 
    </behavior> 
</endpointBehaviors> 

Ambos certificados de cliente y servidor están almacenado con su clave privada en "Local Computer \ Personal" (porque estoy probando en una computadora), y la "TempCA" (mi certificado raíz) también está en "Entidades locales de certificación de raíz de computadora confiable".

¿Qué me falta aquí? ¿Algún ejemplo de trabajo?

Respuesta

5

Finalmente descubrí cuál es el problema. La verificación de revocación debe ser desactivada. Evidentemente, mi CA de prueba no tiene una CRL asociada, por lo que en ese caso WCF parece bloquear a todos los clientes porque no se puede validar.

<clientCertificate> 
    <authentication certificateValidationMode="ChainTrust" 
        revocationMode="NoCheck" ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← 
        [...] /> 
</clientCertificate> 
0

Parece que lo que está haciendo debería funcionar basado en this MSDN article al usar certificados con WCF. Es posible que desee eliminar el certificado de la tienda personal cuando use el enfoque de certificado raíz de confianza.

Si eso tampoco funciona, puede ser que la implementación del certificado raíz también requiera aplicar una política de grupo a su máquina. Consulte la sección "Si no utiliza una autoridad de certificación raíz de Microsoft Enterprise y desea solo grupos de computadoras" de this TechNet article.. Indica que es posible que las computadoras no confíen automáticamente en un certificado raíz si no se aplica una directiva de grupo. Los dos artículos parecen contradecirse entre sí, así que no estoy seguro de cuál funcionará.

+0

No estoy en un dominio de ActiveDirectory, por lo que no existe dicha política de grupo disponible en "Configuración de Windows/Configuración de seguridad/Políticas de clave pública". También probé la primera sugerencia y solo coloqué el certificado del servidor en la ubicación "Autoridades de certificación de raíz de confianza" sin éxito. – AndiDog

Cuestiones relacionadas