Page tree
Skip to end of metadata
Go to start of metadata

Estudo para avaliação dos procedimentos e configurações de conexões utilizando o protocolo SSL/TLS possibilitou o entendimento das anomalias encontradas ao longo do parque de clientes em produção. Apresentaremos abaixo alguns passos do estudo junto com os argumentos utilizados na nova implementação que estará disponível a partir da versão 13.1.3.26 e 13.2.3.26.

Para obter maiores informações sobre a família de versões do protocolo SSL/TLS acesse página Utilizando SSL – Secure Socket Layer. Para informações sobre as sessões, chaves e valores das configurações SSL/TLS no AppServer acesse a página Configuração SSL no AppServer.

Utilizamos no processo de investigação a última versão do TOTVS | Application Server disponível no portal de downloads e atualizações da TOTVS, correspondente ao código P12 Windows x86 versão 13.2.3.25. Também utilizamos a ferramenta OpenSSL 1.1.0f para simular o par de conexão, quer seja server quer client.

Disponibilidade

O estudo foi realizado utilizando a versão do Application Server 13.1.3.25 e 13.2.3.25. As alterações propostas somente estarão disponíveis a partir da versão do Application Server 13.1.3.26 e 13.2.3.26.

1. Porque o uso do TryProtocols?

1.1. Preparação do Ambiente

Iniciamos com a configuração do Application Server (AppServer) na tentativa de estabelcer conexões seguras SSL/TLS na versão TLS1.2. Essa versão de protocolo é a mais segura disponível. Abaixo a sessão SSLConfigure utilizada. Observe que não habilitaremos a chave TryProtocols.

[SSLConfigure]
Verbose = 1
SSL2    = 0
SSL3    = 0
TLS1    = 3
Bugs    = 0
State   = 1
TryProtocols = 0

Codificamos um pequeno programa ADVPL utilizando a função HTTPSGet. A proposta é realizar uma solicitação simples de conexão sem a necessidade de aguardarmos a resposta desse servidor, pois o objetivo é avaliar o processo de conexão:

HTTPSGet
#include 'protheus.ch'
#include 'parmtype.ch'

user function GetSSL01()
 Local cURL := "https://127.0.0.1:8443"
 Local aHeadOut := {}
 Local cHeadRet := ""
 Local cGetRet := ""
 
 AAdd( aHeadOut, 'User-Agent: Mozilla/4.0 (compatible; Protheus ' + GetBuild() + ')' )
 cGetRet := HTTPSGet( cURL, "", "", "", "WSDL", 120, aHeadOut, @cHeadRet )
if Empty( cGetRet )
 conout( "Fail HTTPSGet" )
 else
 conout( "OK HTTPSGet" )
 varinfo( "WebPage", cGetRet )
 endif
 
 varinfo( "Header", cHeadRet )
return

Iniciamos a ferramenta OpenSSL de forma a simular um servidor que aceita somente conexões SSL/TLS na versão TLS1.2, conforme o comando abaixo:

openssl s_server -4 -key localhost-key.pem -cert localhost-cert.pem -accept 8443 -state -msg -security_debug -nbio -tls1_2

1.2. Execução para Ambientação

