Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS Saúde Planos

Linha de Produto:

Linha Datasul

Segmento:

Saúde

Módulo:

HAT - Atendimento ao Cliente

HAW - Autorizador Web

Função:

Manutenção de Guias

Solicitação de Exames

Solicitação de Internação

Consulta Beneficiários Intercambio

País:Brasil
Ticket:
Issue:




02. SITUAÇÃO/REQUISITO

As implementações descritas neste documento correspondem as adequações efetuadas no TOTVS Saúde Planos - Linha Datasul para atender ao PTU Online 9.0.

Link para o comunicado completo



03. SOLUÇÃO

Conforme descrito no comunicado acima, à partir de 03/05/2023 a Unimed Brasil não aceitará mais protocolos inferiores a TLS 1.2.

A atual versão padrão do Java utilizada pelo Foundation Saúde (6u18 ou 6u45) somente tem suporte a TLS 1.0.

Portanto, para atender à nova necessidade, o Foundation Saúde precisará passar a utilizar uma versão customizada do Java 6, com suporte para TLS 1.2, disponibilizada neste documento.


Esta atualização não depende de aplicação de patch do Datasul.

Apenas o Java deve ser atualizado.

Portanto, pode/deve ser realizada a qualquer momento, o quanto antes.

Recomenda-se atualizar no ambiente de protótipo, realizar as devidas validações e em seguida atualizar em Produção, sem a necessidade de esperar pela data de 03/05/2023, pois nesta data a Brasil apenas deixará de aceitar protocolos inferiores, mas desde já ela aceita o protocolo TLS 1.2.


PACOTES PARA DOWNLOAD

Baixe os pacotes de acordo com a versão do Java que você já utiliza (6u18 ou 6u45) e Sistema Operacional.

Obs: cada versão está separada em 4 arquivos. Basta baixar todos e descompactar o arquivo com extensão 001:


ATUALIZAÇÃO DO JAVA NO FOUNDATION SAÚDE

IMPORTANTE

  • Antes de qualquer alteração, recomenda-se realizar backup, tanto da instalação atual do Java como do Jboss do Foundation Saúde.
  • Recomenda-se instalar a nova versão sem sobrepor a anterior. Isso simplificará a gestão e os esforços caso seja necessário retornar à versão anterior.


  1. Baixar os arquivos do Java nos links acima, de acordo com seu Sistema Operacional.

  2. Descompactar no mesmo local onde já se encontra a versão anterior do seu Java, sem sobrepor arquivos. A sugestão do exemplo é apenas para manter os padrões:
    • Se já existe c:\java\jdk1.6.0_18, então descompacte em c:\java\jdk1.6.0_18_TLS1.2
    • Se já existe /usr/java/jdk1.6.0_18, então descompacte em /usr/java/jdk1.6.0_18_TLS1.2

  3. Após realizar backup do Jboss do Foundation Saúde, atualizar seu script de carga do Jboss do Foundation Saúde para considerar a nova versão do Java.
    • Normalmente isso é tratado nos scripts com a variável de ambiente JAVA_HOME e/ou JAVA.

  4. No arquivo de start/configurações do seu Jboss (normalmente run.bat, run.sh ou run.conf), que se encontra na pasta bin do Jboss:
    • Caso exista, eliminar o parâmetro abaixo, que indica restrição de TLS 1.0. Ao remover este parâmetro, a tomada de decisão sobre a versão de TLS passa a ser feita automaticamente pelo Java.
      • -Dhttps.protocols=TLSv1

  5. No arquivo run.conf que se encontra na pasta bin do Jboss:
    • Acrescentar o parâmetro -Dorg.bouncycastle.jsse.client.assumeOriginalHostName=true no JAVA_OPTS. Ex:
      • JAVA_OPTS="-Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.bouncycastle.jsse.client.assumeOriginalHostName=true"

  6. Após concluir as alterações acima e reiniciar o Jboss do Foundation Saúde, o mesmo estará recebendo e enviando mensagens utilizando o protocolo TLS 1.2.



