Hola estoy implementando en mi proyecto la carga de certificados utilizando estas anotaciones : @File, @Column, private Strigng archivoCer; y poder extraer datos del certificado, pero obtengo error , pero al hacer la extraccion tengo error de incompatibilidad ya que lo hago mediante bytes, pueden ayudarme sobre esto porfavor
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Pon el código de tu entidad y todo el resto de código relacionado con el tema, como acciones o cualquier otra cosa. Incluye también la traza completa de la excepción.
Ayuda a otros en este foro como yo te ayudo a ti.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hola,
Inicialmente implemente este código y verifique que si se almacenen dentro de la base de datos, y efectivamente si se almacena al igual se almacena en la tabla por default oxfiles, pero lo que me muestra en la tabla en la que indico donde se debe almacenar es 'datos_csd' me almacena un referencia de esta tabla oxfiles a mi tabla 'datos_csd', entonces no me permite acceder directamente a los bytes.
@Entity
@Table(name = "datos_csd")
public class Certificado {
@File
@Column(length = 100)
@OnChange(ExtraerDatosCertificadoAction.class)
private String archivoCer;
@File@Column(length=32)privateStringarchivoKey;@Stereotype("PASSWORD")@Column(length=100)privateStringpassword;/************ METODOS DE LAS VARIABLES *************/publicStringgetArchivoCer(){returnarchivoCer;}publicvoidsetArchivoCer(StringarchivoCer){this.archivoCer=archivoCer;//procesarCertificado(); // Llamada al método aquí}privatevoidprocesarCertificado(){try{byte[]decodedBytes=getArchivoCerBytes();if(decodedBytes!=null&&decodedBytes.length>0){Stringbase64Content=Base64.getEncoder().encodeToString(decodedBytes);System.out.println("Contenido del archivo CER (Base64): "+base64Content);System.out.println("Tamaño del archivo CER (bytes): "+decodedBytes.length);booleanisValid=isValidCertificate(decodedBytes);System.out.println("¿Es un certificado válido? "+isValid);}else{System.out.println("El archivo CER está vacío o es nulo");}}catch(Exceptione){e.printStackTrace();}}publicbooleanisValidCertificate(byte[]bytes){try(ByteArrayInputStreambis=newByteArrayInputStream(bytes)){CertificateFactorycertificateFactory=CertificateFactory.getInstance("X.509");X509Certificatecertificate=(X509Certificate)certificateFactory.generateCertificate(bis);System.out.println("Certificado emitido por: "+certificate.getIssuerDN().getName());System.out.println("Certificado emitido a: "+certificate.getSubjectDN().getName());returncertificate!=null;}catch(CertificateException|IOExceptione){System.err.println("Error al validar el certificado: "+e.getMessage());e.printStackTrace();returnfalse;}}publicbyte[]getArchivoCerBytes(){if(this.archivoCer!=null){returnBase64.getDecoder().decode(this.archivoCer);}returnnull;}
}
En esta clase integre el metodo de la accion para leer el certificado:
public class ExtraerDatosCertificadoAction extends OnChangePropertyBaseAction {
@Overridepublicvoidexecute()throwsException{Certificadocertificado=(Certificado)getView().getEntity();//ObtenerelarchivoCERcomobytesbyte[]bytesCer=certificado.getArchivoCerBytes();if(bytesCer==null||bytesCer.length==0){addError("archivoCer_no_seleccionado");return;}try{//ValidaryobtenerdatosdelcertificadoStringbase64Content=Base64.getEncoder().encodeToString(bytesCer);System.out.println("Contenido del archivo CER (Base64): "+base64Content);byte[]decodedBytes=Base64.getDecoder().decode(base64Content);System.out.println("Tamaño del archivo CER (bytes): "+decodedBytes.length);booleanisValid=isValidCertificate(decodedBytes);System.out.println("¿Es un certificado válido? "+isValid);if(!isValid){addError("archivoCer_no_valido");return;}Map<String,String>certData=obtenerDatosDelCertificado(decodedBytes);actualizarCertificado(certificado,certData);getView().refresh();//RefrescarlavistaparamostrarlosdatosactualizadosaddMessage("datos_certificado_extraidos");}catch(CertificateExceptione){addError("error_extraer_certificado",e.getMessage());e.printStackTrace();}}privateMap<String,String>obtenerDatosDelCertificado(byte[]bytesCer)throwsCertificateException,IOException{Map<String,String>certData=newHashMap<>();try(ByteArrayInputStreambis=newByteArrayInputStream(bytesCer)){CertificateFactorycertificateFactory=CertificateFactory.getInstance("X.509");X509Certificatecertificate=(X509Certificate)certificateFactory.generateCertificate(bis);certData.put("startDate",certificate.getNotBefore().toString());certData.put("endDate",certificate.getNotAfter().toString());certData.put("signatureAlgorithm",certificate.getSigAlgName());certData.put("serialNumber",certificate.getSerialNumber().toString());DatecurrentDate=newDate();certData.put("isExpired",currentDate.after(certificate.getNotAfter())?"true":"false");StringsubjectDN=certificate.getSubjectDN().getName();System.out.println("subjectDN: "+subjectDN);//ImprimirelsubjectDNcompletoString[]subjectDNArray=subjectDN.split(",");for(Stringdn:subjectDNArray){dn=dn.trim();if(dn.startsWith("OID.2.5.4.45=")){certData.put("rfcEmisor",dn.substring("OID.2.5.4.45=".length()));}elseif(dn.startsWith("O=")){certData.put("razonSocial",dn.substring(2));}}}returncertData;}privatebooleanisValidCertificate(byte[]bytes){try(ByteArrayInputStreambis=newByteArrayInputStream(bytes)){CertificateFactorycertificateFactory=CertificateFactory.getInstance("X.509");X509Certificatecertificate=(X509Certificate)certificateFactory.generateCertificate(bis);System.out.println("Certificado emitido por: "+certificate.getIssuerDN().getName());System.out.println("Certificado emitido a: "+certificate.getSubjectDN().getName());returncertificate!=null;}catch(CertificateException|IOExceptione){System.err.println("Error al validar el certificado: "+e.getMessage());e.printStackTrace();returnfalse;}}privatevoidactualizarCertificado(Certificadocertificado,Map<String,String>certData){try{certificado.setStartDate(certData.get("startDate"));certificado.setEndDate(certData.get("endDate"));certificado.setSignatureAlgorithm(certData.get("signatureAlgorithm"));certificado.setSerialNumber(certData.get("serialNumber"));certificado.setIsExpired(certData.get("isExpired"));certificado.setRfcEmisor(certData.get("rfcEmisor"));certificado.setRazonSocial(certData.get("razonSocial"));XPersistence.getManager().merge(certificado);}catch(Exceptione){e.printStackTrace();}}
}, en el error me manda imprimir lo que se encuentra dentro de la referencia '402880e7905bec3401905bf3cc750001', adjunto el error: Hibernate:
insert
into
OXFILES
(data, libraryId, name, id)
values
(?, ?, ?, ?)
Contenido del archivo CER (Base64): 402880e7905bec3401905bf3cc750001
Error al validar el certificado: Could not parse certificate: java.io.IOException: Empty input
java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input
Tamaño del archivo CER (bytes): 24
Es sobre esto...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Cuando usas @File solo guardas un id de 32 bytes en la propiedad. Has de usar FilePeristorFactory, que deuvelve un IFilePersistor para manejar los archivos descargados. En tu caso podrías reescribir tu método getArchivoCerBytes() así:
Hola estoy implementando en mi proyecto la carga de certificados utilizando estas anotaciones : @File, @Column, private Strigng archivoCer; y poder extraer datos del certificado, pero obtengo error , pero al hacer la extraccion tengo error de incompatibilidad ya que lo hago mediante bytes, pueden ayudarme sobre esto porfavor
Hola Leon:
Pon el código de tu entidad y todo el resto de código relacionado con el tema, como acciones o cualquier otra cosa. Incluye también la traza completa de la excepción.
Ayuda a otros en este foro como yo te ayudo a ti.
Hola,
Inicialmente implemente este código y verifique que si se almacenen dentro de la base de datos, y efectivamente si se almacena al igual se almacena en la tabla por default
oxfiles
, pero lo que me muestra en la tabla en la que indico donde se debe almacenar es 'datos_csd' me almacena un referencia de esta tablaoxfiles
a mi tabla 'datos_csd', entonces no me permite acceder directamente a los bytes.@Entity
@Table(name = "datos_csd")
public class Certificado {
@File
@Column(length = 100)
@OnChange(ExtraerDatosCertificadoAction.class)
private String archivoCer;
}
En esta clase integre el metodo de la accion para leer el certificado:
public class ExtraerDatosCertificadoAction extends OnChangePropertyBaseAction {
}, en el error me manda imprimir lo que se encuentra dentro de la referencia '402880e7905bec3401905bf3cc750001', adjunto el error: Hibernate:
insert
into
OXFILES
(data, libraryId, name, id)
values
(?, ?, ?, ?)
Contenido del archivo CER (Base64): 402880e7905bec3401905bf3cc750001
Error al validar el certificado: Could not parse certificate: java.io.IOException: Empty input
java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input
Tamaño del archivo CER (bytes): 24
Es sobre esto...
Hola Leon:
Cuando usas @File solo guardas un id de 32 bytes en la propiedad. Has de usar FilePeristorFactory, que deuvelve un IFilePersistor para manejar los archivos descargados. En tu caso podrías reescribir tu método getArchivoCerBytes() así:
Ayuda a otros en este foro como yo te ayudo a ti.