FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posts: 14
Joined: Fri Aug 01, 2025 08:40 PM
Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Wed Aug 13, 2025 12:52 PM
Hola a todos,
este ejemplo permite seleccionar un certificado digital válido de los instalados en el sistema Windows y obtener su thumbprint (huella digital).
Es una primera aproximación funcional que comparto, y también me gustaría que comentarais si disponéis de una forma mejor/alternativa de conseguir el Thumbprint de un certificado de la lista de instalados en el sistema.
/*
© 2025 Biel Maimó
*/
FUNCTION SelCert()
   LOCAL oDlg, oBrw, aCerts, cThumb := "",nOpc, aSel:={},i,cFileCsv
   cFileCsv:='liscer.csv'
   FErase(cFileCsv)
   Cert2Csv(cFileCsv)
   aCerts := CsvToArrayOfHashes( cFileCsv, ";" )
   IF Empty( aCerts )
      MsgInfo( "CSV vacío o no encontrado" )
      RETURN NIL
   ENDIF

   FOR i:=1 TO Len(aCerts)
      AAdd(aSel,aCerts[i]["FriendlyName"])
   NEXT
   nOpc:=MsgList(aSel, 'Certificados',,,,,'&Seleccionar',,.T.,'&Cancelar')
   IF nOpc!=0
      ?aCerts[nOpc]["FriendlyName"],aCerts[nOpc]["Thumbprint"]
      cThumb:=aCerts[nOpc]["Thumbprint"]
   ENDIF
RETURN cThumb
//------------------------------------------------------------------------------
FUNCTION Cert2Csv(cFileCsv)
   LOCAL cPsExe,cScript,cCmd,cOut:='',cErr:='',nRc
   cPSExe  :=FindPS()
   CrtPS1() //Crea cmd.ps1
   cScript := "cmd.ps1"
   cCmd    := '"' + cPSExe + '" -NoProfile -ExecutionPolicy Bypass -File "' + cScript + '" -Path "'+cFileCsv+'"'
   nRC     := hb_processRun( cCmd, , @cOut, @cErr ) //hb_processRun( <cCommand>, [<cStdIn>], [<@cStdOut>], [<@cStdErr>], [<lDetach>] ) -> nResult
   IF nRc!=0    //Error
      ? "RC:", nRC, "STDOUT >>>", cOut, "STDERR >>>", cErr
   ELSE
      FErase(cScript)
   ENDIF
RETURN NIL
//-----------------------------------------------------------------------------
STATIC FUNCTION CsvToArrayOfHashes( cFile, cSep )
   LOCAL c,aLines,aHeaders:={},aData:={},i, aTok, hRow
   c := hb_MemoRead( cFile )
   aLines := hb_ATokens( c, hb_eol() )

   IF Empty( aLines )
      RETURN {}
   ENDIF
   // Cabeceras
   aTok := CsvSplit( aLines[1], cSep )
   FOR i := 1 TO Len( aTok )
      AAdd( aHeaders, AllTrim( StripQuotes( aTok[i] ) ) )
   NEXT
   // Filas
   FOR i := 2 TO Len( aLines )
      IF Empty( AllTrim( aLines[i] ) )
         LOOP
      ENDIF
      aTok := CsvSplit( aLines[i], cSep )
      hRow := {=>}
      AEval( aHeaders, {|h, k| hRow[ h ] := iif( k <= Len( aTok ), StripQuotes( aTok[k] ), "" ) } )
      AAdd( aData, hRow )
   NEXT
