Estaba buscando cómo firmar un PDF desde línea de comandos y he encontrado un programa que lo hace estupendamente: "pyhanko":
Página del proyecto: https://github.com/MatthiasValvekens/pyHanko
Se instala como cualquier programa de python: pip install pyhanko
Estas son algunas pruebas que he hecho, con un certificado hardware pkcs11 de Izenpe y con un fichero pkcs12 de la FNMT.
Firma Visible e invisible (debajo) con tarjeta física pkcs11 de izenpe (la librería es la que provee izenpe, habría que seleccionar la de cada fabricante de cada chip):
pyhanko --verbose sign addsig --field "1/100,100,300,200/Nombre Apellido" pkcs11 --lib /usr/lib/libbit4ipki.so --cert-label "NOMBRE APELLIDO1 APELLIDO2 - 11111111H" fichero_para_firmar.pdf firmado.pdf
pyhanko --verbose sign addsig --field "Nugbe" pkcs11 --lib /usr/lib/libbit4ipki.so --cert-label "AITOR CUARTANGO BERRENDO - 44152842H" test\ firma.pdf firmado22234.pdf
Firma invisible con FNMT:
pyhanko --verbose sign addsig --field FIRMADO pkcs11 --lib /usr/lib/libbit4ipki.so --cert-label "NOMBRE APELLIDO1 APELLIDO2 - 11111111H" fichero_para_firmar.pdf firmado.pdf
Para usar una TSA:
pyhanko --verbose sign addsig --field FIRMADO --timestamp-url http://tss.accv.es:8318/tsa pkcs12 fichero_para_firmar.pdf firmado.pdf MI_CERTIFICADO_FNMT.p12
Me guardo unos comandos para listar el contenido de mi smartard (del fabricante bit4id, que es el que usan los certificados en tarjeta de Izenpe). Hay que cargar el driver de la smartcard en la línea de comandos para que sepa qué librería del sistema usar con el modificadosr "--module"
pkcs11-tool --module /usr/lib/bit4id/libbit4ipki.so --list-objects -O
pkcs11-tool --module /usr/lib/bit4id/libbit4ipki.so --list-objects --type cert
pkcs11-tool --module /usr/lib/bit4id/libbit4ipki.so -O -l
Para descargar mi clave pública (el ID se obtiene en el punto anterior, este es inventado):
pkcs11-tool --module /usr/lib/bit4id/libbit4ipki.so --read-object --id 123123123123123 --type cert --output-file cert.der
Para visualizar el texto del certificado (clave pública):
openssl x509 -in cert.der -inform der -noout -text
Otros comandos que dan información:
pkcs15-tool --dump
pkcs15-tool --list-certificates
keywords: digital signature from command line pkcs11 pkcs12 smart card smartcard izenpe fnmt izenpe pkcs15 pkcs15-tool pkcs11-tool openssl bit4id