¿Cómo puedo usar un certificado SSL comodín para autenticar mutuamente varios servidores WCF a través de X509?

StackOverflow https://stackoverflow.com/questions/1630968

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo dos servidores WCF, ambos en el dominio midominio.com (¡ejemplo ficticio, como se muestra a continuación en la IP!), respectivamente nombrados servidor1 y servidor2.

Ambos son accesibles a través de sus direcciones IP públicas (foo.1 y 2), pero también desde la LAN privada en la que se encuentran (es decir, 192.168.0.1 y 192.168.0.2)

Tengo un certificado SSL comodín para * .midominio.com. Está instalado correctamente en las tiendas relevantes (es decir, Personal para el cifrado y Clientes de confianza para la autenticación)

Me gustaría que mis dos servidores se conectaran entre sí en sus direcciones de red locales utilizando mi certificado comodín para fines de autenticación.

He actualizado el archivo C: \ Windows \ System32 \ drivers \ etc \ hosts para que se vea así:

192.168.0.1     Server1.mydomain.com
192.186.0.2     Server2.mydomain.com

Esas no son las direcciones IP que obtengo si resuelvo Server1.mydomain.com (prefiero obtener foo.1 - 2)

También he editado el sufijo DNS específico de conexión para mis interfaces locales IPV4 a "mydomain.com"

Mi certificado se denomina así en mis archivos Server.config (he eliminado todas las partes no relacionadas con la autenticación)

        <behavior name="ServerToServerBehavior" >
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online"/>
            </clientCertificate>
            <serviceCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="myServerAsClientBehaviorConfiguration">
          <clientCredentials>
            <clientCertificate x509FindType="FindByThumbprint" findValue="13a41b3456e431131cd461de" storeLocation="LocalMachine"/>
            <serviceCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" revocationMode="Online" trustedStoreLocation="LocalMachine"/>
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>

Esto funciona perfectamente bien en mi propia computadora de desarrollo con certificados X509 generados localmente, pero en mi entorno de producción, esto es lo que obtengo:

  

Server.Connect: no se pudo conectar a   servidor Servidor2:   System.ServiceModel.Security.MessageSecurityException:   Verificación de identidad fallida para saliente   mensaje. La identidad DNS esperada de   el punto final remoto era   'server2.mydomain.com' pero el control remoto   punto final proporcionado reclamo DNS   'midominio.com'. Si esto es un   punto final remoto legítimo, puedes   solucionar el problema explícitamente   especificando la identidad DNS 'midominio.com'   como propiedad de identidad de   EndpointAddress al crear el canal   proxy.

He intentado que el servidor responda Server2.mydomain.com en lugar de solo mydomain.com, sin éxito. ¿Alguna pista sobre cómo hacer esto?

También probé la solución sugerida en el mensaje de error, pero esto parece no tener ningún efecto (otros usuarios parecen tener el mismo problema y aún no he encontrado una solución). ¿Alguna idea sobre cómo solucionar esto?

Editar: Verifiqué con mi proveedor de certificados que realmente puedo usarlo para la autenticación X509.

¿Fue útil?

Solución

Finalmente entendí por qué mi campo de Identidad estaba siendo ignorado.

Mi punto final se construyó así:

DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", "net.tcp://server.mydomain.com/Server");

cuando se proporciona el parámetro uri, el campo de identidad DNS (definido en la aplicación.config), también se anula (incluso si está vacío, que es el caso cuando usamos una cadena en lugar de un objeto URI real).

la solución es configurarlo mediante programación usando el siguiente código:

        System.ServiceModel.EndpointAddress uri = new System.ServiceModel.EndpointAddress(new Uri("net.tcp://server.mydomain.com/Server"),new System.ServiceModel.DnsEndpointIdentity("mydomain.com"),new System.ServiceModel.Channels.AddressHeader[0]);

        DistantServer = new ServiceReferenceServerToServer.ServerToServerClient("myServerBinding", uri );

Otros consejos

Creo que la anulación de reclamo de DNS del error del que se habla se especificaría en el lado del cliente, no en el servidor, por lo que no está abriendo nada al hacer ese cambio, excepto que su cliente podría conectarse con éxito a cualquier servidor dominio (si estuviera escuchando). El error que está viendo es similar al equivalente de seguridad del mensaje de una falta de coincidencia del nombre de host en el certificado. Obtuve la seguridad de los mensajes para trabajar con certificados comodín después de mucho trabajo, pero es posible que deba realizar un trabajo de validación personalizado, ya que su certificado probablemente no tiene el uso de Autenticación de cliente especificado.

¿Alguna razón por la que no está utilizando la seguridad de transporte? MUCHO más simple para trabajar a menos que tenga un enrutamiento intermedio de Layer7 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top