firmar documentos xml digitalmente en uniface

epablo
Mensajes: 23
Registrado: 02 Dic 2013, 09:49

firmar documentos xml digitalmente en uniface

Mensaje por epablo » 19 Feb 2015, 12:37

Me podríais facilitar algún ejemplo de como firmar un documento XML digitalmente desde UNIFACE, partiendo de un certificado *.P12 . En la ayuda de UNIFACE esto se puede realizar con las funciones $encode $decode pero me da errores al ejecutarlas.
En relación a los certificados para la realización de la firma UNIFACE necesita un *.pem ¿Que parte de la estructura de este fichero se utiliza para firmar?

luis.vila
Mensajes: 193
Registrado: 17 Sep 2011, 12:46

Re: firmar documentos xml digitalmente en uniface

Mensaje por luis.vila » 19 Feb 2015, 13:20

Cuando se habla de los PEM, se refieren a todo (incluyendo la línea BEGIN CERTIFICATE y la del END)

En la documentación se incluye este ejemplo:

You can generate the RSA private and public keys using OpenSSL. For example, the following command generates a 2048 -bit key saved to file named myPrivateKey.pem:

# Generate the RSA private key in the traditional SSLeay format.
openssl genrsa -out traditional.pem 2048

# Change the private key to PKCS#8 format in PEM encoding.
openssl pkcs8 -topk8 -in traditional.pem -inform pem -out myPrivateKey.pem -outform pemTo generate the corresponding public key:

openssl rsa -in myPrivateKey.pem -out myPublicKey.pem -pubout

Problema: Windows no trae openssl. Lo mejor es tener acceso a un Unix para hacer esto, sino tendrás que descargarlo.

Teniendo los ficheros PEM, incluyen este ejemplo de código
Uniface accepts the key parameter as string.

; Load keys
fileload “private_key.pem”, sPriKey
fileload “public_key.pem”, sPubKey

; Encrypt data by RSA-OAEP encryption scheme with SHA-512 hash
ciphertext = $encode("RSA_OAEP_SHA512", plaintext, sPubKey)

; Decrypt the ciphertext
plaintext = $decode("RSA_OAEP_SHA512", ciphertext, sPriKey)
Example: Signing and Verifying Signatures
Using $encode and $decode you can sign and verify a message with a digital signature:

; Sign a message by RSA PKCS #1 v1.5 with SHA1 hash.
vSignature = $encode("RSASSA_PKCS1V15_SHA1", vMessage, vMyPrivateKey)

; Verify the signed message.
if ($decode("RSASSA_PKCS1V15_SHA1", vMessage, vMyPublicKey, vSignature))
message/info "This is a valid message."
else
message/info "Signature doesn’t match with the message."
endif

Sirve para ver qué esperan las funciones $encode y $decode... los ficheros PEM tal cual. El vMessage es el documento XML.

Teniendo los parámetros claros, hay que enfrentarse a los certificados y su multitud de formatos. Comentas que tienes un certficado en formato P12. Lo mejor es convertirlo con openssl (o usando el gestor de certificados de Windows, guardarlo como PEM x509).

Probablemente, en el mundo real no tendrás la privatekey para comprobar el cifrado. Pero crear tu propio certificado (usando el mismo formato) te servirá para comprobar que Uniface firma correctamente. Después será sustituir tu PEM por el certificado real. Espero que esto te ayude porque el tema de los certificados es bastante farragoso (al menos, para mí).

$status=0 ; se acabaron los problemas

osmarco
Mensajes: 22
Registrado: 28 Ene 2014, 13:09

Re: firmar documentos xml digitalmente en uniface

Mensaje por osmarco » 19 Feb 2015, 14:13

Hola de nuevo.
comento un poco la situación. apartir del fichero .p12, se ha transformado en un .pem. Una vez que se ha obtenido el .pem se han ejecutado los siguientes comandos
openssl genrsa -out traditional.pem 2048
openssl pkcs8 -topk8 -in traditional.pem -inform pem -out myPrivateKey.pem -outform pem
openssl rsa -in myPrivateKey.pem -out myPublicKey.pem -pubout

Una vez que ya tenemos los dos ficheros, un para la clave publica y otro para la clave privada, se ejecuta el siguiente código
variables
string info
raw cifrado
string sPriKey
string sPubKey
endvariables
fileload "D:\00certificados\myPublicKey.pem", sPubKey
fileload "D:\00certificados\myPrivateKey.pem", sPriKey
fileload "D:\00certificados\filexml.xml", info

cifrado = $encode("RSAES_OAEP_SHA1","hola mundo",sPubKey)
;;;esta línea se ejecuta bien.

cifrado = $encode("RSAES_OAEP_SHA1",info,sPubKey)
;;;esta sentencia da el siguiente error
"ERROR=-1791·;MNEM=<UENCERR_GENERAL>·;DESCRIPTION=Encode/decode general error·;COMPONENT=FIRMA·;PROCNAME=FIRMAR·;TRIGGER=EXEC·; LINE=6·;ADDITIONAL=RSA/OAEP-MGF1(SHA-1): message length of 4833 exceeds the maximum of 214 for this public key"