A solução descrita acima atendeu a maioria dos cenários de clientes onde já auxiliamos na atualização.

Alguns cenários diferentes podem ser observados, de acordo com questões particulares do ambiente de cada cliente, como Firewall, Proxy Reverso, Certificados, demais configurações de segurança, etc.

Caso o seu cenário apresente problemas, recomenda-se avaliar as soluções de contorno abaixo e/ou acionar consultoria.






04. SOLUÇÕES DE CONTORNO

ERRO DE SSL

Se após atualizar o java do Foundation Saúde o seu ambiente apresentar mensagens semelhantes a estas, seja no envio (Unimed > Brasil) ou recebimento (Brasil > Unimed):

  • Exception getting SSL attributes
  • Renegotiation not supported

Pode ser necessário alterar estas configurações:

  • Na nova instalação do Java 6, arquivo .../jre/lib/security/java.security:
    • atributo ssl.KeyManagerFactory.algorithm → alterar de SunX509 para PKIX
    • adicionar o atributo jdk.tls.disabledAlgorithms= SSLv2Hello, SSLv3, TLSv1, TLSV1.1

  • No Jboss do Foundation Saúde, arquivo bin/run.conf:
    • diferente da orientação anterior, onde foi indicado para retirar o parâmetro -Dhttps.protocols=TLSv1, fazer o contrário: mantê-lo forçando o protocolo 1.2:
      • JAVA_OPTS="${JAVA_OPTS} -Dhttps.protocols=TLSv1.2"




NECESSIDADE DE CRIAR A NOVA INSTÂNCIA DO FOUNDATION SAÚDE

Caso a nova versão do Java com TLS 1.2 gere conflitos de comunicação nas mensagens de entrada (sentido Brasil > Unimed), ou se o cliente optar por isolar uma instância do Jboss para ficar dedicada apenas a recebimento e outra para envio de mensagens para a Brasil, as orientações abaixo podem ser utilizadas para criar uma nova instância apartada do Jboss.

Como criar a nova instância do Foundation Saúde

Existem duas formas para a criação da nova instância do Foundation Saúde:

  1. Clonar a VM do seu Foundation Saúde, e utilizar a nova com TLS 1.2 para envio de mensagens à Unimed Brasil
    • Menor complexidade no ajuste de arquivos de configuração
    • Maior consumo de recursos de hardware

  2. Criar uma cópia do seu Foundation Saúde na mesma VM, e configurar a nova com TLS 1.2
    • Maior complexidade no ajuste de arquivos de configuração
    • Menor consumo de recursos de hardware


Pontos de atenção para criar a nova instância do Foundation Saúde na mesma VM

