Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 3 Próxima »

Nesse artigo descreveremos informações sobre as principais métricas disponíveis no TOTVS | Application Server.


Essa documentação descreverá todas as métricas disponíveis em cada versão conforme a API receba melhorias e expansão.

Disponibilidade

Cada versão do Application Server terá suporte apenas a versão mais atualizada da API de métricas.

1. O que são Métricas?

1.1. Definição

O TOTVS | Application Server disponibiliza diversas informações que podem ser utilizadas para diagnóstico e monitoramento do ambiente. Essas informações são coletadas através das métricas e são exportadas no formato Json fornecendo fácil integração com outras aplicações.

1.2. Versionamento

Visando expansão futura, as métricas estão agrupadas por versões. Cada versão suportará todas as métricas descritas nas versões anteriores.

Cada versão do TOTVS | Application Server dará suporte apenas a um versão das métricas, sendo sempre a mais recente contemplada.

Na tabela abaixo é possível verificar as versões disponíveis nos builds do TOTVS | Application Server

Application ServerAPI de Métricas
19.3.0.xx Versão 0 

Protocolos SSL/TLS

A versão da API das Métricas também está disponível no Json e é enviada em conjunto com as métricas quando a consulta é realizada.

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.



  • Sem rótulos