RETURN aData
//------------------------------------------------------------------------------
STATIC FUNCTION CsvSplit( cLine, cSep )
   LOCAL a := {}, cBuf := "", lInQ := .F., i, ch, q := '"'
   FOR i := 1 TO Len( cLine )
      ch := SubStr( cLine, i, 1 )
      DO CASE
      CASE ch == q
         // (doble comilla dentro de campo: "" -> ")
         IF lInQ .AND. i < Len( cLine ) .AND. SubStr( cLine, i+1, 1 ) == q
            cBuf += q
            i++
         ELSE
            lInQ := ! lInQ
         ENDIF
      CASE ch == cSep .AND. ! lInQ
         AAdd( a, cBuf )
         cBuf := ""
      OTHERWISE
         cBuf += ch
      ENDCASE
   NEXT
   AAdd( a, cBuf )
RETURN a
//-----------------------------------------------------------------------------
STATIC FUNCTION StripQuotes( c )
   c := AllTrim( c )
   IF !Empty( c ) .AND. Left( c,1 ) == '"' .AND. Right( c,1 ) == '"'
      c := SubStr( c,2, Len( c )-2 )
   ENDIF
RETURN c
//------------------------------------------------------------------------------
FUNCTION FindPS()
   LOCAL cWin,aTry,c
   cWin := GetEnv( "WINDIR" )
   aTry := { ;
      cWin + "\Sysnative\WindowsPowerShell\v1.0\powershell.exe", ; // 32-bit app en OS 64-bit
      cWin + "\System32\WindowsPowerShell\v1.0\powershell.exe", ;
      cWin + "\SysWOW64\WindowsPowerShell\v1.0\powershell.exe", ;
      "powershell.exe", ; // por si está en PATH
      "pwsh.exe" }        // PowerShell 7

   FOR EACH c IN aTry
      IF hb_FileExists( c )
         RETURN c
      ENDIF
   NEXT
RETURN ""
//------------------------------------------------------------------------------
STATIC FUNCTION CrtPS1()
   LOCAL cSrc
   cSrc:='# © 2025 Biel Maimó'+hb_eol()
   cSrc+='param('+ hb_eol()
   cSrc+='[string]$Path = "Certs.csv" # valor por defecto si no se pasa parámetro'+ hb_eol()
   cSrc+=')'+ hb_eol()
   cSrc+='# Fecha actual'+ hb_eol()
   cSrc+='$now = Get-Date'+ hb_eol()
   cSrc+=''+ hb_eol()
   cSrc+='Get-ChildItem Cert:\CurrentUser\My |'+ hb_eol()
   cSrc+='    Where-Object {'+ hb_eol()
   cSrc+='        # Debe tener clave privada'+ hb_eol()
   cSrc+='        $_.HasPrivateKey -eq $true -and'+ hb_eol()
   cSrc+='        # Estar dentro de fechas de validez'+ hb_eol()
   cSrc+='        $_.NotBefore -le $now -and $_.NotAfter -ge $now -and'+ hb_eol()
   cSrc+='        # EKU debe contener Firma digital o Code Signing o equivalente AEAT'+ hb_eol()
   cSrc+='        ($_.EnhancedKeyUsageList |'+ hb_eol()
   cSrc+='            Where-Object {'+ hb_eol()
   cSrc+='                $_.Oid.Value -eq "1.3.6.1.5.5.7.3.3" -or # Code Signing'+ hb_eol()
   cSrc+='                $_.Oid.Value -eq "1.3.6.1.4.1.5734.1.1" -or # AEAT sello'+ hb_eol()
   cSrc+='                $_.FriendlyName -match "Firma" -or $_.FriendlyName -match "Digital Signature"'+ hb_eol()
   cSrc+='            }'+ hb_eol()
   cSrc+='        )'+ hb_eol()
   cSrc+='    } |'+ hb_eol()
   cSrc+='    Select-Object `'+ hb_eol()
   cSrc+='        @{Name="Store";Expression={"CurrentUser\My"}},'+ hb_eol()
   cSrc+='        Subject,'+ hb_eol()
   cSrc+='        Issuer,'+ hb_eol()
   cSrc+='        FriendlyName,'+ hb_eol()
   cSrc+='        Thumbprint,'+ hb_eol()
   cSrc+='        HasPrivateKey,'+ hb_eol()
   cSrc+='        @{Name="NotBefore";Expression={ Get-Date $_.NotBefore -Format "yyyy-MM-dd HH:mm:ss" }},'+ hb_eol()
   cSrc+='        @{Name="NotAfter";Expression={ Get-Date $_.NotAfter -Format "yyyy-MM-dd HH:mm:ss" }},'+ hb_eol()
   cSrc+='        @{Name="EKUs";Expression={ ($_.EnhancedKeyUsageList | ForEach-Object { $_.Oid.Value }) -join "," }} |'+ hb_eol()
   cSrc+="    Export-Csv -Path $path -NoTypeInformation -Encoding UTF8 -Delimiter ';'"+ hb_eol()
   cSrc+=''+ hb_eol()
   cSrc+='Write-Host "$path"'+ hb_eol()
   hb_memowrit("cmd.ps1",cSrc)
