Compartir a través de


Autenticación mutua en un servicio de Windows Sockets con SCP

Los temas de esta sección incluyen ejemplos de código que muestran cómo realizar la autenticación mutua con un servicio que se publica mediante un punto de conexión de servicio (SCP). Los ejemplos se basan en un servicio de Microsoft Windows Sockets que usa un paquete SSPI para controlar la negociación de autenticación mutua entre un cliente y el servicio. Use los procedimientos siguientes para implementar la autenticación mutua en este escenario.

Para registrar SPN en un directorio cuando se instala un servicio

  1. Llame a la funciónDsGetSpn para redactar nombres de entidad de seguridad de servicio (SPN) para el servicio.
  2. Llame a la funciónDsWriteAccountSpnpara registrar los SPN en la cuenta de servicio o en la cuenta de equipo en cuyo contexto se ejecutará el servicio. Este paso debe realizarse por un administrador de dominio; una excepción es que un servicio que se ejecuta en la cuenta localSystem puede registrar su SPN con el formato "<clase de servicio>/<host>" en la cuenta de equipo del host de servicio.

Para comprobar la configuración en el inicio del servicio

Para autenticar el servicio en el inicio del cliente

  1. Recupere los datos de conexión del punto de conexión de servicio del servicio.
  2. Establezca una conexión con el servicio.
  3. Llame a la funciónDsMakeSpn para crear un SPN para el servicio. Compone el SPN de la cadena de clase de servicio conocida y los datos recuperados del punto de conexión de servicio. Estos datos incluyen el nombre de host del servidor en el que se ejecuta el servicio. Tenga en cuenta que el nombre de host debe ser un nombre DNS.
  4. Use un paquete de seguridad SSPI para realizar la autenticación:
    1. Llame a la funciónAcquireCredentialsHandle para adquirir las credenciales del cliente.
    2. Pase las credenciales de cliente y el SPN a la función InitializeSecurityContext para generar un blob de seguridad que se envíe al servicio para la autenticación. Establezca la marca ISC_REQ_MUTUAL_AUTH para solicitar autenticación mutua.
    3. Intercambie blobs con el servicio hasta que se complete la autenticación.
  5. Compruebe la máscara de funcionalidades devuelta para la marca de ISC_REQ_MUTUAL_AUTH para comprobar que se realizó la autenticación mutua.
  6. Si la autenticación se realizó correctamente, intercambie el tráfico con el servicio autenticado. Use la firma digital para asegurarse de que los mensajes entre el cliente y el servicio no se han alterado. A menos que los requisitos de rendimiento sean graves, use el cifrado. Para obtener más información y un ejemplo de código que muestra cómo usar elMakeSignature de, VerifySignature, EncryptMessagey funciones de descifrado de DecryptMessage en un paquete SSPI, vea Garantizar la integridad de la comunicación durante el intercambio de mensajes.

Para autenticar el cliente por el servicio cuando un cliente se conecta

  1. Cargue un paquete de seguridad SSPI que admita la autenticación mutua.
  2. Cuando un cliente se conecta, use el paquete de seguridad para realizar la autenticación:
    1. Llame a la función acquireCredentialsHandle para adquirir las credenciales del servicio.
    2. Pase las credenciales del servicio y el blob de seguridad recibidos del cliente a la función AcceptSecurityContext para generar un blob de seguridad que se devuelva al cliente.
    3. Exchange blobs con el cliente hasta que se complete la autenticación.
  3. Compruebe la máscara de funcionalidades devuelta para la marca de ASC_RET_MUTUAL_AUTH para comprobar que se realizó la autenticación mutua.
  4. Si la autenticación se realizó correctamente, intercambie el tráfico con el cliente autenticado. Use la firma digital y el cifrado a menos que el rendimiento sea un problema.

Para obtener más información y un ejemplo de código para este escenario de autenticación mutua, consulte:

Para obtener más información, consulte: