gx-l | | | |
alonso.gx | |
Y por cierto hay algo al respecto https://www5.genexus.com/xev3/scmain.aspx?P%3B178%3B94%3B1264%3B1%3B1%3BO%3B,39434
SAC #39434: Webservice bajo protocolo TLS 1.2 no funciona
Desculpe, não há tradução disponível no Português; a versão em Espanhol está disponível
Abstract
Se tiene un servicio que esta bajo el nuevo protocolo TLS 1.2. Al consumirlo da un error.
El mismo servicio antes estaba publicado bajo SSL y funcionaba.
Descrição Detalhada
Los servicios que se consumen y fueron migrados al protocolo TLS 1.2, no estan funcionando.
Por ejemplo al llamar al servicio dan este tipo de errores:
------------
16:38:13,007 [55] WARN GeneXus.Http.Client.GxHttpClient - Error Execute
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetResponse()
at GeneXus.Http.Client.GxHttpClient.Execute(String method, String name)
------------
ERROR GxHttpClient [] - Error Execute
Exception: System.Net.WebException
Message: A conexão subjacente estava fechada: Erro inesperado em um envio.
Source: System
em System.Net.HttpWebRequest.GetResponse()
em GeneXus.Http.Client.GxHttpClient.Execute(String method, String name)
Nested Exception
Exception: System.IO.IOException
Message: EOF inesperado ou 0 bytes recebidos do fluxo de transporte.
Source: System
em System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
em System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
em System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
em System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
em System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
em System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
em System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
em System.Net.TlsStream.CallProcessAuthentication(Object state)
em System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
em System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
em System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
em System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
em System.Net.ConnectStream.WriteHeaders(Boolean async)
Mensaje en ingles: The underlying connection was closed: An unexpected error occurred on a send.
------------
Solución:
Con .NET :
A.Para llamar al servicio con External Object , hay dos casos :
A.1. si se tiene propiedad del environment "Use Soap Native" = true , se resuelve con código embebido, algo como el siguiente :
csharp System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls;
A.2. si se tiene propiedad del environment "Use Soap Native" = false agregar, antes del llamado al servicio , en el código genexus, la linea:
csharp System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls;
Es requerimiento Framework 4.0 o superior
Con Framework 3.5 o inferior buscar el modulo que implementa TLS 1.2
Otro Workaround es agregar lo siguiente al web.config:
en el framework 4.6.1 el default es ServicePointManager.SecurityProtocol = Tls12 | Tls11 | Tls
Mientras que en el 4.5 es ServicePointManager.SecurityProtocol = Ssl3 | Tls.
B. Para el caso de usar el tipo de datos Httpclient , se debe configurar lo descripto en A.2
Con Java:
Con JDK 1.8 o superiori funciona sin problemas, ya que por defecto se usa TLSv1.2
Con JDK 1.7 no funciona, si bien es soportado el TLSv1.2, el valor por defecto es TLSv1. Para que funcione se puede agregar
java try {
java javax.net.ssl.SSLContext ctx = javax.net.ssl.SSLContext.getInstance("TLSv1.2");
java ctx.init(null, null, null);
java javax.net.ssl.SSLContext.setDefault(ctx);
java } catch (Exception e) {
java }
Este código cambia el default para todas las Webapp del server.
|
|
|
|
|
Back to gx-l |
|