RETURN NIL
¿Qué hace la función?
  • Usa PowerShell para buscar certificados digitales en el almacén de Windows (CurrentUser\My) que sean válidos, tengan clave privada y sean aptos para firma digital o code signing.
  • Guarda la información de los certificados en un archivo CSV (liscer.csv).
  • Lee el archivo CSV y muestra una lista con los nombres descriptivos de los certificados en un cuadro de diálogo.
  • El usuario selecciona un certificado de la lista.
  • Devuelve el thumbprint del certificado elegido.
Como siempre, espero que pueda seros de utilidad.
Cualquier mejora, duda o sugerencia es bienvenida.
Posts: 318
Joined: Fri Jan 14, 2022 08:37 AM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Wed Aug 13, 2025 03:19 PM
Hola Biel,

En mi caso uso dos formas que quizás no son las más homologables pero son eficaces: Uso el certificado en formato .pfx (más contraseña) o en formato .pem (menos seguro)

Tb. en este post se habló del tema: https://forums.fivetechsupport.com/viewtopic.php?t=44888
Y en este tb. https://fivetechsupport.com/forums/viewtopic.php?p=272451#p272451

Salu2
Posts: 14
Joined: Fri Aug 01, 2025 08:40 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Thu Aug 14, 2025 06:20 AM
Gracias por contestar y por incluir los enlaces del foro, ambos posts muy interesantes.

Respecto a las formas que usas, lo importante como dices es que sean eficaces y se adapten al entorno de trabajo. ¿En tu caso, cuando trabajas con el .pfx o .pem usas OpenSSL para firmar, o tiras directamente de alguna librería de Harbour/FiveWin que lo haga internamente?

Por lo que he podido ir leyendo en el foro, veo que eres de los que lleva tiempo metido con Veri*Factu, así que seguro que en algún momento te consulto alguna duda sobre la integración 😄.

Un saludo,
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Thu Aug 14, 2025 08:53 AM

Bielsys,

Gracias por las gracias. En este foro creo que se dan pocas veces: Es tremendo que piden ayuda como si les faltara el aire y cuando se la das ya se olvidan de ti.

Algunos hemos pasado de tirar del carro porque aqui hay mucho que va a rebufo y jamás comparte una funcion.

Es deprimente porque nada más importante programáticamente en muchos años que el Verifactu y en este foro el Verifactu está como si no existiera lo cual personalmente me parece vergonzoso.

Una comunidad que si comparte y que te recomiendo es clubdelphi.com

Los archivos de firma los utilizo con el autofirmacommandline.exe y con curl.exe

Por supuesto que puedes contar con mi ayuda en todo lo que necesites.

Un cordial saludo

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Sat Aug 16, 2025 04:24 PM
paquitohm wrote: Hola Biel,

En mi caso uso dos formas que quizás no son las más homologables pero son eficaces: Uso el certificado en formato .pfx (más contraseña) o en formato .pem (menos seguro)