cifrado = $encode("RSASSA_PSS_SHA1","hola mundo",sPriKey)
;;;esta linea da el siguiente error
"ERROR=-1796·;MNEM=<UENCERR_INVALID_PRIVATE_KEY>·;DESCRIPTION=Invalid private key·;COMPONENT=FIRMA·;PROCNAME=FIRMAR·;TRIGGER=EXEC·;LINE=7·;ADDITIONAL=SignatureSigner: Invalid private key."

cifrado = $encode("RSASSA_PSS_SHA1",info,sPriKey)
;;;esta línea da el siguiente error
"ERROR=-1796·;MNEM=<UENCERR_INVALID_PRIVATE_KEY>·;DESCRIPTION=Invalid private key·;COMPONENT=FIRMA·;PROCNAME=FIRMAR·;TRIGGER=EXEC·;LINE=8·;ADDITIONAL=SignatureSigner: Invalid private key."

¿Como solucionar estos errores? La ayuda de uniface, no se extiende mucho para solucionar este tipo de errores.

cufiler
Site Admin
Mensajes: 5
Registrado: 17 Sep 2011, 12:16

Re: firmar documentos xml digitalmente en uniface

Mensaje por cufiler » 19 Feb 2015, 15:10

Más tarde le podré dedicar más tiempo.

Por ahora, he visto que el primer error es por el tipo de certificado. Buscando "message length of 4833 exceeds the maximum of 214 for this public key" encuentro que es un problema común y que la solución es encriptarlo por trozos de 214bytes.
Según parece 2048/8 = 256 pero hay que quitarle 42 del encabezado => 214.

Y ese error nos lleva a buscar "rsa encrypt long message"

osmarco
Mensajes: 22
Registrado: 28 Ene 2014, 13:09

Re: firmar documentos xml digitalmente en uniface

Mensaje por osmarco » 20 Feb 2015, 12:32

en relación a esto que pone el manual de ayuda de uniface.

; Verify the signed message.
if ($decode("RSASSA_PKCS1V15_SHA1", vMessage, vMyPublicKey, vSignature))

¿Qué es vSignature? ¿Qué contiene?

luis.vila
Mensajes: 193
Registrado: 17 Sep 2011, 12:46

Re: firmar documentos xml digitalmente en uniface

Mensaje por luis.vila » 20 Feb 2015, 13:30

$decode sirve para convertir/descodificar ó para comprobar la veracidad de una firma

En ese caso es para comprobar si es correcta la signature obtenida anteriormente (o recibida desde el exterior)
; Sign a message by RSA PKCS #1 v1.5 with SHA1 hash.
vSignature = $encode("RSASSA_PKCS1V15_SHA1", vMessage, vMyPrivateKey)

$status=0 ; se acabaron los problemas

osmarco
Mensajes: 22
Registrado: 28 Ene 2014, 13:09

Re: firmar documentos xml digitalmente en uniface

Mensaje por osmarco » 20 Feb 2015, 14:13

luis.vila escribió:$decode sirve para convertir/descodificar ó para comprobar la veracidad de una firma

En ese caso es para comprobar si es correcta la signature obtenida anteriormente (o recibida desde el exterior)
; Sign a message by RSA PKCS #1 v1.5 with SHA1 hash.
vSignature = $encode("RSASSA_PKCS1V15_SHA1", vMessage, vMyPrivateKey)
Una vez generados los ficheros que comenta el manual de ayuda...
openssl genrsa -out traditional.pem 2048
openssl pkcs8 -topk8 -in traditional.pem -inform pem -out myPrivateKey.pem -outform pem
openssl rsa -in myPrivateKey.pem -out myPublicKey.pem -pubout

