java-l |
| martin gaston | |
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 |
|
|
| | |
martin gaston | |
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 | |
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 |
|