Executando o programa ADVPL GetSSL01 observamos que houve sucesso na conexão entre o AppServer e o OpenSSL Server. O log da console AppServer apresenta várias informações importantes na análise, por exemplo:

  • Configuração SSL/TLS carregada pela aplicação → linha 32:
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
  • Versão do protocolo utilizado na conexão → linha 48:
    [INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.

  • Configuração SSL/TLS utilizada no processo de comunicação → linha 53:
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
  • Resultado da conexão → linha 69 e 70:
    [INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
    [INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

Abaixo o registro do console:

Log AppServer TLS1.2 (client) vs OpenSSL TLS1.2 (server)
Windows Operating System version 6.1.7601 Service Pack 1
[INFO ][SERVER] [Thread 6752] [SMARTHEAP] Version 8.0.0
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Nov 23 2017 - 13:23:07 NG
* Build: 32 bits
* RPO Format: 32 bits
* SVN Revision: 10324 - 15733 - 1956
* Build Version: 13.2.3.25
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 7078.12 MB. Free 947.48 MB.
Paging file ..... 16049.37 MB. Used 12385.17 MB. Free 3664.20 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 6752] APP Virtual Address Allocation Limit .... 4095.88MB.
[INFO ][SERVER] [Thread 6752] Memory Monitor Virtual Address LIMIT .... 4095.88MB.
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [10864]
[INFO ][SERVER] Application Main Thread .. [6752]
[INFO ][SERVER] [Thread 6752] Application Server started on port 8612
[08/12/2017 10:11:36] Server started.
[WARN ][SERVER] [Thread 1496] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 10:19:41] Starting Program U_GETSSL01 Thread 1496 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv3 write client hello A
[INFO ][SSL] SSL_connect:SSLv3 read server hello A
[INFO ][SSL] SSL_connect:SSLv3 read server certificate A
[INFO ][SSL] SSL_connect:SSLv3 read server key exchange A
[INFO ][SSL] SSL_connect:SSLv3 read server done A
[INFO ][SSL] SSL_connect:SSLv3 write client key exchange A
[INFO ][SSL] SSL_connect:SSLv3 write change cipher spec A
[INFO ][SSL] SSL_connect:SSLv3 write finished A
[INFO ][SSL] SSL_connect:SSLv3 flush data
[INFO ][SSL] SSL_connect:SSLv3 read server session ticket A
[INFO ][SSL] SSL_connect:SSLv3 read finished A
[INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

1.3. Execução com Full Protocols

Se adotarmos uma configuração no AppServer que habilite além do TLS1.2 também os protocoloos SSL2 e SSL3, pois intuitivamente estaríamos habilitando todo conjunto de protocolos disponíveis na aplicação (veremos mais adiante que essa informação é irregular):

[SSLConfigure]
Verbose = 1
SSL2    = 1
SSL3    = 1
TLS1    = 3
Bugs    = 0
State   = 1
TryProtocols = 0

Ao executar novamente o mesmo programa ADVPL temos como resultado um erro na tentativa de conexão. Observe que a aplicação fez uso do primeiro conjunto de protocolos diponíveis na aplicação (SSL3+SSL2), em um única tentativa, linha 48.

Tecnicamente, o procedimento de conexão neste contexto de configuração utiliza uma função (recurso operacional com lista de comandos para execução) da biblioteca OpenSSL que providencia uma negociação quanto a versão do protocolo as partes poderão estabelecer. Não significa que está utilizando uma versão identificada por SSL3 e SSL2, mas que tratará uma negociação entre o conjunto de protocolos disponíveis e habilitados.

Protocolos SSL/TLS

O conjunto de protocolos disponíveis pela biblioteca OpenSSL, em ordem crescente de grau de segurança, é SSL2, SSL3, TLS1.0, TLS1.1 e TLS1.2. Cada versão estabelece um conjunto de regras, transações, cifras e protocolos com objetivo de melhorar os requisitos de segurança das versões anteriores.

Observe que na configuração da aplicação habilitamos um conjunto parcial de protocolos. Também, note que há um descontinuidade dentre as versões do protocolo, ou seja, entre os graus de segurança:

SSL2 → SS3 → ..?.. → ..?.. → TLS 1.2

A biblioteca OpenSSL sugere que quando for utilizado o método genérico, que providência uma negociação da versão disponível para conexão, não haja descontinuidade nas versões dos protocolos ou graus de segurança. Por outro lado, somente deve ser utilizada a habilitação de versões quando utilizarmos os métodos objetivos das versões, ou seja, quando o método é direcionado para uma versão específica, como ocorrido no teste do primeiro contexto deste artigo.

Log AppServer SSL2, SSL3 e TLS 1.2 (client) vs OpenSSL TLS1.2 (server)
Windows Operating System version 6.1.7601 Service Pack 1
[INFO ][SERVER] [Thread 6944] [SMARTHEAP] Version 8.0.0
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Nov 23 2017 - 13:23:07 NG
* Build: 32 bits
* RPO Format: 32 bits
* SVN Revision: 10324 - 15733 - 1956
* Build Version: 13.2.3.25
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 7133.06 MB. Free 892.53 MB.
Paging file ..... 16049.37 MB. Used 12504.54 MB. Free 3544.83 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 6944] APP Virtual Address Allocation Limit .... 4095.88MB.
[INFO ][SERVER] [Thread 6944] Memory Monitor Virtual Address LIMIT .... 4095.88MB.
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using SSL3+SSL2 protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [4256]
[INFO ][SERVER] Application Main Thread .. [6944]
[INFO ][SERVER] [Thread 6944] Application Server started on port 8612
[08/12/2017 10:21:14] Server started.
[WARN ][SERVER] [Thread 11860] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 10:21:22] Starting Program U_GETSSL01 Thread 11860 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using SSL3+SSL2 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] SSL3 alert read:fatal:handshake failure
[INFO ][SSL] SSL_connect:error in SSLv2/v3 read server hello A
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336032784
[ERROR][SSL] SSL description = error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
[ERROR][SSL] Failed Handshake SSL.

1.4. Prática da Solução

A prática atual para solução do problema de conexão SSL/TLS no AppServer é a habilitação da chave TryProtocols na sessão [SSLConfigure] da configuração:

[SSLConfigure]
Verbose = 1
SSL2    = 1
SSL3    = 1
TLS1    = 3
Bugs    = 0
State   = 1
TryProtocols = 1

