Facturación telemática. Utilización del certificado digital en la firma de documentos.

La utilización de medios telemáticos para el intercambio de información hace necesario garantizar la autenticidad e integridad de los documentos emitidos

Mario Rodríguez – Grupo Albor

La Agencia Estatal de Administración Tributaria (AEAT) publica una DLL conteniendo un objeto OLE que posibilita la firma y cifrado de documentos y la posterior verificación de autenticidad e integridad utilizando un certificado de usuario clase 2. La lista de certificados y autoridades de certificación permitidas se encuentra en http://www.aeat.es/normlegi/ecomercio/factcert.htm.

En las páginas de Preguntas Frecuentes de la AEAT sólo se proporciona un ejemplo básico de utilización de la DLL desde VisualBasic, veremos aquí cómo integrar la firma de documentos en nuestro programa Delphi.

La AEAT asegura que éste es un control ActiveX, pero si intentamos registrarlo en Delphi como tal (Component -> Import ActiveX Control) obtendremos un Error: Interfaz no compatible cuando intentemos hacer uso de él. La razón es que no es un control ActiveX sino un objeto OLE contenido en una DLL. Dicho con las mismas palabras: no puede crearse una instancia del control (interfaz no compatible); en su lugar, hay que instanciar un objeto OLE genérico y acceder a sus métodos como si se hubiese creado un objeto. Vamos a ello.

El primer paso será conseguir la DLL aeatfact.dll, para ello descargamos el archivo http://www.aeat.es/descarga/aeatfact.cab y extraemos la DLL que contiene. Dónde coloquemos la DLL no es importante, pudiendo residir tanto en el directorio de nuestra aplicación como en el del sistema ya que al registrarlo (en el siguiente paso) ya quedará disponible para su uso. Para registrar el componente abrimos una ventana de comandos y ejecutamos regsvr32 aeatfact.dll desde el directorio donde se encuentre el archivo, con lo que ya queda lista para integrarse en nuestros programas.

El objeto OLE sólo posee dos métodos: Firma y Verifica. El primero recibe como parámetros la ruta del archivo a firmar, el NIF/CIF correspondiente al certificado con el que se va a firmar y el nombre de archivo en el que guardar el resultado de la firma y cifrado. Verifica sólo recibe dos parámetros: archivo cifrado y firmado a validar y ruta al archivo donde restaurar el contenido original.

El siguiente ejemplo ilustra el empleo del método FIRMA. Sobre un formulario se ha dispuesto un TEdit (edNif); un TButton btnFirmar y un TOpenDialog para permitir la selección del archivo a firmar:

procedure TForm1.btnFirmarClick(Sender: TObject);
var
  pAEAT: Variant;
  error: String;
begin
  if OpenDialog1.Execute then
  try
    //Crear una instancia del objeto OLE
    pAEAT := CreateOleObject('AEATFACT.AeatFactCtl');
    if not (VarIsNull(pAEAT)) then
    try
      // Llamada a método FIRMA
      error := pAEAT.Firma(OpenDialog.FileName, edNif.Text, OpenDialog.FileName + '.firmado');
      ShowMessage(error);
    finally
      // Liberar objeto. ¿unassigned?
      pAEAT := Unassigned;
    end;
  except
    ShowMessage('Imposible crear el objeto AEATFACT');
  end;
end;

Listado 1. Ejemplo de utilización del método FIRMA

Para comprobar la validez de la firma y la integridad del archivo se utiliza el método VERIFICA. Esta comprobación precisa establecer una conexión https contra el servidor de la AEAT, ya que es necesario verificar que el certificado empleado no esté caducado ni haya sido revocado.

En http://www.aeat.es/descarga/factucax.pdf podrá encontrar más información sobre los métodos de encriptación, estructura del archivo resultante, requerimientos de la DLL y los códigos de error devueltos.