anonymous Log in
Search
Recents:
v3.0
java-l
Variables Cripto/Encrypt
30/03/21 18:29

martin gaston

Replies: 7

Hola
Trabajamos con Gx 16 U11.
Estamos desarrollando una aplicación en donde necesitamos usar funciones
para cifirar y firmar documentos.
Para esto estamos probando con las variables de tipo AsymmetricCipher.
Con OpenSSL primero generamos una clave privada , luego a partir de esta
un certificado firmado. La clave privada con extension .pem y el
certificado con extension crt.
Luego creamos un webpanel con dos acciones, firmar y verificar.
En el evento firmar tenemos los siguiente
&pathToKeys = !'d:\Temp\'
&PrivateKey.Load(&pathToKeys+!"privatekey_1.pem")
if &PrivateKey.HasError()
msg("Error loading private key. Code: " + &PrivateKey.GetErrorCode() + "
Description: " + &PrivateKey.GetErrorDescription())
else
msg("Private key correctly loaded")
///Encripto con sha256, ofuscado
&signedText =
&AsymmetricCipher.DoEncrypt_WithPrivateKey(HashAlgorithm.SHA256,
AsymmetricEncryptionPadding.PCKS1PADDING, &PrivateKey, &Texto)
If &AsymmetricCipher.HasError()
Msg(&AsymmetricCipher.GetErrorDescription())
EndIf
En el evento verificar
&pathToKeys = !'d:\Temp\'
&Certificate.Load(&pathToKeys+!"public_1.crt")
If &Certificate.HasError()
Msg('error al recuperar certificado.
Detalle:'+&Certificate.GetErrorDescription())
Else
Msg(&Certificate.Subject)
&decrypted =
&AsymmetricCipher.DoDecrypt_WithPublicKey(HashAlgorithm.SHA256,
AsymmetricEncryptionPadding.PCKS1PADDING, &certificate, &signedText)
Msg('Texto original:'+&decrypted)
//Else
// Msg('firma trucha')
EndIf
Prototipamos con Net probamos y funciona ok. Nosotros lo necesitamos en
java, así que creamos en environment java. Rebuild all y probamos.
Usamos jav 1.8 y tomact 8.
El evento que encripta funciona perfecto. Al ejecutar el evento que
desencripta se produce una exception y pincha.
Buscando en gxsearch encontre el SAC
: https://www.genexus.com/es/developers/websac?data=48848;;
que describe lo que nos esta pasando. Hicimos la modificaciones en el
archivo de tomcat, probamos nuevamente y el problema continua.
Aqui la consulta es si algun se topo con el problema y conoce que se debe
modificar de tomcat, si se puede usar este tipo de variable con java, etc?
El otro punto que quiero consultar es sobre uso de openssl.
Queremos generar un archivo cifrado emulando la llamada del sistema externo.
Para esto usamos el par de claves generadas y volvemos a usar OpenSSL para
cifar el archivo.
Ensayamos con las siguientes:
1)
openssl cms -sign -in SolicitudToken_1.txt -out
solicitudtoken_1.encrypted.cms -signer public_1.crt -inkey privatekey_1.pem
-nodetach -outform PEM
y con
2)
openssl rsautl -encrypt -inkey publicKey.pem -certin -in file.txt -out
encypted_file.txt
El tema con el primer comando es que produce un archivo cifrado que no esta
en base 64 y al aplicarle la funcion de genexus pincha.
El problema con el segundo comando es que produce un arhico binario y al
aplicarle la funcion de genxus tambien pincha.
Alguno tiene referencia de como usar la Opensll o algun otro aplicativo
para generar archivos cifrados por metodo asimetrico, con salida a base64?
Gracias
Por lo que entendemos de la documentacion de genexus los a
-----------------------------------------
Para Suscribirse/Desuscribirse:
http://www.gxtechnical.com/cgi-bin/hforum.exe?2,3,30,20
Por consultas owner-java-l@gxtech.com.uy
Replies

leandro79337933