Ao executar novamente o mesmo programa ADVPL, temos como resultado o sucesso na conexão, porém, podemos observar os 2 (duas) tentativas de conexão.

  • Inicio da execução do programa → linha 45
  • Identificação do protocolo da primeira tentativa de conexão → linha 48
    [INFO ][SSL] [tSSLSocketClientAPI] Using SSL3+SSL2 protocol.

  • Habilitação de protocolos da primeira tentativa de conexão → linha 52
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1 (3)

  • Resultado da primeira conexão → linha 63 e 64
    [ERROR][SSL] SSL description = error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
    [ERROR][SSL] Failed Handshake SSL.

  • Identificação do protocolo da segunda tentativa de conexão → 67
    [INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.

  • Habilitação de protocolos da segunda tentativa de conexão → linha 72
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
  • Resultado da segunda conexão → linha 88 e 89
    [INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
    [INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

Abaixo o registro do console:

Log AppServer All TryProtocols (client) vs OpenSSL TLS1.2 (server)
Windows Operating System version 6.1.7601 Service Pack 1
[INFO ][SERVER] [Thread 576] [SMARTHEAP] Version 8.0.0
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Nov 23 2017 - 13:23:07 NG
* Build: 32 bits
* RPO Format: 32 bits
* SVN Revision: 10324 - 15733 - 1956
* Build Version: 13.2.3.25
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 7120.40 MB. Free 905.20 MB.
Paging file ..... 16049.37 MB. Used 12659.12 MB. Free 3390.25 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 576] APP Virtual Address Allocation Limit .... 4095.88 MB.
[INFO ][SERVER] [Thread 576] Memory Monitor Virtual Address LIMIT .... 4095.88 MB.
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using SSL3+SSL2 protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\rotheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [6288]
[INFO ][SERVER] Application Main Thread .. [576]
[INFO ][SERVER] [Thread 576] Application Server started on port 8612
[08/12/2017 10:39:50] Server started.
[WARN ][SERVER] [Thread 4656] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 10:40:08] Starting Program U_GETSSL01 Thread 4656 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using SSL3+SSL2 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] SSL3 alert read:fatal:handshake failure
[INFO ][SSL] SSL_connect:error in SSLv2/v3 read server hello A
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336032784
[ERROR][SSL] SSL description = error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
[ERROR][SSL] Failed Handshake SSL.
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv3 write client hello A
[INFO ][SSL] SSL_connect:SSLv3 read server hello A
[INFO ][SSL] SSL_connect:SSLv3 read server certificate A
[INFO ][SSL] SSL_connect:SSLv3 read server key exchange A
[INFO ][SSL] SSL_connect:SSLv3 read server done A
[INFO ][SSL] SSL_connect:SSLv3 write client key exchange A
[INFO ][SSL] SSL_connect:SSLv3 write change cipher spec A
[INFO ][SSL] SSL_connect:SSLv3 write finished A
[INFO ][SSL] SSL_connect:SSLv3 flush data
[INFO ][SSL] SSL_connect:SSLv3 read server session ticket A
[INFO ][SSL] SSL_connect:SSLv3 read finished A
[INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

1.5. Temos a Solução?

Esse comportamento nos induz ao uso indiscriminado dos métodos objetivos da biblioteca OpenSSL, pois associa a versão do protocolo requerida e um método direto e objetivo, porém, na aplicação a disponibilização de conexão por múltiplas versões gera a necessidade de controle de loop de retentativas. Vamos então avaliar o uso de conexão TLS1.0 contra um servidor que disponibilize somente a versão TLS1.1:

Configuramos o AppServer como:

[SSLConfigure]
Verbose = 1
SSL2    = 0
SSL3    = 0
TLS1    = 1
Bugs    = 0
State   = 1
TryProtocols = 1

Iniciamos a ferramenta OpenSSL com a configuração que fornece um serviço TLS 1.1:

openssl s_server -4 -key localhost-key.pem -cert localhost-cert.pem -accept 8443 -state -msg -security_debug -nbio -tls1_1

Ao executar o mesmo programa ADVPL veremos que a conexão ocorrerá com sucesso, porém, há um conjunto de tentativas que falharam. Note que não deveria ter havido sucesso na conexão, uma vez que não foi permita habilitação do protocolo TLS 1.0 no AppServer (TLS1 = 1, que significa habilitação para versão TLS 1.0).

  • Inicio da execução do programa → linha 45
  • Identificação do protocolo da primeira tentativa de conexão → linha 48
    [INFO ][SSL] [tSSLSocketAPI] Using TLS1.0 protocol.

  • Habilitação de protocolos da primeira tentativa de conexão → linha 53
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (1)

  • Resultado da primeira conexão → linha 65 e 66
    [ERROR][SSL] SSL description = error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure
    [ERROR][SSL] Unable to send data. Error syscall.

  • Identificação do protocolo da segunda tentativa de conexão → 69
    [INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.

  • Habilitação de protocolos da segunda tentativa de conexão → linha 74
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
  • Resultado da segunda conexão → linha 84 e 85
    [ERROR][SSL] SSL description = error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
    [ERROR][SSL] Failed Handshake SSL.

  • Identificação do protocolo da terceira tentativa de conexão → 88
    [INFO ][SSL] [tSSLSocketAPI] Using TLS1.1 protocol.

  • Habilitação de protocolos da terceira tentativa de conexão → linha 93
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (2)
  • Resultado da terceira conexão → linha 110
    [INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

Resumindo, o AppServer tentou realizar a conexão que estava configurada TLS 1.0, não obtendo sucesso partiu para uma tentativa de conexão não configurada TLS 1.2, e com seu insucesso tentou o protocolo anterior TLS 1.1 que acabou fechando a conexão. Na melhor das hipóteses mascarou um erro de configuração da aplicação.

Abaixo o registro do console:

Log AppServer TLS1.0 (client) vs OpenSSL TLS1.1 (server)
Windows Operating System version 6.1.7601 Service Pack 1
[INFO ][SERVER] [Thread 5072] [SMARTHEAP] Version 8.0.0
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Nov 23 2017 - 13:23:07 NG
* Build: 32 bits
* RPO Format: 32 bits
* SVN Revision: 10324 - 15733 - 1956
* Build Version: 13.2.3.25
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 7146.13 MB. Free 879.47 MB.
Paging file ..... 16049.37 MB. Used 13021.99 MB. Free 3027.38 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 5072] APP Virtual Address Allocation Limit .... 4095.88MB.
[INFO ][SERVER] [Thread 5072] Memory Monitor Virtual Address LIMIT .... 4095.88MB.
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.0 protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [6648]
[INFO ][SERVER] Application Main Thread .. [5072]
[INFO ][SERVER] [Thread 5072] Application Server started on port 8612
[08/12/2017 11:04:13] Server started.
[WARN ][SERVER] [Thread 9072] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 11:04:24] Starting Program U_GETSSL01 Thread 9072 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.0 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv3 write client hello A
[INFO ][SSL] SSL3 alert read:fatal:protocol version
[INFO ][SSL] SSL_connect:failed in SSLv3 read server hello A
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.
[INFO ][SSL] SSL_connect:failed in SSLv3 read server hello A
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336191717
[ERROR][SSL] SSL description = error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure
[ERROR][SSL] Unable to send data. Error syscall.
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.2 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (3)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv3 write client hello A
[INFO ][SSL] SSL3 alert write:fatal:protocol version
[INFO ][SSL] SSL_connect:error in SSLv3 read server hello A
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336130315
[ERROR][SSL] SSL description = error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
[ERROR][SSL] Failed Handshake SSL.
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using TLS1.1 protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1 (2)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv3 write client hello A
[INFO ][SSL] SSL_connect:SSLv3 read server hello A
[INFO ][SSL] SSL_connect:SSLv3 read server certificate A
[INFO ][SSL] SSL_connect:SSLv3 read server key exchange A
[INFO ][SSL] SSL_connect:SSLv3 read server done A
[INFO ][SSL] SSL_connect:SSLv3 write client key exchange A
[INFO ][SSL] SSL_connect:SSLv3 write change cipher spec A
[INFO ][SSL] SSL_connect:SSLv3 write finished A
[INFO ][SSL] SSL_connect:SSLv3 flush data
[INFO ][SSL] SSL_connect:SSLv3 read server session ticket A
[INFO ][SSL] SSL_connect:SSLv3 read finished A
[INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

2. Habilitação de Range de Versões

2.1. Introdução

Como já informado anteriormente, o conjunto de protocolos disponíveis pela biblioteca OpenSSL, em ordem crescente de grau de segurança, é SSL2, SSL3, TLS1.0, TLS1.1 e TLS1.2. Também, a biblioteca sugere que não haja descontinuidade na habilitação de versões quando utilizado o método de negociação de versão do protocolo SSL/TLS. Ao utilizar métodos que direcionem a conexão para versões específicas não deve ser utilizado os recursos de habilitação de protocolo. Os protocolos TLS são nada mais que a continuidade do desenvolvimento dos protocolos SSL, de forma que a versão TLS1.0 corresponderia hipoteticamente à versão SSL4.

Inseguro

Em decorrência a um conjunto de referências bem documentadas sobre sucessos na quebra do protocolo e, por consequência, sua segurança, não é recomendada a utilização das versões SSL2, SSL3 e TLS1.0 em ambiente de produção. São consideradas versões inseguras do protocolo SSL/TLS. Recomenda-se a utilização da versões TLS1.1 e TLS1.2.

Note que uma configuração importante mas até aqui não abordada é a impossibilidade atual de habilitar o uso de versões TLS concomitantemente. Nem todos clientes e serviços disponíveis no parque de produção da aplicação, e que fazem integração ao AppServer, estão atualizados com a versão TLS1.2. Isso quer dizer que o AppServer atuando como um servidor de informações pode e deve tentar manter um maior grau de segurança possível em suas conexões. No papel de consumido de informação, não é rara a necessidade de realizar conexões com mais de um servidor cada qual com uma versão distinta do protocolo.

Há, portanto, necessidade de habilitar a utilização dos protocolos TLS1.1 e TLS1.2 e também manter continuidade entre o menor e maior grau de segurança, correspondente a versão de protocolo utilizado.

A correção de conexões SSL proposta e incluída a partir da versão da TOTVS | Application Server 13.1.3.26 e 13.2.3.26 estabelece o uso de novas chaves de habilitação de protocolo TLS, sendo utilizado somente valores 1 (habilitação) e 0 (desabilitação):

[SSLConfigure]
TLS1_0 = 0
TLS1_1 = 1
TLS1_2 = 1

A chave antiga TLS1 está mantida no modo deprecated. Isso significa que a aplicação carregará a informação disponível mantendo compatibilidade nas versões anteriores. Nos casos que estejam presentes a chave TLS1 e qualquer das chaves novas, o conteúdo da chave antiga será desconsiderada integralmente. Ou seja, mesmo que a chave TLS1 esteja configurada para o protocolo TLS1.2 (TLS1 = 3), caso encontre somente a chave TLS1_0 no arquivo INI o protocolo TLS1.2 será desabilitado da conexão.

Não haverá mais necessidade da chave TryProtocols. O mecanismo de retentativa de conexão com pooling de versão de protocolo será responsabilidade do método de negociação de versão. Ainda que seja encontrada a chave TryProtocols no arquivo INI ela será desprezada.

2.2. Ambiente e Teste com TLS 1.2

Passemos a realizar testes com a nova implementação das conexões SSL/TLS sob o mesmo contexto anterior, ou seja, partiremos para uma conexão TLS1.2 única e, posteriormente, adicionaremos um conjunto conjugado de versões. Ao final faremos algumas análises quanto a premissas de configuração.

Cabe salientar que a nova implementação utilizou como base a mesma versão utilizada nos testes anteriores, isso significa que nenhuma funcionalidade foi adiciona ou removida entre os binários.

Utilização dos protocolos seguros TLS1.1 e TLS1.2:

[SSLConfigure]
Verbose = 1
SSL2    = 0
SSL3    = 0
TLS1_0  = 0
TLS1_1  = 1
TLS1_2  = 1
Bugs    = 0
State   = 1

Iniciamos o simulador de servidor OpenSSL com a possiblildade de conexões somente no protocolo TLS1.2:

openssl s_server -4 -key localhost-key.pem -cert localhost-cert.pem -accept 8443 -state -msg -security_debug -nbio -tls1_2

Executamos o mesmo programa ADVPL anterior. Temos como resultado o sucesso na conexão:

  • Configuração SSL/TLS carregada pela aplicação → linha 36:
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
  • Configuração SSL/TLS utilizada no processo de comunicação → linha 57:
    [INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (0), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)

  • Resultado da conexão → linha 73 e 74:
    [INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
    [INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

Abaixo o registro do console:

Log AppServer Novo TLS 1.1 TLS 1.2 (cliente) vs OpenSSL TLS 1.2 (server)
Windows Operating System version 6.1.7601 Service Pack 1
[INFO ][SERVER] [Thread 6920] *** NOT USING SMARTHEAP
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Dec 7 2017 - 13:54:58 NG
* Build: 32 bits
* DEBUG VERSION
* RPO Format: 32 bits
* SVN Revision: 10394 - 15899 - 1956
* Build Version: 0.0.0
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** DEBUG VERSION WITH CRASH DUMP HANDLER
*** DEBUG VERSION WITH SYMBOLS INFORMATION
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 6975.31 MB. Free 1050.29 MB.
Paging file ..... 16049.37 MB. Used 13635.53 MB. Free 2413.84 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 6920] APP Virtual Address Allocation Limit .... 4095.88MB.
[INFO ][SERVER] [Thread 6920] Memory Monitor Virtual Address LIMIT .... 4095.88MB.
[INFO ][SERVER] [Thread 9928] Crash Monitor BEGIN
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using SSL/TLS protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (0), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [10296]
[INFO ][SERVER] Application Main Thread .. [6920]
[INFO ][SERVER] [Thread 6920] Application Server started on port 8612
[08/12/2017 11:53:39] Server started.
[WARN ][SERVER] [Thread 4492] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 11:55:00] Starting Program U_GETSSL01 Thread 4492 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using TLS/SSL protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (0), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] SSL_connect:SSLv3 read server hello A
[INFO ][SSL] SSL_connect:SSLv3 read server certificate A
[INFO ][SSL] SSL_connect:SSLv3 read server key exchange A
[INFO ][SSL] SSL_connect:SSLv3 read server done A
[INFO ][SSL] SSL_connect:SSLv3 write client key exchange A
[INFO ][SSL] SSL_connect:SSLv3 write change cipher spec A
[INFO ][SSL] SSL_connect:SSLv3 write finished A
[INFO ][SSL] SSL_connect:SSLv3 flush data
[INFO ][SSL] SSL_connect:SSLv3 read server session ticket A
[INFO ][SSL] SSL_connect:SSLv3 read finished A
[INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

2.2. Teste Full Protocols

Habilitaremos agora todo o conjunto de protocolos:

[SSLConfigure]
Verbose = 1
SSL2    = 1
SSL3    = 1
TLS1_0  = 1
TLS1_1  = 1
TLS1_2  = 1
Bugs    = 0
State   = 1

Iniciamos o simulador de servidor OpenSSL com a possiblildade de conexões no protocolo TLS1.0 somente. Isso permite avaliar se a negociação conterá overhead desnecessário:

openssl s_server -4 -key localhost-key.pem -cert localhost-cert.pem -accept 8443 -state -msg -security_debug -nbio -tls1

Executamos o mesmo programa ADVPL anterior. Temos como resultado o sucesso na conexão. Observamos que houve apenas um ciclo de handshaking para o estabelecimento da conexão.

  • Configuração SSL/TLS carregada pela aplicação → linha 36:
    [INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1.0 (1), TLS1.1 (1), TLS1.2 (1)
  • Configuração SSL/TLS utilizada no processo de comunicação → linha 57:
    [INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (1), SSL3 (1), TLS1.0 (1), TLS1.1 (1), TLS1.2 (1)

  • Resultado da conexão → linha 73 e 74:
    [INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
    [INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

Abaixo o registro do console:

Log AppServer Full (client) vs OpenSSL TLS 1.0 (server)
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Dec 7 2017 - 13:54:58 NG
* Build: 32 bits
* DEBUG VERSION
* RPO Format: 32 bits
* SVN Revision: 10394 - 15899 - 1956
* Build Version: 0.0.0
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** DEBUG VERSION WITH CRASH DUMP HANDLER
*** DEBUG VERSION WITH SYMBOLS INFORMATION
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 6966.13 MB. Free 1059.46 MB.
Paging file ..... 16049.37 MB. Used 13714.11 MB. Free 2335.26 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 8960] APP Virtual Address Allocation Limit .... 4095.88MB.
[INFO ][SERVER] [Thread 7808] Crash Monitor BEGIN
[INFO ][SERVER] [Thread 8960] Memory Monitor Virtual Address LIMIT .... 4095.88MB.
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using SSL/TLS protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1.0 (1), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [11516]
[INFO ][SERVER] Application Main Thread .. [8960]
[INFO ][SERVER] [Thread 8960] Application Server started on port 8612
[08/12/2017 11:58:06] Server started.
[WARN ][SERVER] [Thread 11980] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 11:58:18] Starting Program U_GETSSL01 Thread 11980 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using TLS/SSL protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (1), SSL3 (1), TLS1.0 (1), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] SSL_connect:SSLv3 read server hello A
[INFO ][SSL] SSL_connect:SSLv3 read server certificate A
[INFO ][SSL] SSL_connect:SSLv3 read server key exchange A
[INFO ][SSL] SSL_connect:SSLv3 read server done A
[INFO ][SSL] SSL_connect:SSLv3 write client key exchange A
[INFO ][SSL] SSL_connect:SSLv3 write change cipher spec A
[INFO ][SSL] SSL_connect:SSLv3 write finished A
[INFO ][SSL] SSL_connect:SSLv3 flush data
[INFO ][SSL] SSL_connect:SSLv3 read finished A
[INFO ][SSL] SSL callback where:[32] ret:[1] state:[SSL negotiation finished successfully]
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.

Não podemos inferir pelo log do AppServer qual foi a versão do protocolo SSL/TLS estabelecida entre as partes. Podemos identificar qual o protocolo foi utilizado na conexão através do log da ferramenta OpensSSL. É possível verificar que a tratativa de conexão envolveu o TLS1.0:

Log OpenSSL TLS 1.0
SSL_accept:SSLv3/TLS read client key exchange
<<< ??? [length 0005]
 16 03 01 00 30
SSL_accept:SSLv3/TLS read change cipher spec
<<< TLS 1.0Handshake [length 0010], Finished
 14 00 00 0c 85 30 a2 97 0a 7f 8d fb 35 6e 9b 48
SSL_accept:SSLv3/TLS read finished
>>> ??? [length 0005]
 14 03 01 00 01
>>> TLS 1.0ChangeCipherSpec [length 0001]
 01
SSL_accept:SSLv3/TLS write change cipher spec
>>> ??? [length 0005]
 16 03 01 00 30
>>> TLS 1.0Handshake [length 0010], Finished
 14 00 00 0c 72 91 fa a4 c2 01 97 0c 88 7d 0f 86
SSL_accept:SSLv3/TLS write finished

2.3. Nova Implementação com Range Descontínuo

Como proposta experimental configuramos o AppServer com um range de versões do protocolo SSL/TLS para avaliar os problemas encontrados.

[SSLConfigure]
Verbose = 1
SSL2    = 1
SSL3    = 0
TLS1_0  = 0
TLS1_1  = 1
TLS1_2  = 1
Bugs    = 0
State   = 1

Iniciamos o simulador de servidor OpenSSL com a possiblildade de conexões no protocolo TLS1.1 somente.

openssl s_server -4 -key localhost-key.pem -cert localhost-cert.pem -accept 8443 -state -msg -security_debug -nbio -tls1_1

Executando o mesmo programa ADVPL vemos que a conexão não consegue ser estabelecida satisfatoriamente. Ainda que a versão do protocolo TLS 1.1 esteja corretamente configurada, o fato de haver uma descontinuidade faz com que a comunicação se atrapalhe quanto as funcionalidades habilitadas para o conjunto selecionado.

Segue o log para análise:

AppServer SSL2, TLS1.1 e TLS1.2 (client) vs OpenSSL TLS1.1 (server)
Windows Operating System version 6.1.7601 Service Pack 1
[DEBUG][SERVER] Command Line Arguments - BEGIN...
[DEBUG][SERVER] [console] -> []
[DEBUG][SERVER] Command Line Arguments - END.
[INFO ][SERVER] [Thread 10524] *** NOT USING SMARTHEAP
*** TOTVS S.A. ***
*** www.totvs.com.br ***
* TOTVS - Build 7.00.131227A - Dec 7 2017 - 13:54:58 NG
* Build: 32 bits
* DEBUG VERSION
* RPO Format: 32 bits
* SVN Revision: 10394 - 15899 - 1956
* Build Version: 0.0.0
'Ambiente de teste para comunicacao SSL/TLS' console mode.
Press Ctrl+Break to terminate.
*** DEBUG VERSION WITH CRASH DUMP HANDLER
*** DEBUG VERSION WITH SYMBOLS INFORMATION
*** STARTING SERVER WITH DEBUG OF USED MEMORY PER THREAD
*** STARTING SERVER WITH MAXIMUM STRING SIZE LIMIT SET TO 20 MB. ***
---------------- OS System Info -----------------------------------------------
OS Version .........: Windows 7 [Version 6.1.7601]
OS Platform ........: Windows NT Based (x64)
OS Version Info ....: Service Pack 1
-------------------------------------------------------------------------------
---------------- OS Memory Info -----------------------------------------------
Physical memory . 8025.59 MB. Used 5703.16 MB. Free 2322.43 MB.
Paging file ..... 16049.37 MB. Used 10246.11 MB. Free 5803.26 MB.
-------------------------------------------------------------------------------
[INFO ][SERVER] [Thread 10524] APP Virtual Address Allocation Limit .... 4095.88 MB.
[INFO ][SERVER] [Thread 10524] Memory Monitor Virtual Address LIMIT .... 4095.88 MB.
[INFO ][SERVER] [Thread 7552] Crash Monitor BEGIN
Http server is ready.
 Root path is c:\totvs\p12_windows_x86\protheus_data\web\
 Listening port 8888
[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using SSL/TLS protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] cert (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] [tSSLSocketAPI][SetCertificateFiles] key (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketAPI][Initialize] End handshake.
Https server is ready.
 Listening port 443 (default)
[INFO ][SERVER] Application PID ......... [9648]
[INFO ][SERVER] Application Main Thread .. [10524]
[INFO ][SERVER] [Thread 10524] Application Server started on port 8612
[08/12/2017 12:25:56] Server started.
[WARN ][SERVER] [Thread 10408] [GENERAL] INACTIVETIMEOUT = 99999 seconds is ON.
[INFO ][SERVER] [08/12/2017 12:28:54] Starting Program U_GETSSL01 Thread 10408 (rinaldo,TEC-CATROQUE)
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using TLS/SSL protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (1), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336040165
[ERROR][SSL] SSL description = error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure
[ERROR][SSL] Unable to send data. Error syscall.
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using TLS/SSL protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (1), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336040165
[ERROR][SSL] SSL description = error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure
[ERROR][SSL] Unable to send data. Error syscall.
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketClientAPI] Using TLS/SSL protocol.
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] KeyFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-key.pem)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] CertificateFile (C:\Totvs\P12_Windows_x86\Protheus_Data\certs\localhost\localhost-cert.pem)
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] SSL2 (1), SSL3 (0), TLS1.0 (0), TLS1.1 (1), TLS1.2 (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketClientAPI][Initialize] End handshake (1)
[INFO ][SSL] SSL callback where:[16] ret:[1] state:[before/connect initialization]
[INFO ][SSL] SSL_connect:before/connect initialization
[INFO ][SSL] SSL_connect:SSLv2/v3 write client hello A
[INFO ][SSL] [tSSLSocketAPI][Connect] Connecting SSL OK.
[ERROR][SSL] SSL erro = -1
[ERROR][SSL] SSL code = 336040165
[ERROR][SSL] SSL description = error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure
[ERROR][SSL] Unable to send data. Error syscall.

