emergente - error de aplicacion no se ha podido iniciar la aplicacion java
Seguridad de Java-proveedor de MSCAPI: ¿cómo utilizar sin ventana emergente de contraseña? (3)
Logré usar el proveedor de MSCAPI de Sun en mi aplicación. El problema que estoy teniendo ahora es que siempre aparece una ventana, pidiendo una contraseña, aunque la haya proporcionado en el código. Esto es un problema, porque necesito la funcionalidad de criptografía en un servicio web.
Aquí está el código que tengo ahora:
String alias = "Alias to my PK";
char[] pass = "MyPassword".toCharArray();
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, pass);
Provider p = ks.getProvider();
Signature sig = Signature.getInstance("SHA1withRSA",p);
PrivateKey key = (PrivateKey) ks.getKey(alias, pass)
sig.initSign(key);
sig.update("Testing".getBytes());
sig.sign();
Esto funciona muy bien, pero aparece una ventana emergente que solicita la contraseña cuando se ejecuta la última línea. ¿Cómo lo evito?
El proveedor de MSCAPI no es compatible con la entrega de la contraseña a CAPI:
Se admite un modo de compatibilidad para las aplicaciones que asumen que se debe proporcionar una contraseña. Permite (pero ignora) una contraseña no nula. El modo está habilitado por defecto. (1)
Para establecer la contraseña a través de CAPI, debe llamar a CryptSetKeyParam con KP_KEYEXCHANGE_PIN o KP_SIGNATURE_PIN sin documentar y esperar que su proveedor de token de hardware subyacente lo admita. (No están completamente indocumentados; la documentación para Windows CE y Windows Mobile los mencionan (2) y están incluidos en los archivos de encabezado).
Supongo que Windows está apareciendo en la ventana emergente.
Importe nuevamente su clave utilizando el Asistente de importación de certificados, pero asegúrese de no marcar la siguiente opción en la pantalla "Contraseña".
[_] Habilita la protección de clave privada fuerte. Se le preguntará cada vez que la aplicación use una clave privada si habilita esta opción.
Resolví este problema al configurar el proveedor de la siguiente manera:
signeData = gen.generate(content, ks.getProvider());
Dónde
ks
es una KeyStore
y
gen
es un CMSSignedDataGenerator