Tb. en este post se habló del tema: https://forums.fivetechsupport.com/viewtopic.php?t=44888
Y en este tb. https://fivetechsupport.com/forums/viewtopic.php?p=272451#p272451

Salu2
Hola a todos,

Muchas gracias a ambos.

Biel tomo nota de tu función, me irá bien.
Entiendo que esta función debe ser para la configuración de Veri*factu, previo a su uso habitual.
No la he mirado con detalle, pero examina la fecha de expiración? Si es así, que indique si se selecciona un certificado expirado.
Hoy en día no lo se, pero hace meses al usar Veri*factu con una certificado expirado no se obtenía una respuesta ESTÁNDAR Veri*factu (a tener en cuenta).

Paquito, no recordaba estos links, ya hace meses que los leí.
Por otro lado, ¿Cómo haces para usar el formato .pfx? Yo uso el .pem, pero me irá bien tener alternativas.

Seguimos,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Sun Aug 17, 2025 08:40 AM
Hola Carlos,

Utilizo pfx con contraseña en autofirmacommandline.exe. En curl.exe creo que sólo lo tengo con .pem. No será dificil encontrar un ejemplo en la ia.
Te pongo como lo hago con pfx con contraseña:
cComando:= '"'+ cFullAutoFirmaExe+ '"'+ Space(1)+;
           ;
           ; // Comando firmar
           "sign"+          Space(1)+;
           ;
           ; // Opciones
           "-store pkcs12:"+       ::cCerFile+      Space(1)+;
           "-password"     + Space(1)+ TAG_OCULTA_PASS+ Space(1)+;
           "-alias"        + Space(1)+ cCerAliasTmp+     Space(1)+;
           "-i"            + Space(1)+ cIn+             Space(1)+;
           "-o"            + Space(1)+ cOut

IF ::lFormatoFacturaE
   // Formato: Factura Electronica
   cComando+= Space(1)+ "-format"       + Space(1)+ "facturae"
ELSE
   // Formato: Xades / Ticket Bai
   cComando+= Space(1)+ "-format"       + Space(1)+ "xades"
   cComando+= Space(1)+ "-xml"
   *
   // Politica de firma para Guipuzcoa / Gipuzkoa
   cConfigPolitica:=;
      '-config "format=XAdES Enveloped '+;
      '\npolicyIdentifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf '+;
      '\npolicyIdentifierHash=%HASH_POLITICA% '+;
      '\npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 '+;
      '\npolicyQualifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf"'


   cHashPolitica:= "Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es="

   cConfigPolitica:= StrTran(cConfigPolitica, "%HASH_POLITICA%", cHashPolitica)
   *
   cComando+= Space(1)+ cConfigPolitica
ENDIF

IF File(cOut)
   DELETE FILE (cOut)
ENDIF

*
#define SW_HIDE 0
cComandoRun:= StrTran(cComando, TAG_OCULTA_PASS, ::cCerPass)  // Para que no se grabe
*
*
WaitRun(cComandoRun, SW_HIDE)
Salu2
Posts: 14
Joined: Fri Aug 01, 2025 08:40 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Sun Aug 17, 2025 10:56 AM
Hola Carlos !!!, y resto de lectores.
Al recuperar la lista de certificados, salvo error u omisión, solo incluye los certificados válidos para firmar, entre las comprobaciones que realiza una es que este en vigor.

La función todavía no se muy bien donde irá, posiblemente si forme parte de la configuración inicial y guarde el Thumb, y se ira usando automáticamente.
 $_.NotBefore -le $now -and $_.NotAfter -ge $now