3. Conclusão

Foram realizados uma série de testes contextualizando o AppServer como servidor e cliente em conexões SSL/TLS, apesar deste estudo apenas demonstrar o contexto cliente da nova implementação. Todos testes mostraram-se satisfatórios em relação ao estabelecimento de conexão conforme os critérios estabelecidos na biblioteca LibSSL e informados anteriormente.

Um resumo dos elementos mais importantes apontados são:

3.1. Range de Protocolos

A habilitação de versões do protocolo SSL/TLS deve sempre especificar um menor e um maior grau de segurança, sendo que não deve haver descontinuidades entre a relação de protocolos. Ou seja, não é adimitido configurações na forma:

[SSLConfigure]
SSL2   = 1
SSL3   = 0   <- Erro
TLS1_0 = 0   <- Erro
TLS1_1 = 1
TLS1_2 = 1

Significa que esta configuração não funcionará? Não, significa que a construção da biblioteca de comunicação não tem como garantir a possibilidade de conexão frente a descontinuidade de range de protocolo. Os testes realizados envolveram toda cadeia de continuidade possível frente a servidores utilizando o protocolo TLS1.1 e TLS1.2. Também foram realizados testes com descontinuidades, alguns resultaram em sucesso outros em falhas ainda que sob habilitação do protocolo alvo do servidor.