31/03/21 08:47
Hola Martin, buenos dias. Sería bueno saber que tipo de certificado es "public_1.crt", que herramienta usaron para crearlo y qué parametros indicaron. Slds On Tue, Mar 30, 2021 at 6:30 PM Martin Gaston

martin gaston

31/03/21 09:53
Hola Para crear el certificado usamos OpenSSL Los pasos que seguimos son: *////Para crear clave privada* openssl genrsa 2048 > privatekey.pem *////Para crear una solicitud de firma* $ openssl req -new -key privatekey_1.pem -out csr.pem *///Para firmar una solicitud (CSR) -> la salida en un certificado publico* openssl x509 -req -days 365 -in csr.pem -signkey privatekey.pem -out public_1.crt El mié, 31 mar 2021 a las 8:47, Leandro Minatel ()

leandro79337933

31/03/21 10:21
Hola Martin, el comando para crear la clave privada está OK pero la manera correcta sería: $ openssl genrsa -out privatekey.pem 2048 El segundo comando es para armar una solicitud de certificado, válido si usas una CA o un tercero para firmarlo, pero no sería necesario en tu caso, ya que estas usando autofirmados (corregime si estoy pifiando en algo). Por lo tanto, una vez generada la clave privada con el primer comando, solo necesitas armar el certificado de la siguiente manera: $ openssl req -x509 -new -key privatekey.pem -out public_1.crt -days 365 Y creo que listo. Slds On Wed, Mar 31, 2021 at 9:53 AM Martin Gaston

martin gaston

31/03/21 10:40
Hola Leandro Si es correcto, con esto estaría. El problema se presenta a continuación, ya que queremos cifrar un archivo con el juego de claves que generamos. El objetivo es que un tercero nos envíe un mensaje cifrado y ( nosotros con el archivo publico) lo recuperemos desde genexus. Para esto estamos cifrando el archivo con openssl. En nuestro caso trata del archivo *request.xml *y estamos haciendo lo siguiente: openssl rsautl -inkey privatekey_1.pem -in request.xml -sign > *request.encrypted* se genera este archivo [image: image.png] y le enviamos a genexus el archivo encriptado "request.encrypted" Al cual le aplicamos el código que figura en el evento verificar. Cuando hacemos esto se produce el siguiente error: [image: image.png] Por lo que leí estas funciones de genexus necesitan el archivo cifrado en base64, con lo cual el error tiene sentido. Aquí lo que no estamos encontrando son los parámetros que tenemos que pasar a OpenSSL para generar la salida en formato base64. El mié, 31 mar 2021 a las 10:22, Leandro Minatel ()

leandro79337933

31/03/21 12:36
Es correcto, necesitas convertirlo a base64 para poder leerlo con GX. En Linux y Mac tenemos el comando "base64" pero en Windows hay que recurrir al PowerShell. O podes usar el mismo OpenSSL: $ openssl rsautl -sign -in request.xml -inkey privatekey_1.pem -out request.xml.bin $ openssl base64 -in request.xml.bin -out request.xml.b64 En *request.xml.b64* vas a tener la representación en base64 del binario *request.xml.bin*. Slds On Wed, Mar 31, 2021 at 10:40 AM Martin Gaston

martin gaston