Quizas la modifique, y recupere el Thumb de un NIF determinado. Tengo clientes con múltiples NIF, he de decidir como lo gestiono.
Pero más adelante, llevo un poco de retraso con todo el tema de VeriFactu y voy desarrollando , generar XML, seleccionar certificado, firmar , ...
y así paso a paso.
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Sun Aug 17, 2025 11:17 AM
BielSys wrote: Pero más adelante, llevo un poco de retraso con todo el tema de VeriFactu y voy desarrollando , generar XML, seleccionar certificado, firmar , ...
y así paso a paso.
No es necesario firmar, al menos en modo (Si) Verifactu
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Sun Aug 17, 2025 11:27 AM
BielSys wrote: Al recuperar la lista de certificados, salvo error u omisión, solo incluye los certificados válidos para firmar, entre las comprobaciones que realiza una es que este en vigor.
Yo mostraría los que tenga; por una razón muy sencilla, los usuarios son propensos a entrar en pánico inmediatamente; si no ven el certificado que sabían que ya estaba instalado te llamarán asustados (porque Veri*factu asusta, nadie quiere problemas con Hacienda) y tu no sabrás con certeza que está pasando, si lo ven y se les dice que está 'Expirado' ya sabrás que responder.

Se me acaba de ocurrir que una vez a la semana (los lunes a primera hora es un buen momento por que todo el mundo va a ralentí), se verifique la caducidad/expiración del certificado digital habitual, y en base a ello realizar acciones, avisos, etc.

Seguimos,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Sun Aug 17, 2025 11:36 AM
hmpaquito wrote: Hola Carlos,

Utilizo pfx con contraseña en autofirmacommandline.exe. En curl.exe creo que sólo lo tengo con .pem. No será dificil encontrar un ejemplo en la ia.
Te pongo como lo hago con pfx con contraseña:
cComando:= '"'+ cFullAutoFirmaExe+ '"'+ Space(1)+;
           ;
           ; // Comando firmar
           "sign"+          Space(1)+;
           ;
           ; // Opciones
           "-store pkcs12:"+       ::cCerFile+      Space(1)+;
           "-password"     + Space(1)+ TAG_OCULTA_PASS+ Space(1)+;
           "-alias"        + Space(1)+ cCerAliasTmp+     Space(1)+;
           "-i"            + Space(1)+ cIn+             Space(1)+;
           "-o"            + Space(1)+ cOut

IF ::lFormatoFacturaE
   // Formato: Factura Electronica
   cComando+= Space(1)+ "-format"       + Space(1)+ "facturae"
ELSE
   // Formato: Xades / Ticket Bai
   cComando+= Space(1)+ "-format"       + Space(1)+ "xades"
   cComando+= Space(1)+ "-xml"
   *
   // Politica de firma para Guipuzcoa / Gipuzkoa
   cConfigPolitica:=;
      '-config "format=XAdES Enveloped '+;
      '\npolicyIdentifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf '+;
      '\npolicyIdentifierHash=%HASH_POLITICA% '+;
      '\npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 '+;
      '\npolicyQualifier=https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf"'


   cHashPolitica:= "Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es="

   cConfigPolitica:= StrTran(cConfigPolitica, "%HASH_POLITICA%", cHashPolitica)
   *
   cComando+= Space(1)+ cConfigPolitica
ENDIF

IF File(cOut)
   DELETE FILE (cOut)
ENDIF

*
#define SW_HIDE 0
cComandoRun:= StrTran(cComando, TAG_OCULTA_PASS, ::cCerPass)  // Para que no se grabe
*
*
WaitRun(cComandoRun, SW_HIDE)
Salu2
Muchas gracias Paquito,

Entiendo que esto es para firmar las facturas (ya me llegará), perfecto.