3.2. Protocolos Recomendados

A configuração recomendada para aumentar o grau de confiança na comunicação é:

[SSLConfigure]
SSL2   = 0
SSL3   = 0
TLS1_0 = 0
TLS1_1 = 1
TLS1_2 = 1

3.3. TLS1 deprecated

A chave TLS1 é mantida em modo de compatibilidade. Caso novas chaves sejam encontradas teremos a supressão das configurações contidas no TLS1:

[SSLConfigure]
SSL2   = 1
SSL3   = 1
TLS1   = 3  <- apenas por compatibilidade
TLS1_0 = 1
TLS1_1 = 0
TLS1_2 = 0

Ao subir a aplicação encontramos a configuração co a ausência da versão TLS1.2 indicada na chave TLS1:

[INFO ][SSL] [tSSLSocketAPI][Initialize] starting handshake ..
[INFO ][SSL] [tSSLSocketAPI] Using SSL/TLS protocol.
[INFO ][SSL] SSL CIPHERS ALL
[INFO ][SSL] [tSSLSocketAPI][Initialize] Bugs (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] SSL2 (1), SSL3 (1), TLS1.0 (1), TLS1.1 (0), TLS1.2 (0)
[INFO ][SSL] [tSSLSocketAPI][Initialize] State (1)
[INFO ][SSL] [tSSLSocketAPI][Initialize] Setting Certificates

3.4. TryProtocol deprecated

Nâo há mais funcionalidade para a chave TryProtocols. Com a refatoração de alguns métodos de conexão a chave TryProtocols deixou de indicar explicitamente a necessidade de retentativas de conexões em outras versões do protocolo SSL/TLS. Isso implica em um custo menor no overhead gasto no estabelecimento de conexões, pois a própria implementação do protocolo negociará a versão de maior grau de segurança para conexão.

3.5. WSDLManager não Contemplado nas Alterações

Esta implementação não envolve a classe WSDLManager, que contém implementação própria do protocolo, restringindo ao uso do AppServer como servidor de conexão (WEBEX, HTTTPS) e as funções de acesso HTTPSGet, HTTPSPost.


Disponibilidade

O estudo foi realizado utilizando a versão do Application Server 13.1.3.25 e 13.2.3.25. As alterações propostas somente estarão disponíveis a partir da versão do Application Server 13.1.3.26 e 13.2.3.26.



  • No labels