Compartir a través de


(0x6 ERROR_INVALID_HANDLE) error cuando una aplicación multiproceso accede a una tarjeta inteligente

En este artículo se describe cómo solucionar y corregir el error de "0x6 ERROR_INVALID_HANDLE" que se produce cuando una aplicación multiproceso accede a una tarjeta inteligente.

Se aplica a: Windows 10

Síntomas

Considere el caso siguiente:

  • Tiene una aplicación multiproceso habilitada para tarjeta inteligente.
  • La aplicación tiene acceso a una tarjeta inteligente basada en el proveedor de servicios criptográficos de tarjeta inteligente base de Microsoft (basecsp.dll/scksp.dll).
  • La aplicación se ejecuta durante un tiempo.

En este escenario, recibirá un error de 0x6 ERROR_INVALID_HANDLE .

Este problema se produce si se realiza una llamada a cualquier API crypto que use el administrador de transacciones, como CryptGetKeyParam() y CryptGetUserKey(), para preceder a otra llamada que libera el contexto.

El error ERROR_INVALID_HANDLE no aparece inmediatamente. En función de la carga, los subprocesos tardan tiempo en encontrarse con el problema de sincronización.

Causa

Este problema se produce porque BaseCSP no está diseñado para escenarios de alta carga. Por lo tanto, las tarjetas inteligentes BaseCSP no son seguras para subprocesos ni se admiten en escenarios de alta carga.

Más información

BaseCSP solo puede lograr la seguridad de subprocesos en escenarios de uso típicos, como el usuario único, el inicio de sesión de tarjeta inteligente, el cifrado o el descifrado de correo electrónico y la firma de código.

En escenarios de uso típicos, BaseCSP debe ser seguro para subprocesos por contexto. En escenarios de alta carga, las tarjetas inteligentes BaseCSP encuentran problemas de sincronización del administrador de transacciones.

Solución alternativa

Para solucionar este problema, use uno de los métodos siguientes.

Método 1

Desarrolle un proveedor csp o proveedor KSP e implemente un administrador de transacciones en él. De esta manera, el subsistema de tarjetas inteligentes no usará un administrador de transacciones que se implemente en BaseCSP.

Método 2

Importante

Sigue meticulosamente los pasos que se describen en esta sección. Pueden producirse problemas graves si modifica el Registro de manera incorrecta. Antes de modificarlo, haz una copia de seguridad del registro para restaurarlo, por si se produjeran problemas.

Un tiempo de espera de transacción más corto puede reducir la frecuencia del problema. Para ello, inicie regedit y cambie el valor TransactionTimeoutMilliseconds en la HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\<provider_name> subclave.

Nota:

En esta subclave, <provider_name> es BaseCSP o ksp, según el proveedor.

Para obtener una descripción detallada del Registro, consulte Claves del Registro de KSP y CSP base de tarjeta inteligente.

Por ejemplo, reducir TransactionTimeoutMilliseconds de su valor predeterminado 1500 ms a 100 ms podría reducir la frecuencia del problema.

Importante

Este cambio es solo una recomendación basada en los resultados de pruebas limitados. No hay ninguna garantía de que reducir el valor TransactionTimeoutMilliseconds ayudará a controlar este problema. Además, cambiar el valor predeterminado de TransactionTimeoutMilliseconds puede provocar algunos otros problemas para afectar a las tarjetas BaseCSP. Asegúrese de probar exhaustivamente la tarjeta para la aplicación pertinente y cargarla antes de implementar este cambio.

Referencias

Claves del Registro KSP de CSP y tarjeta inteligente base

Minicontroladores de tarjeta inteligente

Encabezado winscard.h

Función CryptGetKeyParam (wincrypt.h)

Función CryptGetUserKey (wincrypt.h)