Función WSASetSocketSecurity (ws2tcpip.h)
La función WSASetSocketSecurity habilita y aplica seguridad para un socket.
Sintaxis
INT WSAAPI WSASetSocketSecurity(
[in] SOCKET Socket,
[in, optional] const SOCKET_SECURITY_SETTINGS *SecuritySettings,
[in] ULONG SecuritySettingsLen,
[in, optional] LPWSAOVERLAPPED Overlapped,
[in, optional] LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine
);
Parámetros
[in] Socket
Descriptor que identifica un socket en el que se aplica la configuración de seguridad.
[in, optional] SecuritySettings
Puntero a una estructura de SOCKET_SECURITY_SETTINGS que especifica la configuración de seguridad que se va a aplicar al tráfico del socket. Si este parámetro es NULL, la configuración predeterminada se aplicará al socket.
[in] SecuritySettingsLen
Tamaño, en bytes, del parámetro SecuritySettings .
[in, optional] Overlapped
Puntero a una estructura WSAOVERLAPPED . Este parámetro se omite para sockets no superpuestos.
[in, optional] CompletionRoutine
Puntero a la rutina de finalización a la que se llama cuando se ha completado la operación. Este parámetro se omite para sockets no superpuestos.
Valor devuelto
Si la función es correcta, el valor devuelto es cero. De lo contrario, se devuelve un valor de SOCKET_ERROR y se puede recuperar un código de error específico llamando a WSAGetLastError.
A continuación se enumeran algunos códigos de error posibles.
Código de error | Significado |
---|---|
La familia de direcciones especificada no se admite. | |
Se pasó un parámetro no válido. Este error se devuelve si el socket pasado en el parámetro Socket no se creó con una familia de direcciones del AF_INET o AF_INET6 y un tipo de socket de SOCK_DGRAM o SOCK_STREAM. Este error también se devuelve si la estructura SOCKET_SECURITY_SETTINGS a la que apunta el parámetro SecuritySettings tiene un valor incorrecto. | |
El socket está conectado. Esta función no se permite con un socket conectado, ya sea que el socket esté orientado a la conexión o sin conexión. | |
Un búfer pasado era demasiado pequeño. | |
El descriptor pasado en el parámetro Socket no es un socket válido. |
Comentarios
El propósito principal de la función WSASetSocketSecurity es activar la seguridad de un socket si aún no está habilitado por la directiva administrativa. Para IPsec, esto significa que se crearán instancias de las directivas y los filtros IPsec adecuados que se usarán para proteger este socket. La función WSASetSocketSecurity también se puede usar para establecer requisitos de seguridad específicos para el socket.
Esta función simplifica la necesidad de llamar a la función WSAIoctl con un parámetro dwIoControlCode establecido en SIO_SET_SECURITY.
Se puede llamar a la función WSASetSocketSecurity en un parámetro Socket creado con una familia de direcciones de AF_INET o AF_INET6.
Para una aplicación cliente que usa sockets orientados a la conexión (protocolo de IPPROTO_TCP), se debe llamar a la función WSASetSocketSecurity antes de llamar a la función connect, ConnectEx o WSAConnect . Si se llama a la función WSASetSocketSecurity después de la función connect, ConnectEx o WSAConnect , WSASetSocketSecurity debe producir un error.
Para una aplicación de servidor mediante sockets orientados a la conexión (protocolo de IPPROTO_TCP), se debe llamar a la función WSASetSocketSecurity antes de llamar a la función bind . Si se llama a la función WSASetSocketSecurity después de la función de enlace , WSASetSocketSecurity debe producir un error.
En el caso de los sockets sin conexión (protocolo de IPPROTO_UDP), la aplicación debe llamar a la función WSASetSocketSecurity inmediatamente después de que se devuelva la llamada de socket o WSASocket .
Las aplicaciones de servidor deben llamar a la función setsockopt para adquirir acceso exclusivo al puerto utilizado por el socket. Esto impide que otras aplicaciones usen el mismo puerto. Se llamaría a la función setsockopt con el parámetro level establecido en SOL_SOCKET, el parámetro optname establecido en SO_EXCLUSIVEADDRUSE y el parámetro value establecido en distinto de cero. La función WSASetSocketSecurity llama internamente a setsockopt con SO_EXCLUSIVEADDRUSE para obtener acceso exclusivo al puerto. Esto es para asegurarse de que el socket no es vulnerable a ataques por otras aplicaciones que se ejecutan en el equipo local.
La configuración de seguridad no establecida mediante WSASetSocketSecurity se deriva de la directiva predeterminada del sistema o de la directiva configurada administrativamente. Se recomienda que la mayoría de las aplicaciones especifiquen un valor de SOCKET_SECURITY_PROTOCOL_DEFAULT para la enumeración SOCKET_SECURITY_PROTOCOL en el miembro SecurityProtocol del SOCKET_SECURITY_PROTOCOL señalado por el parámetro SecuritySettings . Esto hace que la aplicación sea neutra para los protocolos de seguridad y permita implementaciones más sencillas entre diferentes sistemas.
Cuando el parámetro SecuritySettings apunta a una estructura de SOCKET_SECURITY_SETTINGS_IPSEC , el miembro SecurityProtocol de la estructura debe establecerse en SOCKET_SECURITY_PROTOCOL_IPSEC, no en SOCKET_SECURITY_PROTOCOL_DEFAULT.
Se devolverá un error si no se cumplen las condiciones siguientes.
- La familia de direcciones del parámetro Socket debe ser AF_INET o AF_INET6.
- El tipo de socket debe ser SOCK_STREAM o SOCK_DGRAM.
- La aplicación debe establecer su configuración de seguridad antes de llamar a las funciones bind, connect, ConnectEx o WSAConnect .
- La función WSASetSocketSecurity solo se puede llamar una vez por socket.
Directiva IPsec de socket seguro predeterminada
Si el parámetro SecuritySettings se establece en NULL y no hay ninguna otra directiva IPsec especificada administrativamente en el equipo, se usará una directiva de seguridad predeterminada basada en IPsec para proteger el tráfico de la aplicación. Algún tipo de credencial de autenticación (un certificado de usuario o pertenencia a un dominio, por ejemplo) debe estar presente para que IPsec se realice correctamente con una directiva predeterminada.La directiva IPsec predeterminada se ha diseñado para que la seguridad de IPsec se pueda negociar en tantos escenarios como sea posible.
Authip MM policy =
{
Auth methods = {IKE_ANONYMOUS}
No impersonation
Proposals =
{
{
Crypto algos =
IKE_CIPHER_AES_128,
IKE_INTEGRITY_SHA1,
IKE_DH_ECP_256
MM lifetime = 2 hrs
QM = 0 (infinite)
}
{
Crypto algos =
IKE_CIPHER_3DES,
IKE_INTEGRITY_SHA1,
IKE_DH_GROUP_2
MM lifetime = 2 hrs
QM = 0 (infinite)
}
}
}
Authip QM policy =
{
QM proposals =
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_ESP_AUTH,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96
No PFS
}
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_ESP_AUTH_AND_CIPHER,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96,
IPSEC_CIPHER_TRANSFORM_ID_AES_128
No PFS
}
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_ESP_AUTH_AND_CIPHER,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96,
IPSEC_CIPHER_TRANSFORM_ID_CBC_3DES
No PFS
}
{
QM lifetime = 1 hr, 55GB,
Crypto algos =
IPSEC_TRANSFORM_AH,
IPSEC_AUTH_TRANSFORM_ID_HMAC_SHA_1_96
No PFS
}
IPSEC_POLICY_FLAG_ND_BOUNDARY
ndAllowClearTimeoutSeconds = 10
saIdleTimeout = {5mins, 1min}
UM policy =
{
{IKE_SSL, Null-Root-Config}
{IKE_KERBEROS}
{IKE_SSL, Null-Root-Config}
No impersonation
}
}
Requisitos
Cliente mínimo compatible | Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | ws2tcpip.h |
Library | Fwpuclnt.lib |
Archivo DLL | Fwpuclnt.dll |
Consulte también
SOCKET_SECURITY_SETTINGS_IPSEC
Uso de extensiones de socket seguro
Plataforma de filtrado de Windows