Yo también contemplaba hacerlo con Autofirma después de leer información que colgó Quim entre otros.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 14
Joined: Fri Aug 01, 2025 08:40 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Mon Aug 18, 2025 11:58 AM
hmpaquito wrote:
Pero más adelante, llevo un poco de retraso con todo el tema de VeriFactu y voy desarrollando , generar XML, seleccionar certificado, firmar , ...
y así paso a paso.
No es necesario firmar, al menos en modo (Si) Verifactu
Cierto, en un primer momento pensaba que si, pero luego pude leer que no. Gracias por avisar, al final creo que implmentare las dos alternativas, veri factu y no verifactu.
Mi idea inicial era no hacer nada :( , y quien quiera que se pase voluntariamente a SII, que ya tenia operativo.

Por cierto, muchisima buena información en clubdelphi.
Posts: 14
Joined: Fri Aug 01, 2025 08:40 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Mon Aug 18, 2025 12:00 PM
FiveWiDi wrote:
Al recuperar la lista de certificados, salvo error u omisión, solo incluye los certificados válidos para firmar, entre las comprobaciones que realiza una es que este en vigor.
Yo mostraría los que tenga; por una razón muy sencilla, los usuarios son propensos a entrar en pánico inmediatamente; si no ven el certificado que sabían que ya estaba instalado te llamarán asustados (porque Veri*factu asusta, nadie quiere problemas con Hacienda) y tu no sabrás con certeza que está pasando, si lo ven y se les dice que está 'Expirado' ya sabrás que responder.

Se me acaba de ocurrir que una vez a la semana (los lunes a primera hora es un buen momento por que todo el mundo va a ralentí), se verifique la caducidad/expiración del certificado digital habitual, y en base a ello realizar acciones, avisos, etc.

Seguimos,
No es mala idea, quizas ir avisando unos días antes de que caduque, algo de FeedBack para el usuario.
Posts: 14
Joined: Fri Aug 01, 2025 08:40 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Mon Aug 18, 2025 12:05 PM

Carlos, Paco:

yo firmo usando comandos de Power Shell, no era mi idea inicial, pero funciona. Llegue condicionado porque empecé usando thumb y el camino me llevo a ello, visto ahora con perspectiva, creo que era más sencillo usar pfx, pero bueno.

Están a vuestra disposición si lo necesitáis.

Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Mon Aug 18, 2025 01:07 PM
BielSys wrote: Carlos, Paco:

yo firmo usando comandos de Power Shell, no era mi idea inicial, pero funciona. Llegue condicionado porque empecé usando thumb y el camino me llevo a ello, visto ahora con perspectiva, creo que era más sencillo usar pfx, pero bueno.

Están a vuestra disposición si lo necesitáis.
Gracias Biel,

Siemprea va bien tener alternativas.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Seleccionar y Obtener el Thumbprint de un Certificado Digital
Posted: Mon Aug 18, 2025 03:52 PM
BielSys wrote:
Pero más adelante, llevo un poco de retraso con todo el tema de VeriFactu y voy desarrollando , generar XML, seleccionar certificado, firmar , ...
y así paso a paso.
No es necesario firmar, al menos en modo (Si) Verifactu
Cierto, en un primer momento pensaba que si, pero luego pude leer que no. Gracias por avisar, al final creo que implmentare las dos alternativas, veri factu y no verifactu.
Mi idea inicial era no hacer nada :( , y quien quiera que se pase voluntariamente a SII, que ya tenia operativo.

Por cierto, muchisima buena información en clubdelphi.

Con respeto: Para que no pierdas el tiempo en tu desarrollo, quizás esto te alerte sobre algo, y para no hacerte perder el tiempo te voy a hablar claro y directo:

IMHO,

1 - No creo que sea buena idea desarrollar No Verifactu. Pocos lo han hecho. Los OT No Verifactu "serán mirados especialmente" (Agencia dixit)
2 - Vf no es enviar un xml y recibir respuesta: Es mucho más: LAF de 2021: Integridad, conservación, accesibilidad, legibilidad, trazabilidad e inalterabilidad
3 - LAF-Vf es una p. para las empresas desarrolladoras: Multones de <150k. Algunos han renunciado incluso después de tener el desarrollo completado.

De todo esto y de mucho mas no ha habido tiempo ni lugar alguno en este foro para hablar

Saludos