Primero, necesita instalar el soporte PKCS # 11. Este es un código nativo que probablemente vino con su lector de tarjetas que proporciona un .dll (o .so) que proporciona una interfaz PKCS # 11. Otro software en el sistema, como los productos Mozilla y el proveedor Sun's PKCS # 11, usa esta biblioteca. (Los productos de Microsoft a menudo usan una interfaz diferente, "CAPI").
Luego, siguiendo las instrucciones en el PKCS #11 Reference Guide, configure un proveedor SunPKCS11
. Las únicas propiedades que tuve que proporcionar en mi configuración son la ubicación de la "biblioteca" nativa que se instaló y el sufijo de "nombre" para este proveedor. La propiedad "nombre" se agrega a "SunPKCS11-", por lo que si especifica "CAC" para el nombre, puede buscar el Provider
más adelante con Security.getProvider("SunPKCS11-CAC")
.
A continuación, puede utilizar las propiedades del sistema JSSE estándar javax.net.ssl.keyStore
(con un valor de "NONE"
) y javax.net.ssl.keyStoreType
(con un valor de "PKCS11"
) para dar el acceso al material JSSE tecla en el CAC. No es necesario configurar la propiedad de la contraseña, ya que el código nativo debe solicitar al usuario su PIN cuando sea necesario.
La advertencia es que solo el certificado de "entidad final" del usuario está disponible desde el CAC. Para construir una cadena confiable, la mayoría de los servidores esperan que el cliente envíe certificados intermedios. Solucionar esto es posible, pero complicado, ya que implica implementar su propio javax.net.ssl.X509KeyManager
. Si el servidor con el que está trabajando requiere una cadena completa, publique una pregunta de seguimiento.
eche un vistazo a http://stackoverflow.com/questions/544056/common-access-card-cac-authentication-using-java podría darle algunos consejos. –