O SIAFI – Sistema Integrado de Administração Financeira do Governo Federal é um Sistema de teleinformática criado para promover a modernização e a integração dos sistemas de acompanhamento e controle da execução orçamentária, financeira e patrimonial do Governo Federal de forma integrada, objetivando minimizar custos, e dar eficiência e eficácia na gestão dos recursos alocados na Lei Orçamentária Anual - LOA.
Link para Acesso ao STA - Sistema de Transferência de Arquivos
Para entender a metodologia de segurança utilizada na disponibilização dos serviços do SIAFI serão introduzidos alguns conceitos importantes.
A criptografia, considerada como a ciência e a arte de escrever mensagens em forma cifrada ou em código, é um dos principais mecanismos de segurança que pode ser usado para proteção contra os riscos associados ao uso da Internet.
Atualmente, a criptografia já está integrada ou pode ser facilmente adicionada à grande maioria dos sistemas operacionais e aplicativos e para usá-la, muitas vezes, basta a realização de algumas configurações ou cliques de mouse.
De acordo com o tipo de chave usada, os métodos criptográficos podem ser subdivididos em duas grandes categorias: criptografia de chave simétrica e criptografia de chaves assimétricas.
Criptografia de chave simétrica: também chamada de criptografia de chave secreta ou única, utiliza uma mesma chave tanto para codificar como para decodificar informações, sendo usada principalmente para garantir a confidencialidade dos dados. Casos nos quais a informação é codificada e decodificada por uma mesma pessoa não há necessidade de compartilhamento da chave secreta. Entretanto, quando estas operações envolvem pessoas ou equipamentos diferentes, é necessário que a chave secreta seja previamente combinada por meio de um canal de comunicação seguro (para não comprometer a confidencialidade da chave). Exemplos de métodos criptográficos que usam chave simétrica são: AES, Blowfish, RC4, 3DES e IDEA.
Criptografia de chaves assimétricas: também conhecida como criptografia de chave pública, utiliza duas chaves distintas: uma pública, que pode ser livremente divulgada, e uma privada, que deve ser mantida em segredo por seu dono. Quando uma informação é codificada com uma das chaves, somente a outra chave do par pode decodificá-la. Qual chave usar para codificar depende da proteção que se deseja, se confidencialidade ou autenticação, integridade e não-repúdio. A chave privada pode ser armazenada de diferentes maneiras, como um arquivo no computador, um smartcard ou um token. Exemplos de métodos criptográficos que usam chaves assimétricas são: RSA, DSA, ECC e Diffie-Hellman. A criptografia de chave simétrica, quando comparada com a de chaves assimétricas, é a mais indicada para garantir a confidencialidade de grandes volumes de dados, pois seu processamento é mais rápido. Todavia, quando usada para o compartilhamento de informações, se torna complexa e pouco escalável, em virtude da:
A criptografia de chaves assimétricas, apesar de possuir um processamento mais lento que a de chave simétrica, resolve estes problemas visto que facilita o gerenciamento (pois não requer que se mantenha uma chave secreta com cada um que desejar se comunicar) e dispensa a necessidade de um canal de comunicação seguro para o compartilhamento de chaves.
Para aproveitar as vantagens de cada um destes métodos, o ideal é o uso combinado de ambos, onde a criptografia de chave simétrica é usada para a codificação da informação e a criptografia de chaves assimétricas é utilizada para o compartilhamento da chave secreta (neste caso, também chamada de chave de sessão). Este uso combinado é o que é utilizado pelos navegadores Web e programas leitores de e-mails. Exemplos de uso deste método combinado são: SSL, PGP e S/MIME.
Uma função de resumo é um método criptográfico que, quando aplicado sobre uma informação, independente do tamanho que ela tenha, gera um resultado único e de tamanho fixo, chamado hash1.
Você pode utilizar hash para:
Para verificar a integridade de um arquivo, por exemplo, você pode calcular o hash dele e, quando julgar necessário, gerar novamente este valor. Se os dois hashes forem iguais então você pode concluir que o arquivo não foi alterado. Caso contrário, este pode ser um forte indício de que o arquivo esteja corrompido ou que foi modificado. Exemplos de métodos de hash são: SHA-1, SHA-256 e MD5.
[1] O hash é gerado de tal forma que não é possível realizar o processamento inverso para se obter a informação original e que qualquer alteração na informação original produzirá um hash distinto. Apesar de ser teoricamente possível que informações diferentes gerem hashes iguais, a probabilidade disto ocorrer é bastante baixa.
A assinatura digital permite comprovar a autenticidade e a integridade de uma informação, ou seja, que ela foi realmente gerada por quem diz ter feito isto e que ela não foi alterada.
A assinatura digital baseia-se no fato de que apenas o dono conhece a chave privada e que, se ela foi usada para codificar uma informação, então apenas seu dono poderia ter feito isto. A verificação da assinatura é feita com o uso da chave pública, pois se o texto foi codificado com a chave privada, somente a chave pública correspondente pode decodificá-lo.
Para contornar a baixa eficiência característica da criptografia de chaves assimétricas, a codificação é feita sobre o hash e não sobre o conteúdo em si, pois é mais rápido codificar o hash (que possui tamanho fixo e reduzido) do que a informação toda.
Como dito anteriormente, a chave púbica pode ser livremente divulgada. Entretanto, se não houver como comprovar a quem ela pertence, pode ocorrer de você se comunicar, de forma cifrada, diretamente com um impostor.
Um impostor pode criar uma chave pública falsa para um amigo seu e enviá-la para você ou disponibilizá-la em um repositório. Ao usá-la para codificar uma informação para o seu amigo, você estará, na verdade, codificando-a para o impostor, que possui a chave privada correspondente e conseguirá decodificar. Uma das formas de impedir que isto ocorra é pelo uso de certificados digitais.
O certificado digital é um registro eletrônico composto por um conjunto de dados que distingue uma entidade e associa a ela uma chave pública. Ele pode ser emitido para pessoas, empresas, equipamentos ou serviços na rede (por exemplo, um site Web) e pode ser homologado para diferentes usos, como confidencialidade e assinatura digital.
Um certificado digital pode ser comparado a um documento de identidade, por exemplo, o seu passaporte, no qual constam os seus dados pessoais e a identificação de quem o emitiu. No caso do passaporte, a entidade responsável pela emissão e pela veracidade dos dados é a Polícia Federal. No caso do certificado digital esta entidade é uma Autoridade Certificadora (AC).
Uma AC emissora é também responsável por publicar informações sobre certificados que não são mais confiáveis. Sempre que a AC descobre ou é informada que um certificado não é mais confiável, ela o inclui em uma “lista negra”, chamada de “Lista de Certificados Revogados” (LCR) para que os usuários possam tomar conhecimento. A LCR é um arquivo eletrônico publicado periodicamente pela AC, contendo o número de série dos certificados que não são mais válidos e a data de revogação.
O certificado digital de uma AC é emitido, geralmente, por outra AC, estabelecendo uma hierarquia conhecida como “cadeia de certificados” ou “caminho de certificação”, conforme ilustrado na Figura a seguir. A AC raiz, primeira autoridade da cadeia, é a âncora de confiança para toda a hierarquia e, por não existir outra AC acima dela, possui um certificado autoassinado (mais detalhes a seguir). Os certificados das ACs raízes publicamente reconhecidas já vêm inclusos, por padrão, em grande parte dos sistemas operacionais e navegadores e são atualizados juntamente com os próprios sistemas. Alguns exemplos de atualizações realizadas na base de certificados dos navegadores são: inclusão de novas ACs, renovação de certificados vencidos e exclusão de ACs não mais confiáveis.
Alguns tipos especiais de certificado digital que você pode encontrar são:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.KeyStore; import java.security.MessageDigest; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLException; import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; /** * Classe utilizada para gerar o KeyStore do Servidor do Novo SIAFI que está disponibilizando o Serviço * */ public class SiafiBuildCacerts { private static final String JSSECACERTS = "cacerts"; private static final int TIMEOUT_WS = 60; public static void main(String[] args) { try { /** * Endereço do WebService. * O Endereço abaixo é do Servidor que disponibiliza o serviço */ String enderecoWebService = "homservicos-siafi.tesouro.gov.br"; File cacertsFile = gerarCacerts(enderecoWebService, 443); if (cacertsFile != null) { info("| Cacerts gerado em: " + cacertsFile.getAbsolutePath()); } } catch (Exception e) { error(e.toString()); } } public static File gerarCacerts(String host, int port) throws Exception { char[] passphrase = "changeit".toCharArray(); File file = new File(JSSECACERTS); if (file.isFile() == false) { char SEP = File.separatorChar; File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security"); file = new File(dir, JSSECACERTS); if (file.isFile() == false) { file = new File(dir, "cacerts"); } } info("| Loading KeyStore " + file + "..."); InputStream in = new FileInputStream(file); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(in, passphrase); in.close(); SSLContext context = SSLContext.getInstance("TLS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ks); X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0]; SavingTrustManager tm = new SavingTrustManager(defaultTrustManager); context.init(null, new TrustManager[] { tm }, null); SSLSocketFactory factory = context.getSocketFactory(); info("| Abrindo conexão com " + host + ":" + port + "..."); SSLSocket socket = (SSLSocket) factory.createSocket(host, port); socket.setSoTimeout(TIMEOUT_WS * 1000); try { info("| Iniciando handshake SSL ..."); socket.startHandshake(); socket.close(); info("| Sem erros, certificado já é confiável"); } catch (SSLHandshakeException e) { /** * PKIX path building failed: * sun.security.provider.certpath.SunCertPathBuilderException: * unable to find valid certification path to requested target * Não tratado, pois sempre ocorre essa exceção quando o cacerts * nao esta gerado. */ } catch (SSLException e) { error("| " + e.toString()); } X509Certificate[] chain = tm.chain; if (chain == null) { info("| Não foi possível obter a cadeia de certificados do servidor"); return null; } info("| Enviando ao servidor " + chain.length + " certificado(s):"); MessageDigest sha1 = MessageDigest.getInstance("SHA1"); MessageDigest md5 = MessageDigest.getInstance("MD5"); for (int i = 0; i < chain.length; i++) { X509Certificate cert = chain[i]; sha1.update(cert.getEncoded()); md5.update(cert.getEncoded()); String alias = host + "-" + (i); ks.setCertificateEntry(alias, cert); info("| Adicionando certificado para keystore '" + JSSECACERTS + "' usando o apelido '" + alias + "'"); } File cafile = new File(JSSECACERTS); OutputStream out = new FileOutputStream(cafile); ks.store(out, passphrase); out.close(); return cafile; } private static class SavingTrustManager implements X509TrustManager { private final X509TrustManager tm; private X509Certificate[] chain; SavingTrustManager(X509TrustManager tm) { this.tm = tm; } public X509Certificate[] getAcceptedIssuers() { throw new UnsupportedOperationException(); } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { throw new UnsupportedOperationException(); } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { this.chain = chain; tm.checkServerTrusted(chain, authType); } } private static void info(String info) { System.out.println("INFO: " + info); } private static void error(String error) { System.out.println("ERROR: " + error); } }
public class CriptoSIAFI { public static void main(String[] args) throws IOException, KeyManagementException, NoSuchAlgorithmException { String local = "local onde está armazenado o carcerts"; //O arquivo .pfx é gerado através da documetação contida em: //https://www.tesouro.fazenda.gov.br/novo-siafi/informacoes-tecnicas/formas-de-integracao/699-certificado-digital-homologacao System.setProperty("javax.net.ssl.keyStoreType", "PKCS12"); System.setProperty("javax.net.ssl.keyStore", local +"homologacao.pfx"); System.setProperty("javax.net.ssl.keyStorePassword", senha na qual foi gerado a chave privada); //Chave Pública do Servidor do Novo SIAFI System.setProperty("javax.net.ssl.trustStoreType", "JKS"); //Para gerar o cacerts foi utilizado a classe SiafiBuildCacerts //O cacerts é a keystore do Servidor do Novo SIAFI System.setProperty("javax.net.ssl.trustStore", local+"cacerts"); String urlServico = "https://homservicos-siafi.tesouro.gov.br/siafi2013he/services/cpr/manterContasPagarReceber?wsdl"; URL urlC = new URL(urlServico); HttpsURLConnection connection = (HttpsURLConnection) urlC.openConnection(); BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); String linha = null; while((linha = input.readLine()) != null){ System.out.println(linha); } } }
Contato para auxiliar entendimento do que deve ser extraído do SIAFI Marli – MJ : Marli.lehrer@mj.gov.br / 61 2025-3853 Rodrigues – DPRF: erinaldo.rodrigues@dprf.gov.br / 61 3448-7718 Gladston – DPF : gladston.ggm@dpf.gov.br / 61 2024-8457
SERPRO Fone: 0800-9782329
Antônio Barros / Deuto - SERPRO Natal/RN Fone: 84 3201-1477 / 84 3201-1361
Nazaré Lopes Bretas E-mail: nazare.bretas@planejamento.gov.br
Maria Betânia Gonçalves Xavier Coordenadora-Geral de Sistemas e TI da Secretaria do Tesouro Nacional Fone: 61 3412-3912 Fax: 61 3412-1462 E-mail: maria-betania.xavier@fazenda.gov.br
Heloisa Macedo Informações sobre o STA - Sistema de Transferência de Arquivos do Siafi e Extrator de Dados. Fone: 61 3412-3928 E-mail: heloisa.macedo@fazenda.gov.br
Mônica Pacheco Dúvidas sobre SIAFI e STA Email: monica.pacheco@fazenda.gov.br, servicedesk.stn@fazenda.gov.br
Pedro / Soares Informações sobre o STA - Sistema de Transferência de Arquivos do Siafi e Extrator de Dados. Fone: 61 3412-3929 / 61 3412-3957
Guilherme Clemente Kilson (Contato Antigo)
Informações sobre o STA - Sistema de Transferência de Arquivos do Siafi e Extrator de Dados.
Fone: 61 3412-3983
E-mail: guilherme.kilson@fazenda.gov.br
Heron Alves Moreira (Contato Antigo)
Informações sobre o STA - Sistema de Transferência de Arquivos do Siafi e Extrator de Dados.
Fone: 61 3412-1628
E-mail: heron.moreira@fazenda.gov.br
GEATE/COSIS - Gerência de Suporte ao Usuário e Coordenação-Geral de Sistemas e Tecnologia da Informação E-mail: geate.cosis.df.stn@fazenda.gov.br
Fábio Alexandre de Araújo Lima Gerente de Relacionamento Secretaria do Tesouro Nacional - MF/STN/COSIS/GEREL Fone: 61 3412-3944 / 61 8117-0843 E-mail: fabio-alexandre.lima@fazenda.gov.br
Vânia Secretaria do Tesouro Nacional Fone: 61 3412-3927
Yuri Fontes de Oliveira
Gerência de Gestão Corporativa / DSI / SLTI Ministério do Planejamento, Orçamento e Gestão E-mail: yuri.oliveira@planejamento.gov.br
Marciana Moura
Analista de Finanças e Controle STN/COSIS/GEDES (61) 3412-3053 E-mail: marciana.leal@fazenda.gov.br
Breve Explicação sobre Importação e Exportação de Dados do SIAFI
O MANUAL WEB - SIAFI é um documento que registra, de forma estruturada e sistemática, as normas e procedimentos operacionais do SIAFI, do ponto de vista do usuário.
Data | Remetente | Contato | Descrição |
---|---|---|---|
10/07/2009 | Heloísa | Heloísa retornou o email | Retornou o e-mail com os arquivos de 'Programa de Trabalho Resumido' e 'Plano Interno' em anexo. |
09/07/2009 | Marcelo Feijó | Heloísa | Informando que continuamos com problemas na geração dos arquivos 'Plano Interno' e 'Programa de Trabalho Resumido - PTRES'. Foi perguntado também sobre a possibilidade deles nos envirarem estes arquivos para nós podermos dar continuidade à integração. |
29/06/2009 | Heloísa | Heloísa retornou o email | Repasso a você as informações que obtive do Soares: “Os registros de Elementos de Despesa podem ser obtidos a partir das contas contábeis de “Despesa”, isto é, contas iniciadas pelo algarismo “3”. Realmente o código da conta está no campo “GR-CODIGO-CONTA”. |
29/06/2009 | Heloísa | Heloísa retornou o email | Informando que encaminhou para o setor responsável no SERPRO o erro relacionado ao tamanho dos arquivos, entre outros que a gente enviou durante a semana. Assim que obtiverem alguma resposta, nos informarão. |
26/06/2009 | Heloísa | Heloísa retornou o email | Segundo informações do Soares, dependendo do tamanho do arquivo realmente não pode ser solicitado o envio para o e-mail, devendo alterar para Portal On line e depois acessar via STA - download. |
26/06/2009 | Marcelo Feijó | Envio de email para Heloísa (heloisa.macedo@fazenda.gov.br) | Informando que o cadastro da extração de Empenho para receber por e-mail também apresentou a mensagem “O arquivo Empenho - NE não foi gerado on-line porque EXCEDEU O LIMITE DE KBYTES ONLINE Extração não será mais enviada para e-mail(s): marcelohbfeijo@gmail.com”. |
25/06/2009 | Heloísa | Heloísa retornou o email | Informando que encaminharam as telas enviadas para análise, e disse que realmente está parecendo que houve erro no STA, assim que tiverem um posicionamento entrarão em contato com a gente. |
25/06/2009 | Marcelo Feijó | Envio de email para Heloísa (heloisa.macedo@fazenda.gov.br) | Solicitando informações sobre extrações que foram cadastradas, mas que não estão gerando qualquer arquivo. Uma das mensagens é por que excedeu o limite de tamanho. Foram enviados 'print screen' das telas. |
Corrigir erro de conexão. Após um certo número de registros o erro ocorre.