Resumo: será feita uma cópia completa do Jboss já existente. Em seguida alguns arquivos serão alterados na nova versão.

  1. Derrubar o serviço Jboss do Foundation Saúde já existente. Ele precisa estar fora do ar para poder ser copiado corretamente.

  2. Limpar as pastas temporárias (log, temp, work e data) da instância, isso vai reduzir o tamanho e tempo da cópia. Ex:


  3. Fazer uma cópia da pasta inteira do Jboss. Novo nome sugerido, seguindo o padrão do exemplo: C:\totvs\foundation-saude\jboss-4.2.3.GA_TLS1.2.

  4. Carregar novamente o serviço do Foundation Saúde já existente.

    A partir deste ponto, vamos configurar a nova cópia do Jboss do Foundation Saúde para trabalhar com TLS 1.2:

  5. Arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA_TLS1.2\bin\run.bat (ou run.sh):
    1. Alterar para passar a considerar a nova versão do Java, instalada no passo anterior:
      • Antes: set JAVA=C:\Java\jdk1.6.0_18\bin\java
      • Depois: set JAVA=C:\Java\jdk1.6.0_18_TLS1.2\bin\java
      • Obs: se a sua instalação não possui a linha acima, possivelmente está utilizando a variável de ambiente JAVA_HOME. Neste caso, declare a mesma no início do script apontando para a nova instalação do Java com TLS 1.2, mas não altere sua variável do sistema operacional, para não afetar seu Foundation Saúde já existente. Ex:
        • Windows: 
          • set JAVA_HOME=C:\Java\jdk1.6.0_18_TLS1.2
        • Linux:
          • JAVA_HOME=C:\Java\jdk1.6.0_18_TLS1.2
          • export JAVA_HOME

    2. Ajuste da nova localização da instância:
      • Antes: set JAVA_OPTS=%JAVA_OPTS% -Ddatasul.framework.properties.dir=C:\totvs\foundation-saude\jboss-4.2.3.GA\server\default\conf
      • Depois: set JAVA_OPTS=%JAVA_OPTS% -Ddatasul.framework.properties.dir=C:\totvs\foundation-saude\jboss-4.2.3.GA_TLS1.2\server\default\conf

    3. Retirar restrição da versão do TLS:
      • Se existir, retirar esta propriedade: -Dhttps.protocols=TLSv1

  6. Arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA_TLS1.2\bin\run.conf:
    1. Acrescentar o parâmetro -Dorg.bouncycastle.jsse.client.assumeOriginalHostName=true no JAVA_OPTS. Ex:
      • JAVA_OPTS="-Xms128m -Xmx512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.bouncycastle.jsse.client.assumeOriginalHostName=true"

  7. A partir deste ponto vamos alterar portas em arquivos de configuração, que precisam estar livres. É fundamental que o seu Foundation Saúde atual esteja no ar para testar as novas portas, garantindo que não haverão conflitos. Dica para verificar se uma porta está livre:
    • Windows (cmd):
      • netstat -ona | findstr <nr_porta>
    • Linux (shell):
      • netstat -ona | grep <nr_porta>
    • Se os comandos acima não tiverem retorno, a porta está livre e pode ser utilizada.

  8. Arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA_TLS1.2\server\default\conf\jboss-service.xml:
    • Dica para identificar os pontos a serem alterados: procurar por port":



      • Anote o número da porta acima (no exemplo 21099). Será necessário atualizar no bin/service.bat (explicado a seguir).







  9. Arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA\server\default\deploy\ejb3.deployer\META-INF\jboss-service.xml:


  10. Arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA\server\default\deploy\jboss-web.deployer\server.xml:

    • Anote o número da porta acima (no exemplo, 28080): Esta será a porta para acesso http.
      Será necessário atualizar também no bin/service.bat (explicado a seguir).


    • Anote o número da porta acima (no exemplo, 443): Está será a porta para acesso https.
      Além da porta, ajustar o caminho correto do keystore na nova instância.



  11. Arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA\server\default\deploy\properties-service.xml:

    • Ajustar o caminho correto do keystore na nova instância.

  12. Se você utiliza o arquivo C:\totvs\foundation-saude\jboss-4.2.3.GA_TLS1.2\bin\service.bat para instalar o Jboss do Foundation Saúde como Serviço no Windows, atenção para estes ajustes ANTES de instalar o novo serviço:

    • SVCNAME: utilize um nome de serviço para distinguir a nova versão da antiga. Sugerido: adicionar -TLS1.2 ao final.
      SVCDISP: utilize um display name para fácil distinção dos serviços.
      SVCDESC: texto livre, onde podem ser adicionadas informações úteis, como as novas portas para acesso http e https. No exemplo acima, a porta http foi alterada de 28080 na instância antiga para 28090 na nova; a porta https é mudou de 443 na antiga para 9443 na nova.

    • Nos pontos onde é tratado o arquivo r-<porta>.lock, ajustar para a nova porta http (no exemplo, mudou de 28080 para 28090):


    • Nos pontos em que é tratado o shutdown do serviço, ajuste para a nova porta do NamingService (item 8 acima). No exemplo, mudou de 21099 para 29099.


  13. Após concluir estes ajustes, pode ser usada a instrução service.bat install para que o Jboss do novo Foundation Saúde seja instalado como serviço do Windows.


  14. Após todas as configurações acima, por último é necessário modificar configuração da URL para a nova porta nos sistemas, onde no exemplo acima o http foi alterada de 28080 na instância antiga para 28090 na nova.

    Ajustar no cadastro da área de ação na Administração do Sistema > Tabelas Básicas > Plano de Saúde a nova URL, atentando-se para a nova porta de acesso:





PROXY REVERSO SEM ALTERAÇÃO DO JAVA

Esta é uma solução utilizando Proxy Reverso para as mensagens de saída (Unimed → Brasil), sem a necessidade de atualização da versão do Java 6 original.


Resumo

Esta solução utiliza Nginx para o Proxy.

O caminho do arquivo de configuração pode variar de acordo com o ambiente. No exemplo temos um arquivo chamado ptu.conf dentro da pasta: /etc/nginx/conf.d/


Na Parte 1 temos um exemplo da configuração do Nginx.

Feita esta configuração pode-se testar acessando um endereço com o comando abaixo (ajustando a porta e o endereço conforme foi colocado no arquivo):


curl http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/comunicacaoInternacaoAlta


O retorno esperado é:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>No binding operation info while invoking unknown method with params unknown.</faultstring></soap:Fault></soap:Body></soap:Envelope>


Isto indica que está funcionando a “conversa” entre o proxy reverso e a Unimed Brasil, caso o retorno seja outro é necessário revisar a configuração.


Na Parte 2 temos um exemplo da alteração de configuração necessária para o Foundation Saúde utilizar o Proxy Reverso nas mensagens de saída.

Dentro da pasta conf do jboss do ptu temos o arquivo foundation-exchange.properties.

Nele é necessário alterar para que as requisições sejam feitas para o proxy reverso ao invés de enviar para a Unimed Brasil.

Após isto é necessário reiniciar o jboss, se o teste do curl funcionou, a configuração vai funcionar.



Parte 1 - configuração Nginx

server {
   #adicionar o IP do servidor onde está o nginx e a porta, exemplo 192.168.0.50
   listen      x.x.x.x:80;

   #Adicionar o endereço que será usado para chegar até o ptu
   server_name enderecoptu.unimed.com.br;
   return      301 https://$server_name$request_uri;
}

server {
   #Alterar pelo IP do jboss do PTU, caso ncessário alterar a porta de 443 para a que está sendo usada
   listen x.x.x.x:443 ssl;

   #Adicionar o endereço que será usado para chegar até o ptu
   server_name enderecoptu.unimed.com.br;

   proxy_ssl_server_name on;

   #colocar aqui o caminho do arquivo certificado crt da unimed
   ssl_certificate /certificado/certificado-unimed.crt;

   #colocar aqui o caminho do arquivo da chave do certificado da unimed
   ssl_certificate_key /opt/certificad-unimed.key;

   #colocar aqui o certificado recebido da unimed brasil
   ssl_client_certificate /opt/certificado-unimed-brasil.pem;
   ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

   ssl_verify_client off;
   ssl_prefer_server_ciphers on;
   proxy_headers_hash_max_size 512;
   proxy_headers_hash_bucket_size 128;

   #caminho dos logs
   error_log /var/log/nginx/ptu.error.log;
   access_log /var/log/nginx/ptu.access.log;

   location / {
      proxy_set_header X-Real-IP                         $remote_addr;
      proxy_set_header X-Forwarded-For            $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto         https;
      proxy_set_header X-Forwarded-Host          $http_host;
      proxy_set_header Host                                $http_host;

      #colocar aqui o endereco IP HTTP do jboss do ptu, colocar a porta se necessário, exemplo: 192.168.0.50:8443
      proxy_pass                                                  http://x.x.x.x;
   }

   location /htz-foundation {
      #colocar aqui o certificado recebido da unimed brasil nos formatos do exemplo
      proxy_ssl_certificate                                  /opt/certificado-unimed-brasil.pem;
      proxy_ssl_certificate_key                           /opt/certificado-unimed-brasil.key;
      proxy_set_header X-SSL-CERT                  /opt/certificado-unimed-brasil.pem;
      proxy_set_header X-Real-IP                      $remote_addr;
      proxy_set_header X-Forwarded-Host       $http_host;
      proxy_set_header Host                             $http_host;
      proxy_ssl_verify                                         off;
      proxy_ssl_verify_depth                              2;

      #Adicionar o endereço https do jboss do ptu, colocar a porta se necessário, exemplo: 192.168.0.50:8443
      proxy_pass                                 https://x.x.x.x;
      proxy_ssl_ciphers                       HIGH:!DH;
   }
}