31/03/21 16:53
Funciona ok. Con esto obtengo un archivo en formato base 64 que el método decript interpreta perfectamente, esto en Net. Luego probamos con el mismo objeto y los mismo certificados en java y se produce el siguiente error: Caused by: java.lang.NullPointerException at com.genexus.securityapicommons.keys.CertificateX509.extractPublicInfo(CertificateX509.java:404) at com.genexus.securityapicommons.keys.CertificateX509.inicializeParameters(CertificateX509.java:391) at com.genexus.securityapicommons.keys.CertificateX509.loadPKCS12(CertificateX509.java:84) at com.genexus.securityapicommons.keys.CertificateX509.load(CertificateX509.java:70) Encontramos este SAC https://www.genexus.com/es/developers/websac?data=48848;; Que sugiere que el algoritmo con el que se genera el certificado esta obsoleto. Revisamos el parametro y esta ok deberia resolver . Probamos generando certificado con otro algoritmo (para esto agregamos -sha512), usamos sentencia para la clave privada openssl req -x509 -sha512 -new -key privatekey_1.pem -out public_5.crt -days 365 Cambiamos los certificados y volvimos a probar y obtuvimos el mismo error Tenes idea si estamos usando el parametro correcto en openssl para cambiar el algoritmo al certificado o habra que hacerlo sobre la clave privada. Lo otro que me trae dudas, es que espero poder cifrar con una aplicacion de terceron, por ejemplo openssl y descrifrar con genexus. El metodo que uso en gx para cifrar es: &signedText = &AsymmetricCipher.DoEncrypt_WithPrivateKey(HashAlgorithm.SHA512, AsymmetricEncryptionPadding.PCKS1PADDING, &PrivateKey, &Texto) y para descrifrar &decrypted = &AsymmetricCipher.DoDecrypt_WithPublicKey(HashAlgorithm.SHA512, AsymmetricEncryptionPadding.PCKS1PADDING, &certificate, &signedText) La otra duda que me aparece en este punto, es como se relacionar los parametros hash y padding de genexus con los de openssl El mié, 31 mar 2021 a las 12:37, Leandro Minatel ()

leandro79337933

01/04/21 13:57
Hola Martin, vayamos por partes. En el primer error, no creo que sea un problema de algoritmo, si mal no recuerdo, me dio en alguna de las pruebas que hice pero reiniciando el Tomcat salio andando. ¿No habrá quedado alguna configuracion que hayas tocado y no vuelto atrás? Decía que no creo que sea problema de algoritmos ya que los que están desafectados en el java.security son los *muy* viejos (MD2, MD5, SHA1) y vos estas usando SHA256/SHA512. Tampoco te va a servir que modifiques ese archivo, fijate que hay una nota que dice que no aplica a certificados autofirmados (que es tu caso): # Note: The algorithm restrictions do not apply to trust anchors or # self-signed certificates. Y hay otra nota que dice: # Note: This property is currently used by Oracle's PKIX implementation. It # is not guaranteed to be examined and used by other implementations. Te cuento que a mi si me funciona, tanto la firma con la clave privada como la "verificación" con la publica. Use exactamente los mismos comandos que vos para crear las claves. Lo probé con Java11+Tomcat9 y con Java8+Tomcat8. En Windows y en Linux. Por otro lado, el comando OpenSSL para utilizar SHA512 está ok. Podes verificar el algoritmo de un certificado de la siguiente manera: $ openssl x509 -in public_5.crt -text -noout """" Certificate: Data: Version: 3 (0x2) Serial Number: 5c:61:74:98:99:ac:81:c0:da:2a:c4:95:39:2f:3c:3f:8f:14:3c:79 *Signature Algorithm: sha512WithRSAEncryption* Issuer: C = AR, ST = 2048_512 BsAs, L = 2048_512 CJ, O = 2048_512 LMM, OU = 2048_512 Sistemas, CN = Leandro Matias Minatel, emailAddress = leandro@minatel.com.ar Validity Not Before: Apr 1 15:24:59 2021 GMT Not After : Apr 1 15:24:59 2022 GMT Subject: C = AR, ST = 2048_512 BsAs, L = 2048_512 CJ, O = 2048_512 LMM, OU = 2048_512 Sistemas, CN = Leandro Matias Minatel, emailAddress = leandro@minatel.com.ar Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) ......................... ......................... ......................... """" Respecto a tus dudas, solo te puedo aconsejar que utilices los "estándares". Buscate el *RFC 3447 y el 4051*. En las secciones *2.3.2 *y *2.3.4 *del *RFC 4051* indican que el padding es el *PKCS#1 v1.5*. Slds On Wed, Mar 31, 2021 at 4:54 PM Martin Gaston


Back to java-l