La estructura del myprivatekey.pem es la siguiente

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIE6TAbBgkqhkiG9w0BBQMwDgQI44xZxig+XyICAggABIIEyNhW/JRdhxEaFmRl
sjAjzijR9Wse12nTm0jvK3lTCcEcHLv8KNXpcu48yxAOYy+gCaSZsGcOGFhJcit3
zlMVweSxc2SR/IAESVhwjapKGT3Ov2lxFvD7/oSdksTm/p6rnfqdQmX5RQP44dv8
QBarSq93gaB7UIwuwB1+IraKr78Of8Bv4KzMakoQFeOXnwvloEEHJYYxHvX+n3pT
c29/JWu2HIDUfFQ197sHD8jq9Q7OzlGRHuEkrEJocShI25oAfufU2R2L2w1j9Ymw
LOpnS5y8kaNp7fxcBoqgJJF1Vm9tjquHVX7JpUAufzTMbR06799xeJhL+KOaCrr9
I0oR5wyuaHHnABuNt6C55bLyOohUsg+Pg/0OuqT2iGW/vT6AL0h6Tu7yMkOvgMMu
mEJnXZACd50dUhWzrUOSCVwFnb8mjjgv44qmZSh2GR4etAo5sPZdKY38dMYBQJ/x
nWezxXd4JoQp/JoeQ4mNrznzsNPOz52fTa60V7bVHLtXY2VnLCX+jXhHexG7NSDL
zafDmHinG9lo0/Z709s/mV1C4VxNjuOubbSivWep4YzjgaZFyqUZUtbUl6Wamqsk
rlIb6otLexzpdT8hmI6S5qeMei9BwvC8N+edxy3qgHABd+6+MJZjm6u8oxyMVJaM
ExiCa2GoLIkgdADAktvsTzt90RUtzSPfM75owEixOePLnoAigNfqGktFiOko+MOE
33ihU050vljTLzjuxa4/XIiNveLCEBJvOa7B7ENKs+KlyURqy+XwNxUD+mQTpBHU
vDsQHKEMexgFRLAUMoVTPT/CkSHxAA7fRUNapf+UoVkLwSnq8uylpEqTQgO0rEiR
UtZh4w2IP5mdbaYI/s7/8Q5/ile/o0SmjvsRWP+NXn42hC5gNLwuVteh+pCcvBVN
rcpWVrvPr8aGPbtgGz/VE5wLO8g6p4KVkR9wM1axauCLNuPwzKXuQnwdW4ZXzISb
/GWFybNRXV0LJMZLdFsIU8S6Og2z3emHrMnU9t1KZ4x/g8gHIvXQoe5BvdFqcHJ1
mQmJ4MOaK5eOU/axdfcpSqLqxqx+togootMZuK4S3kOz8kcprh9gPMHSSJ8LA5uW
2i8gvfDt/GZLZr3gL4HTyBunAiikssmadvZ8l9lCsf5HST1xyR1fA70WORfEQtCo
lZOISU2mgzLsKFvHzLJkh2wSKB4SynBYVtp1inhA63P49TVKrAolo3ZJG77qSxyI
gP4CcxjryEvev2q40CK4qDXgiTaHvjL7E4HRlnqkdlC1MF02w4U9kThbgz14o6kU
u+hNoznc9Zxfzm2Vo1axjBdr2G5DfXmgVgmAw7z+LZ1Lcg9q72jSyztEgNe0CHPC
ZO46DpyowXXQRJNOaKvmsC1WEjDhGtyT/py8V1Zg0tSdzdL7oVKcA9WkSXMqEhv/
QCC8VjPwYmYqpsvtCGK4akLN2MFxPXD27jWid4iNHvBZv0XRmbxu0jenmO1cYf4B
WCZfjtkl3pYrm27rwmcavWRLXeq9iSs3AuzGtbqW3TCp8wrBsZ5keLHzVI+DLP1M
mzO1HMXtULNlSk1awj/69ew8sPGHHXxPrvL34yrN/ycMDv1ujFPeSCAQ4k9LDnZF
mnkd9Y6JhpL5rDUUew==
-----END ENCRYPTED PRIVATE KEY-----

con lo cual........ según manual de ayuda.

fileload "D:\00certificados\myPrivateKey.pem", sPriKey
firma = $encode("RSASSA_PSS_SHA1","hola mundo",sPriKey)

esto no funciona!!!

Me pondré en contacto con los "Señores" de uniface, por que esto no chuta!!!!!!

luis.vila
Mensajes: 193
Registrado: 17 Sep 2011, 12:46

Re: firmar documentos xml digitalmente en uniface

Mensaje por luis.vila » 20 Feb 2015, 14:48

Mis conocimientos de encriptación son muy limitados. Todo me apunta a que la clave privada generada no es adecuada y a saber qué método/parámetro hay que ponerle al openssl para que cree la clave privada requerida. Desde luego, tal cual lo que dice el manual, no funciona.

Una cosa que me escama es que el openssl me pide "Enter Encryption Password" al generar la privada pero luego no hay manera de ponerla en Uniface. También he probado con ese password en blanco pero tampoco.

Si pruebo a firmar cualquier cosa (corta) con el propio openssl, me pide ese password
openssl rsautl -sign -in test.txt -inkey myPrivateKey.pem -out salida.sign



[Experto en criptografía] Claro, estás usando el RSAES_OAEP_SHA1 cuando la clave es RSASSA_PKCS1V15_SHA1.
[Yo] Para mí son sólo letras y números!!

$status=0 ; se acabaron los problemas

osmarco
Mensajes: 22
Registrado: 28 Ene 2014, 13:09

Re: firmar documentos xml digitalmente en uniface

Mensaje por osmarco » 20 Feb 2015, 15:27

¡¡¡¡¡¡¡¡¡¡¡¡CONSEGUIDO!!!!!!!!!!!!!!!!!!!!!!!!!!!!

luis.vila
Mensajes: 193
Registrado: 17 Sep 2011, 12:46

Re: firmar documentos xml digitalmente en uniface

Mensaje por luis.vila » 20 Feb 2015, 18:26

:-D

Y qué le pasaba a la clave privada? (O al dichoso $encode)

$status=0 ; se acabaron los problemas

Responder