server {
   #Porta que será em que este serviço será disponibilizado, a porta pode ser qualquer uma livre
   listen   localhost:9999;

   #caminho dos logs
   error_log /var/log/nginx/ptup-unimedcoop-error.log;
   access_log /var/log/nginx/ptup-unimedcoop-access.log;

   #Endereço da aplicação, neste caso é localhost porque o jboss esta no mesmo servidor do jboss
   server_name  localhost;

   # Certificado do proxy (PTU -> Nginx)
   ssl_certificate /opt/certificad-unimed.crt;
   ssl_certificate_key /opt/certificad-unimed.key;
   proxy_ssl_certificate /opt/certificado-unimed-brasil.pem;
   proxy_ssl_certificate_key /opt/certificado-unimed-brasil.key;

   # Protocolos aceitos pelo proxy (PTU -> Nginx)
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
   proxy_ssl_ciphers             HIGH:!aNULL:!MD5;

   #Aqui é forçado o envio usando TLS 1.2
   proxy_ssl_protocols TLSv1.2;

   proxy_ssl_verify_depth 2;
   proxy_ssl_server_name on;

   # Enviar as requisições recebidas para o Foundation
   location / {
      #Url da unimed do brasil de produção, protótipo é https://wsdapihml.unimed.coop.br;
      proxy_pass https://wsdapi.unimed.coop.br;
   }
}



Parte 2 - foundation-exchange.properties

Lembrar de alterar o endereço http://localhost:9999 pelo endereço que foi colocado na configuração do Nginx, destacado em vermelho na parte 1.

 

#Versao 9000 - PTU ONLINE 9.0 - ENDPOINT TLS 1.2

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.RespostaAuditoria.ENDPOINT                                                   = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/RespostaAuditoria

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.PedidoAutorizacao.ENDPOINT                                                   = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/PedidoAutorizacao

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.PedidoComplementoAutorizacao.ENDPOINT                         = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/PedidoComplementoAutorizacao

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.OrdemServico.ENDPOINT                                                        = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/OrdemServico

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.ConsultaDadosPrestador.ENDPOINT                                              = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/ConsultaDadosPrestador

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.Cancelamento.ENDPOINT                                                        = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/Cancelamento

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.PedidoInsistencia.ENDPOINT                                                   = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/PedidoInsistencia

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.ConsultaDadosBeneficiario.ENDPOINT                                           = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/ConsultaDadosBeneficiario

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.RequisicaoContagemBeneficiarios.ENDPOINT                      = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/RequisicaoContagemBeneficiarios

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.StatusTransacao.ENDPOINT                                                     = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/StatusTransacao

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.comunicacaoDecursoPrazo.ENDPOINT                              = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/ComunicacaoDecursoPrazo

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.autorizacaoOrdemServico.ENDPOINT                                             = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/AutorizacaoOrdemServico

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.ConsultaA1100.ENDPOINT                                                       = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/ConsultaA1100

com.totvs.foundation.exchange.connector.ptu.implementation.v9000.DefaultExternalConnector.comunicacaoInternacaoAlta.ENDPOINT                            = http://localhost:9999/wsdintercambio/intercambioservices/ptu_V90_00/comunicacaoInternacaoAlta 



05. WEBINAR

Em 20/04/2023 realizamos um Webinar para todos os clientes, para esclarecimentos sobre o assunto.

A gravação está neste link: 

https://totvs.zoom.us/rec/share/Xd-gJj6zWdD8KmnonPK4DrAOj0n2QsUJGjK15DrKQcrlW6jK-bB8Axytv1r29PMZ.joz1lGTkUicNU3br?startTime=1682010562000

Senha: 9SJCff0$