Hola Rafael, El tema de la visualización del documento es algo muy importante, ya que puede condicionar el proceso de firma. Es una buena idea para el caso de los PDF hacer la sustitución por un enlace.
En cuanto al listado de certificados, optamos por sacarlos todos porque había gente que sólo instalaba el de autenticación y, al filtrarlo por defecto, pensaba que tenía un error en la instalación y nos abria una incidencia. Con la práctica vimos que es mejor sacar todos los certificados (aunque no pueda usarlos por no ser de firma) y que el applet se quejara en caso de no poder utilizarlos. Quizas el caso de que el certificado sea de una CA "no soportada" se puede mejorar un poco con lo que tú comentas. Posiblemente, la solución es que salgan siempre todos los certificados instalados, pero marcando de una forma especial los que no se puedan utilizar por no ser de firma, no ser de una CA reconocida o estar revocados ... ¿Qué os parece? --- Salut, ==================================== Ricardo Borillo Domenech http://xml-utils.com 2009/5/5 Espí Botella, Rafael <[email protected]>: > Nosotros hemos añadido alguna modificación más. Te las comento por si las ves > de interés. > > Por ejemplo, cuando se marca la casilla para ver el contenido firmado, si es > un fichero especial (PDF, imagen, etc) se muestra el contenido del archivo > como si fuera texto. > > Nosotros lo que hacemos aquí es mostrar la URL del archivo y con la clase > Desktop mostrar el archivo, de este modo el usuario tiene claro qué es lo que > está firmando (al ser una URL que comienza con http: el archivo se abre con > el navegador por defecto, si fuera una URI entonces se abriría según el > programa determinado que tenga el sistema operativo). > Desktop d = Desktop.getDesktop(); > d.browse(new URI(url)); > > También hemos puesto un filtro en la construcción del árbol de certificados > para que no cargue todos lo que hay en el keystore, sino que cargue los > certificados de FIRMA de la ACCV y DNIe (que son las CA con las que el > Ayuntamiento tiene convenio) que corresponden a un nif concreto (ya que el > usuario antes de acceder a la aplicación de firma se registra previamente en > la carpeta ciudadana con su certificado de la ACCV o el DNIe). Supongo que de > querer hacer esto genérico bastaría con incluir un par de propiedades. > La condición que hemos añadido para hacer esta comprobación es la siguiente: > if (xcert != null > && xcert.getKeyUsage()[0] > && (xcert.getIssuerDN().getName().contains( > "Generalitat Valenciana") || xcert > .getIssuerDN().getName().contains( > "OU=DNIE")) > && xcert.getSubjectDN().toString().contains( > SignatureApplet.getNIF())) > > Un saludo > > -----Mensaje original----- > De: [email protected] [mailto:[email protected]] En nombre de Ricardo Borillo > Enviado el: martes, 05 de mayo de 2009 10:10 > Para: Espí Botella, Rafael > Asunto: Re: Validación Certificado revocado en Firma PDF > > Ok. He registrado el código que me envias junto con la tarea en la Forja. > Aunque la versión 2.1 sea compilable en el trunk, aún tardará en ver > la luz. Poco a poco iremos completando todas las modificaciones ... > > Gracias por la aportación > > --- > Salut, > ==================================== > Ricardo Borillo Domenech > http://xml-utils.com > > > > 2009/5/5 Espí Botella, Rafael <[email protected]>: >> Nosotros la validación de certificado revocado en firma PDF la hemos >> resuelto creando un método en la clase BouncyCastleNotaryFactory, >> getConfirmation(), y llamando a este método desde la clase formatSignature() >> de PDFSignatureFactory justo antes de crear el objeto PDFReader. >> >> >> try >> { >> Properties prop2= ConfigHandler.getProperties(); >> if ( prop2 != null ){ >> ConfigManager.init(prop); >> } >> else{ >> return null; >> } >> BouncyCastleNotaryFactory bcnf = new BouncyCastleNotaryFactory(); >> bcnf.getConfirmation((X509Certificate) cert, (X509Certificate)CACert); >> } >> catch (DigiDocException e) >> { >> if ( e.getCode() == e.ERR_CERT_REVOKED ){ >> _strerr= LabelManager.get("ERROR_DDOC_CERTREVOKED"); >> } >> else if ( e.getCode() == e.ERR_CERT_EXPIRED ){ >> _strerr= LabelManager.get("ERROR_DDOC_CERTEXPIRED"); >> } >> else if ( e.getCode() == e.ERR_CA_CERT_READ ){ >> _strerr= LabelManager.get("ERROR_DDOC_CERT_NOT_ALLOWED"); >> //_strerr= LabelManager.get("ERROR_DDOC_CACERTREAD"); >> } >> else if ( e.getCode() == e.ERR_OCSP_READ_FILE || e.getCode() == >> e.ERR_OCSP_ISSUER_CA_NOT_FOUND ){ >> _strerr= LabelManager.get("ERROR_DDOC_CERT_NOT_ALLOWED"); >> } >> else{ >> _strerr= LabelManager.get("ERROR_DDOC_CERTGENERIC"); >> } >> >> //e.printStackTrace(); >> return null; >> } >> >> >> >> La validación de certificado revocado la implementamos así: >> >> public void getConfirmation(X509Certificate signersCert, >> X509Certificate caCert) throws DigiDocException { >> try { >> // create the request - sign the request if necessary >> OCSPReq req = createOCSPRequest(signersCert, caCert, >> m_bSignRequests); >> // debugWriteFile("req.der", req.getEncoded()); >> >> if (m_logger.isDebugEnabled()) >> m_logger.debug("REQUEST:\n" >> + Base64Util.encode(req.getEncoded(), >> 0)); >> // send it >> >> Integer nResps = new >> Integer(ConfigManager.instance().getProperty( >> "DIGIDOC_OCSP_RESPONDER_COUNT")); >> for (int i = 1; i <= nResps; i++) { >> try { >> >> String ocspResponder = >> ConfigManager.instance() >> >> .getProperty("DIGIDOC_OCSP_RESPONDER_URL" + i); >> >> OCSPResp resp = sendRequest(req, >> ocspResponder); >> // debugWriteFile("resp.der", >> resp.getEncoded()); >> if (m_logger.isDebugEnabled()) >> m_logger.debug("RESPONSE:\n" >> + >> Base64Util.encode(resp.getEncoded(), 0)); >> // check response status >> verifyRespStatus(resp); >> >> if (resp == null >> || resp.getStatus() != >> OCSPRespStatus.SUCCESSFUL) >> throw new DigiDocException( >> >> DigiDocException.ERR_OCSP_UNSUCCESSFULL, >> "OCSP response >> unsuccessfull!", null); >> try { >> // now read the info from the response >> BasicOCSPResp basResp = >> (BasicOCSPResp) resp >> .getResponseObject(); >> // find real notary cert suitable for >> this response >> >> Exception exVerify = null; >> if (exVerify != null) { >> m_logger.error("OCSP >> verification error!!!", >> exVerify); >> >> DigiDocException.handleException(exVerify, >> >> DigiDocException.ERR_OCSP_VERIFY); >> } >> checkCertStatus(signersCert, basResp); >> >> } catch (DigiDocException ex) { >> throw ex; >> } catch (Exception ex) { >> DigiDocException.handleException(ex, >> >> DigiDocException.ERR_OCSP_PARSE); >> } >> >> if (m_logger.isDebugEnabled()) >> m_logger.debug("Confirmation OK!"); >> >> break; >> } catch (DigiDocException e) { >> // If it is the last unverifiable, >> // Throw the exception again >> if (i == nResps) >> throw e; >> } >> >> } >> } catch (DigiDocException ex) { >> ex.printStackTrace(); >> throw ex; >> } catch (Exception ex) { >> DigiDocException.handleException(ex, >> DigiDocException.ERR_OCSP_GET_CONF); >> ex.printStackTrace(); >> } >> return; >> } >> >> >> -----Mensaje original----- >> De: Espí Botella, Rafael >> Enviado el: martes, 05 de mayo de 2009 9:27 >> Para: 'Ricardo Borillo' >> Asunto: RE: [CryptoApplet] Hacia la versión 2.1 de CryptoApplet >> >> Hola. ¿Vais a añadir en la nueva implementación que se compruebe en el caso >> de firma PDF si el certificado está revocado? De momento lo tenéis >> implementado para firma XADES. Me comentó Paúl que lo añadiríais en la >> siguiente versión haciéndolo genérico para varios formatos de firma. No he >> visto este cambio en la lista de tareas pendientes que tenéis en >> http://forja.uji.es/pm/task.php?group_project_id=16&group_id=24&func=browse >> >> Un saludo. >> >> -----Mensaje original----- >> De: [email protected] >> [mailto:[email protected]] En nombre de Ricardo Borillo >> Enviado el: jueves, 30 de abril de 2009 13:15 >> Para: [email protected] >> Asunto: [CryptoApplet] Hacia la versión 2.1 de CryptoApplet >> >> Hola a todos, >> >> Estamos comenzando a trabajar en la versión 2.1 de CryptoApplet. >> Podeis ver los cambios previstos en: >> >> http://forja.uji.es/pm/task.php?group_project_id=16&group_id=24&func=browse >> >> Como primer paso, estamos reestructurando el trunk y partiendo los >> proyectos para una mejor modularidad y reutilización. >> Si teneis necesidad de acceder al código de la versión actual de >> producción (2.0.5), hacedlo a partir del tag que hemos creado: >> >> http://forja.uji.es/plugins/scmsvn/viewcvs.php/tags/CryptoApplet_2.0.5/?root=cryptoapplet >> >> Intentaremos que el trunk vuelva a estar estable lo antes posible para >> seguir con el resto de cambios. >> >> --- >> Salut, >> ==================================== >> Ricardo Borillo Domenech >> http://xml-utils.com >> _______________________________________________ >> CryptoApplet mailing list >> [email protected] >> http://llistes.uji.es/mailman/listinfo/cryptoapplet >> >> >> > > > _______________________________________________ CryptoApplet mailing list [email protected] http://llistes.uji.es/mailman/listinfo/cryptoapplet
