Tengo un eToken SafeNet de Gemalto con un Sello electrónico certificado eIDAS (también conocido como sello electrónico, sello digital o certificado de firma de documentos) emitido por Soluciones SK ID. Quiero firmar un hash SHA-256 con este token.
Paso 1: Compruebe la información del par de claves
Necesitamos la etiqueta del token (o el identificador de la ranura) 8
, que es 0x11
) y el identificador de clave pública (00000000
) para firmar y verificar.
$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so -L
Salida de muestra:
Slot 8 (0x11): SafeNet eToken 5100 [eToken 5110 SC] 01 (Digital Signature Pin)
token label : eID Easy (Digital Signature Pin)
token manufacturer : Gemalto
token model : ID Prime MD
token flags : login required, rng, token initialized, PIN initialized, other flags=0x200
hardware version : 0.0
firmware version : 0.0
serial num : 06E2CF0B29CA6BD0
pin min/max : 4/16
Obtenga los detalles de la clave pública y el certificado:
$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so --token-label "eID Easy (Digital Signature Pin)" -O
Salida de muestra:
Certificate Object; type = X.509 cert
label:
subject: DN: organizationIdentifier=NTREE-14080014/serialNumber=14080014, ST=Harjumaa, L=Tallinn, C=EE, O=EID Easy OÜ, CN=eID Easy
ID: 00000000
Public Key Object; RSA 2048 bits
label: eID Easy
ID: 00000000
Usage: verify, wrap
Access: local
Paso 2: Preparar el resumen
Suponiendo que ya tiene un hash SHA-256 en formato hexadecimal:
$ echo "19d512fc649e1668eb84741284ad95ec03f3225719a83e40389dbade4eabe5ed" > digest.txt
$ xxd -r -p digest.txt digest.bin
Paso 3: Firma el resumen
Utilice herramienta pkcs11
con RSA-PKCS
, que firma una entrada binaria sin procesar (no un cálculo resumido en sí mismo).
$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so --pin=$PIN --token-label "eID Easy (Digital Signature Pin)" -s -i digest.bin -m RSA-PKCS > signature.bin
Ver firma en base64:
$ base64 signature.bin -w0
Ejemplo de salida (su firma real será diferente):
RseZYWjkyNRcU1lI1KR+I+0C1jC+FVp2kTAhyOUsE2x6UGf+UMSf3kqD4KGBb+eI...
Paso 4: Verificar la firma
Extraiga la clave pública:
$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so --token-label "eID Easy (Digital Signature Pin)" --read-object --type pubkey --id=00000000 > public-key.der
$ openssl rsa -inform DER -outform PEM -in public-key.der -pubin > public-key.pem
Verifique la firma y extraiga el resumen original:
$ openssl rsautl -verify -inkey public-key.pem -in signature.bin -pubin > verified.bin$ xxd -p -c32 verified.bin > verified.txt
Compare los resúmenes:
$ cat digest.txt verified.txt
Salida esperada:
19d512fc649e1668eb84741284ad95ec03f3225719a83e40389dbade4eabe5ed19d512fc649e1668eb84741284ad95ec03f3225719a83e40389dbade4eabe5ed
Notas sobre los mecanismos de firma compatibles
El token admite una variedad de mecanismos que incluyen RSA sin procesar y variantes con hash con/sin relleno de PSS:
$ pkcs11-tool --module /usr/lib/libIDPrimePKCS11.so -M --slot 0x11 | grep sign
Salida de muestra:
RSA-PKCS
RSA-PKCS-PSS
SHA256-RSA-PKCS
SHA256-RSA-PKCS-PSS
SHA384-RSA-PKCS
SHA384-RSA-PKCS-PSS
SHA512-RSA-PKCS
SHA512-RSA-PKCS-PSS
...
RSA-PKCS
: Firma la entrada binaria sin procesar, sin hash.SHA256-RSA-PKCS
: Hashes con SHA-256 antes de firmar.SHA256-RSA-PKCS-PSS
: Halla y utiliza un relleno PSS aleatorio (firma no determinista).