BoletoNet / boletonet

Boleto.Net is a library developed for use in Brazil, given it has been programmed with Brazilian retail legislation and business rules for bank registered billing integration.
Apache License 2.0
481 stars 383 forks source link

Alguém já esta desenvolvendo o boleto e registro conforme a nova plataforma do Febraban ? #306

Open leonardomsgoncalves opened 8 years ago

leonardomsgoncalves commented 8 years ago

Recebi o manual do Bradesco, será através de web service mas o serviço ainda não esta disponível.

agichihara commented 7 years ago

Boa tarde pessoal, Alguem tem o código post em c# para passar, estou utilizando um e esta dando erro. Não retorna informação.

    void POST(string url, Byte[] jsonContent)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";

        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        //Byte[] byteArray = encoding.GetBytes(jsonContent);

        Byte[] byteArray = jsonContent;

        request.ContentLength = byteArray.Length;
        request.ContentType = @"application/json";

        using (Stream dataStream = request.GetRequestStream())
        {
            dataStream.Write(byteArray, 0, byteArray.Length);
        }
        long length = 0;
        try
        {
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                length = response.ContentLength;
            }
        }
        catch (WebException ex)
        {
            // Log exception and throw as for GET example above
        }
    }
BrunoZanholo commented 7 years ago

e ai galera! alguém teve problema no retorno com o código de erro "02 - Erro Genérico – sistema indisponível"??

BrunoZanholo commented 7 years ago

alguém sabe dizer se o sistema esta indisponível? Só recebo o erro 02....

agichihara commented 7 years ago

Bruno, esta sim. Mas tbm estou apanhando aqui...

agichihara commented 7 years ago

Bruno, vc pode disponibilizar usa rotina de POST, se estiver em .net?

brunoDionizio commented 7 years ago

Está exatamente como eu estou usando, mas você vai precisar adaptar pouca coisa.

O envio, já com a mensagem assinada, eu estou fazendo assim:

private bool SolicitarRegistroOnline(byte[] JsonAssinado, out HttpResponseMessage response)
        {
            response = new HttpResponseMessage();

            try
            {
                var httpClient = new HttpClient();
                httpClient.Timeout = new TimeSpan(0, 3, 0);

                HttpContent content = new StringContent(Convert.ToBase64String(JsonAssinado));
                content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
                response = httpClient.PostAsync(_strCaminhoWebService, content).Result;
            }
            catch (Exception ex)
            {
                MontarMensagemDeErro("Erro ao solicitar registro de boleto: " + ex.Message);
                return false;
            }

            return true;
        }

Com a resposta desse método eu separo o retorno numa classe (CARegistroBoletosBradescoWS) que só precisa das propriedades "cdErro" e "msgErro" para testar:

private bool CarregarObjetoDeRetorno(HttpResponseMessage response, out CARegistroBoletosBradescoWS objCARegistroBoletosBradescoWS)
        {
            objCARegistroBoletosBradescoWS = new CARegistroBoletosBradescoWS();

            try
            {
                var xmlRetorno = XDocument.Parse(response.Content.ReadAsStringAsync().Result);
                objCARegistroBoletosBradescoWS = JsonConvert.DeserializeObject<CARegistroBoletosBradescoWS>(xmlRetorno.Root.Value);
            }
            catch (Exception ex)
            {
                MontarMensagemDeErro("Erro ao acessar WS para registro de boleto (Bradesco). " + ex.Message);
                return false;
            }

            if (objCARegistroBoletosBradescoWS.cdErro != "00")
            {
                MontarMensagemDeErro("Erro ao acessar WS para registro de boleto (Bradesco). Código do erro: " + objCARegistroBoletosBradescoWS.cdErro + ". Mensagem: " + objCARegistroBoletosBradescoWS.msgErro);
                return false;
            }

            return true;
        }
alissonwagner commented 7 years ago

Bom dia pessoal, alguém que esteja fazendo em Java pra trocar uma ideia?

agichihara commented 7 years ago

@brunoDionizio Beleza, estou utilizando seu código mas aqui esta dando StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1

Sera que pode ser o certificado que estou utilizando para assinar? Precisa ser um especifico? onde consigo?

Abrs

brunoDionizio commented 7 years ago

@agichihara Eu tive esse problema ao assinar, funcionou com o código que o Biux postou.

Se você rodar o comando response.Content.ReadAsStringAsync().Result provavelmente vai retornar o código de erro 810. Pode ser a maneira que está assinando ou o certificado mesmo, mas eu não sei os passos para conseguir um.

agichihara commented 7 years ago

@brunoDionizio estou usando um certificado que tinha aqui na maquina :) ou seja um qualquer...

hgmauri commented 7 years ago

Bom dia Pessoal

Aqui na empresa nos compramos o certificado ICP-BRASIL A1 e já iniciamos a homologação. Fizemos todo o processo conforme manual mas estamos recebendo o erro abaixo:

{"cdErro":"800", "msgErro":"Erro Certificado / Formatacao dos campos da mensagem invalida [0x00230001]

Alguém sabe me informar o que pode ser? Já entrei em contato com a 7comm mas eles demoram muito pra responder

brunoDionizio commented 7 years ago

@hgmauri Como você está montando o Json? Eu tive esse problema quando tentava montar manualmente, mas deu certo convertendo um objeto. Assim (com todas as propriedades do manual):

var objJson = new
                {
                    nuCPFCNPJ = CNPJ.Substring(0, 8),
                    filialCPFCNPJ = CNPJ.Substring(8, 4),
                    ctrlCPFCNPJ = CNPJ.Substring(12, 2),
                    cdTipoAcesso = "2",
                    clubBanco = "2269651",
                    cdTipoContrato = "48",
                    nuSequenciaContrato = "0"
                };

var strJson = JsonConvert.SerializeObject(objJson);

Acho que também dá esse erro se não respeitar o tamanho máximo dos campos.

hgmauri commented 7 years ago

Fala @brunoDionizio , beleza?

Então, eu estou respeitando de acordo com o manual.. por exemplo, estou enviando a mensagem abaixo com alguns campos preenchidos para o serviço de homologação e continua o mesmo erro:

{"nuCPFCNPJ":"27406222","filialCPFCNPJ":"0001","ctrlCPFCNPJ":"65","cdTipoAcesso":"2","clubBanco":"2269651","cdTipoContrato":"48","nuSequenciaContrato":null,"idProduto":"09","nuNegociacao":"351100000000057727","cdBanco":"237","eNuSequenciaContrato":null,"tpRegistro":"1","cdProduto":null,"nuTitulo":null,"nuCliente":null,"dtEmissaoTitulo":"06.09.2017","dtVencimentoTitulo":"16.09.2017","tpVencimento":"0","vlNominalTitulo":null,"cdEspecieTitulo":null,"tpProtestoAutomaticoNegativacao":null,"prazoProtestoAutomaticoNegativacao":null,"controleParticipante":null,"cdPagamentoParcial":null,"qtdePagamentoParcial":null,"percentualJuros":null,"vlJuros":null,"qtdeDiasJuros":null,"percentualMulta":null,"vlMulta":null,"qtdeDiasMulta":null,"percentualDesconto1":null,"vlDesconto1":null,"dataLimiteDesconto1":null,"percentualDesconto2":null,"vlDesconto2":null,"dataLimiteDesconto2":null,"percentualDesconto3":null,"vlDesconto3":null,"dataLimiteDesconto3":null,"prazoBonificacao":null,"percentualBonificacao":null,"vlBonificacao":null,"dtLimiteBonificacao":null,"vlAbatimento":null,"vlIOF":null,"nomePagador":null,"logradouroPagador":null,"nuLogradouroPagador":null,"complementoLogradouroPagador":null,"cepPagador":null,"complementoCepPagador":null,"bairroPagador":null,"municipioPagador":null,"ufPagador":null,"cdIndCpfcnpjPagador":null,"nuCpfcnpjPagador":null,"endEletronicoPagador":null,"nomeSacadorAvalista":null,"logradouroSacadorAvalista":null,"nuLogradouroSacadorAvalista":null,"complementoLogradouroSacadorAvalista":null,"cepSacadorAvalista":null,"complementoCepSacadorAvalista":null,"bairroSacadorAvalista":null,"municipioSacadorAvalista":null,"ufSacadorAvalista":null,"cdIndCpfcnpjSacadorAvalista":null,"nuCpfcnpjSacadorAvalista":null,"endEletronicoSacadorAvalista":null}

Antes de enviar eu pego o certificado instalado e assino

alissonwagner commented 7 years ago

@hgmauri pela documentação, não pode valores null, tem q colocar " "(Alfanuméricos) ou "0" (numéricos).

Observações sobre o preenchimento dos campos:

  1. Todos os campos devem ser informados no layout, obrigatórios e não obrigatórios, os não obrigatórios devem vir com zeros se o tipo de campo é numérico ou espaços se o campo é alfanumérico;
  2. Nos campos que dizem respeito a multa, juros, bonificação ou desconto, deve ser preenchido ou valor ou percentual, nunca os dois campos mutualmente;
brunoDionizio commented 7 years ago

Isso mesmo, testei aqui com esse Json e depois trocando null por "0". No segundo caso a mensagem foi diferente.

hgmauri commented 7 years ago

@alissonwagner e @brunoDionizio eu vou pagar com chopp pra vcs! deu certo aqui e já consegui a comunicação.

Obrigado pessoal

dodouglas12 commented 7 years ago

@alissonwagner cara....estou com o mesmo problema do @brunoDionizio ...... Fiz a alteração aqui do Json mas não rolou...Consegue ajudar? Segue Json;

{ "nuCPFCNPJ":"12345678", "filialCPFCNPJ":"0001", "ctrlCPFCNPJ":"89", "cdTipoAcesso":"2", "clubBanco":"2269651", "cdTipoContrato":"48", "nuSequenciaContrato":"0", "idProduto":"09", "nuNegociacao":"111100000000001259", "cdBanco":"237", "eNuSequenciaContrato":"0", "tpRegistro":"1", "cdProduto":"0", "nuTitulo":"0", "nuCliente":"0200001224", "dtEmissaoTitulo":"06.09.2017", "dtVencimentoTitulo":"11.09.2017", "tpVencimento":"0", "vlNominalTitulo":"100", "cdEspecieTitulo":"32", "tpProtestoAutomaticoNegativacao":"0", "prazoProtestoAutomaticoNegativacao":"0", "controleParticipante":"", "cdPagamentoParcial":"", "qtdePagamentoParcial":"0", "percentualJuros":"0", "vlJuros":"0", "qtdeDiasJuros":"0", "percentualMulta":"0", "vlMulta":"0", "qtdeDiasMulta":"0", "percentualDesconto1":"0", "vlDesconto1":"0", "dataLimiteDesconto1":"", "percentualDesconto2":"0", "vlDesconto2":"0", "dataLimiteDesconto2":"", "percentualDesconto3":"0", "vlDesconto3":"0", "dataLimiteDesconto3":"", "prazoBonificacao":"0", "percentualBonificacao":"0", "vlBonificacao":"0", "dtLimiteBonificacao":"", "vlAbatimento":"0", "vlIOF":"0", "nomePagador":"NOME DO MEU CLIENTE", "logradouroPagador":"RUA BOCAINA DE MINAS", "nuLogradouroPagador":"259", "complementoLogradouroPagador":"", "cepPagador":"04939", "complementoCepPagador":"200", "bairroPagador":"JARDIM TUPI", "municipioPagador":"SAO PAULO", "ufPagador":"SP", "cdIndCpfcnpjPagador":"1", "nuCpfcnpjPagador":"00012345678910", "endEletronicoPagador":"", "nomeSacadorAvalista":"", "logradouroSacadorAvalista":"", "nuLogradouroSacadorAvalista":"", "complementoLogradouroSacadorAvalista":"", "cepSacadorAvalista":"0", "complementoCepSacadorAvalista":"0", "bairroSacadorAvalista":"", "municipioSacadorAvalista":"", "ufSacadorAvalista":"", "cdIndCpfcnpjSacadorAvalista":"", "nuCpfcnpjSacadorAvalista":"", "endEletronicoSacadorAvalista":"" }

@hgmauri você tem um exemplo do json que vc utilizou?

alissonwagner commented 7 years ago

@dodouglas12 Coloca espaço em branco onde é String vazia " "

Estou penando num erro 500 aqui, alguém faz ideia?

BrunoZanholo commented 7 years ago

Galera sobre o erro 02: no meu caso era por que estava enviando no campo "cdEspecieTitulo" o código 32, porém o código a ser utilizado para esta conta deveria ser a partir do 01 até 29. Neste caso foi orientação dada pela equipe que presta serviço ao banco e em relação a conta cadastrada no Bradesco Net. Mas fica dica pra galera.

BrunoZanholo commented 7 years ago

@alissonwagner retorna erro 500 da API do banco?

dodouglas12 commented 7 years ago

@alissonwagner coloquei espaço em branco e continuo recebendo o erro 800.

BrunoZanholo commented 7 years ago

@dodouglas12 experimenta remover os zeros a esquerda do cpf do pagador.

alissonwagner commented 7 years ago

@BrunoZanholo isso, quando tento fazer o post me retorna um 500

@dodouglas12 a princípio o erro 800 é da formatação do Json, da uma conferida nos dados

BrunoZanholo commented 7 years ago

@alissonwagner como esta o código que você esta fazendo o post? Coloca ai pra gente tentar ajudar... erro 500 é o chamado erro de implementação... tem certeza que esse erro dá no retorno da chamada ao WS ou da na sua app?

alissonwagner commented 7 years ago

@BrunoZanholo Tentei usando o Spring RestTemplate pra java, o código é esse:

    private void postWithRestTemplate(String asignedJson) {
        String resultado = "";
        Map<String, String> vars = new HashMap<String, String>();
        vars.put("ContentType", "application/json");
        try {
            resultado = restTemplate.postForObject(
                    "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao", asignedJson, String.class, vars);
        } catch (Exception e) {
            LOG.error("Erro", e);
        }
    }

Na conf do RestTemplate vai isso pra enviar pelo TLS (tentei sem tbm, de algumas formas)

@Bean
    RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception {

        /*
         * Create an SSLContext that uses client.jks as the client certificate
         * and the truststore.jks as the trust material (trusted CA certificates).
         * In this sample, truststore.jks contains ca.pem which was used to sign
         * both client.pfx and server.jks.
         */
        SSLContext sslContext = SSLContextBuilder
                .create()
                .loadKeyMaterial(certificado, senha)
                .build();

        /*
         * Create an HttpClient that uses the custom SSLContext
         */
        HttpClient client = HttpClients.custom()
                .setSSLContext(sslContext)
                .build();

        /*
         * Create a RestTemplate that uses a request factory that references
         * our custom HttpClient
         */
        return builder
                .requestFactory(new HttpComponentsClientHttpRequestFactory(client))
                .build();
    }

E tentei pelo java net url que é algo assim

            URL url = new URL("https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");

            OutputStream os = conn.getOutputStream();
            os.write(input.getBytes());
            os.flush();

            if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode());
            }

Nesse caso o response na connection vem 500, acredito que venha de lá.

Estou usando um certificado PKCS#12, mas segundo eles, não tem problema

brunoDionizio commented 7 years ago

@alissonwagner É que erro 500 é o código para "Internal Error", é coisa de API, sei lá. Mas o código de verdade (dos que tem no manual) vem em um Json dentro do XML de retorno. Não sei em Java, mas ao fazer isso em C# dá pra ver esse Json: var xmlRetorno = XDocument.Parse(response.Content.ReadAsStringAsync().Result);

dodouglas12 commented 7 years ago

@BrunoZanholo ta embaçado esse erro 800 kkkkkkkkkkkkkkkkkk....já fiz, refiz, olhei denovo....kkkkkk

Estou mandando dessa forma: {"nuCPFCNPJ":"12345678","filialCPFCNPJ":"1","ctrlCPFCNPJ":"89","cdTipoAcesso":"2","clubBanco":"2269651","cdTipoContrato":"48","nuSequenciaContrato":"0","idProduto":"9","nuNegociacao":"111100000000001259","cdBanco":"237","eNuSequenciaContrato":"0","tpRegistro":"1","cdProduto":"0","nuTitulo":"0","nuCliente":"200001224","dtEmissaoTitulo":"06.09.2017","dtVencimentoTitulo":"11.09.2017","tpVencimento":"0","vlNominalTitulo":"100000","cdEspecieTitulo":"23","tpProtestoAutomaticoNegativacao":"0","prazoProtestoAutomaticoNegativacao":"0","controleParticipante":" ","cdPagamentoParcial":"N","qtdePagamentoParcial":"0","percentualJuros":"0","vlJuros":"0","qtdeDiasJuros":"0","percentualMulta":"0","vlMulta":"0","qtdeDiasMulta":"0","percentualDesconto1":"0","vlDesconto1":"0","dataLimiteDesconto1":" ","percentualDesconto2":"0","vlDesconto2":"0","dataLimiteDesconto2":" ","percentualDesconto3":"0","vlDesconto3":"0","dataLimiteDesconto3":" ","prazoBonificacao":"0","percentualBonificacao":"0","vlBonificacao":"0","dtLimiteBonificacao":" ","vlAbatimento":"0","vlIOF":"0","nomePagador":"Joao Chico Doidao","logradouroPagador":"RUA BOCAINA DE MINAS","nuLogradouroPagador":"890","complementoLogradouroPagador":"CASA","cepPagador":"04939","complementoCepPagador":"200","bairroPagador":"JARDIM TUPI","municipioPagador":"SAO PAULO","ufPagador":"SP","cdIndCpfcnpjPagador":"1","nuCpfcnpjPagador":"99428636649","endEletronicoPagador":" ","nomeSacadorAvalista":" ","logradouroSacadorAvalista":" ","nuLogradouroSacadorAvalista":" ","complementoLogradouroSacadorAvalista":" ","cepSacadorAvalista":"0","complementoCepSacadorAvalista":"0","bairroSacadorAvalista":" ","municipioSacadorAvalista":" ","ufSacadorAvalista":" ","cdIndCpfcnpjSacadorAvalista":" ","nuCpfcnpjSacadorAvalista":" ","endEletronicoSacadorAvalista":" "}

Quando eu assino esse json, ele fica assim: MIIeUwYJKoZIhvcNAQcCoIIeRDCCHkACAQExCzAJBgUrDgMCGgUAMIIHJwYJKoZIhvcNAQcBoIIHGASCBxR7Im51Q1BGQ05QSiI6IjQwODQyNzAiLCJmaWxpYWxDUEZDTlBKIjoiMSIsImN0cmxDUEZDTlBKIjoiODkiLCJjZFRpcG9BY2Vzc28iOiIyIiwiY2x1YkJhbmNvIjoiMjI2OTY1MSIsImNkVGlwb0NvbnRyYXRvIjoiNDgiLCJudVNlcXVlbmNpYUNvbnRyYXRvIjoiMCIsImlkUHJvZHV0byI6IjkiLCJudU5lZ29jaWFjYW8iOiIzMzk1MDAwMDAwMDAwMDEyNTkiLCJjZEJhbmNvIjoiMjM3IiwiZU51U2VxdWVuY2lhQ29udHJhdG8iOiIwIiwidHBSZWdpc3RybyI6IjEiLCJjZFByb2R1dG8iOiIwIiwibnVUaXR1bG8iOiIwIiwibnVDbGllbnRlIjoiMjAwMDAxMjI0IiwiZHRFbWlzc2FvVGl0dWxvIjoiMDYuMDkuMjAxNyIsImR0VmVuY2ltZW50b1RpdHVsbyI6IjExLjA5LjIwMTciLCJ0cFZlbmNpbWVudG8iOiIwIiwidmxOb21pbmFsVGl0dWxvIjoiMTAwMDAwIiwiY2RFc3BlY2llVGl0dWxvIjoiMjMiLCJ0cFByb3Rlc3RvQXV0b21hdGljb05lZ2F0aXZhY2FvIjoiMCIsInByYXpvUHJvdGVzdG9BdXRvbWF0aWNvTmVnYXRpdmFjYW8iOiIwIiwiY29udHJvbGVQYXJ0aWNpcGFudGUiOiIgIiwiY2RQYWdhbWVudG9QYXJjaWFsIjoiTiIsInF0ZGVQYWdhbWVudG9QYXJjaWFsIjoiMCIsInBlcmNlbnR1YWxKdXJvcyI6IjAiLCJ2bEp1cm9zIjoiMCIsInF0ZGVEaWFzSnVyb3MiOiIwIiwicGVyY2VudHVhbE11bHRhIjoiMCIsInZsTXVsdGEiOiIwIiwicXRkZURpYXNNdWx0YSI6IjAiLCJwZXJjZW50dWFsRGVzY29udG8xIjoiMCIsInZsRGVzY29udG8xIjoiMCIsImRhdGFMaW1pdGVEZXNjb250bzEiOiIgIiwicGVyY2VudHVhbERlc2NvbnRvMiI6IjAiLCJ2bERlc2NvbnRvMiI6IjAiLCJkYXRhTGltaXRlRGVzY29udG8yIjoiICIsInBlcmNlbnR1YWxEZXNjb250bzMiOiIwIiwidmxEZXNjb250bzMiOiIwIiwiZGF0YUxpbWl0ZURlc2NvbnRvMyI6IiAiLCJwcmF6b0JvbmlmaWNhY2FvIjoiMCIsInBlcmNlbnR1YWxCb25pZmljYWNhbyI6IjAiLCJ2bEJvbmlmaWNhY2FvIjoiMCIsImR0TGltaXRlQm9uaWZpY2FjYW8iOiIgIiwidmxBYmF0aW1lbnRvIjoiMCIsInZsSU9GIjoiMCIsIm5vbWVQYWdhZG9yIjoiRG91Z2xhcyBHb21lcyBGZXJyZWlyYSBkZSBNb3JhZXMiLCJsb2dyYWRvdXJvUGFnYWRvciI6IlJVQSBCT0NBSU5BIERFIE1JTkFTIiwibnVMb2dyYWRvdXJvUGFnYWRvciI6Ijg5MCIsImNvbXBsZW1lbnRvTG9ncmFkb3Vyb1BhZ2Fkb3IiOiJDQVNBIiwiY2VwUGFnYWRvciI6IjA0OTM5IiwiY29tcGxlbWVudG9DZXBQYWdhZG9yIjoiMjAwIiwiYmFpcnJvUGFnYWRvciI6IkpBUkRJTSBUVVBJIiwibXVuaWNpcGlvUGFnYWRvciI6IlNBTyBQQVVMTyIsInVmUGFnYWRvciI6IlNQIiwiY2RJbmRDcGZjbnBqUGFnYWRvciI6IjEiLCJudUNwZmNucGpQYWdhZG9yIjoiMzkyMDc2MDU4MTMiLCJlbmRFbGV0cm9uaWNvUGFnYWRvciI6IiAiLCJub21lU2FjYWRvckF2YWxpc3RhIjoiICIsImxvZ3JhZG91cm9TYWNhZG9yQXZhbGlzdGEiOiIgIiwibnVMb2dyYWRvdXJvU2FjYWRvckF2YWxpc3RhIjoiICIsImNvbXBsZW1lbnRvTG9ncmFkb3Vyb1NhY2Fkb3JBdmFsaXN0YSI6IiAiLCJjZXBTYWNhZG9yQXZhbGlzdGEiOiIwIiwiY29tcGxlbWVudG9DZXBTYWNhZG9yQXZhbGlzdGEiOiIwIiwiYmFpcnJvU2FjYWRvckF2YWxpc3RhIjoiICIsIm11bmljaXBpb1NhY2Fkb3JBdmFsaXN0YSI6IiAiLCJ1ZlNhY2Fkb3JBdmFsaXN0YSI6IiAiLCJjZEluZENwZmNucGpTYWNhZG9yQXZhbGlz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

BrunoZanholo commented 7 years ago

@alissonwagner ai c quebra eu.. achei que tava fazendo em c#... hehe

então cara... será que pode assinar com outro algoritmo? duvido hemmm... acho q pode ser isso provocando o erro 500 do lado do banco...

@dodouglas12 eu sofri pra kct aqui pra descobrir qual campo eu estava formatando errado... mas esse erro 800 é de formatação de campos.. eu tiraria o espaço em branco que foi sugerido pelo outro colega... uma coisa é "vazio" outra é "espaço em branco".

rowrodrigues commented 7 years ago

@brunoDionizio, tem como enviar as classes ou o projeto rodando? Estou tendo algumas dificuldades para entender os métodos que foram escritos na issue.

Obrigado desde já

alissonwagner commented 7 years ago

@BrunoZanholo eles acabaram de me mandar um código de exemplo, funcionou, parece q é isso mesmo, tem q ser pkcs7 mesmo.

Segue o algoritmo deles, pode ser útil pra alguém de java como eu :p

import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.bouncycastle.cert.jcajce.JcaCertStore;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.CMSSignedDataGenerator;
import org.bouncycastle.cms.CMSTypedData;
import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder;
import org.bouncycastle.util.Store;
import org.bouncycastle.util.encoders.Base64;

public final class PKCS7Signer {

    private static final String PATH_TO_KEYSTORE = "/opt/certificado.pfx";    
    private static final String KEYSTORE_PASSWORD = "senha!!!";
    private static final String SIGNATUREALGO = "Sha256WithRSA";
    private static final String URI_REGISTRO = "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao";

    public static void main(String[] args) throws Exception {
        PKCS7Signer signer = new PKCS7Signer();
        KeyStore keyStore = signer.loadKeyStore();
        CMSSignedDataGenerator signatureGenerator = signer.setUpProvider(keyStore);

        // Json de teste...
        String json = "{\"nuCPFCNPJ\": \"123456789\",\"filialCPFCNPJ\": \"0001\",\"ctrlCPFCNPJ\": \"39\",\"cdTipoAcesso\": \"2\",\"clubBanco\": \"0\",\"cdTipoContrato\": \"0\",\"nuSequenciaContrato\": \"0\",\"idProduto\": \"09\",\"nuNegociacao\": \"123400000001234567\",\"cdBanco\": \"237\",\"eNuSequenciaContrato\": \"0\",\"tpRegistro\": \"1\",\"cdProduto\": \"0\",\"nuTitulo\": \"0\",\"nuCliente\": \"123456\",\"dtEmissaoTitulo\": \"25.05.2017\",\"dtVencimentoTitulo\": \"20.06.2017\",\"tpVencimento\": \"0\",\"vlNominalTitulo\": \"100\",\"cdEspecieTitulo\": \"04\",\"tpProtestoAutomaticoNegativacao\": \"0\",\"prazoProtestoAutomaticoNegativacao\": \"0\",\"controleParticipante\": \"\",\"cdPagamentoParcial\": \"\",\"qtdePagamentoParcial\": \"0\",\"percentualJuros\": \"0\",\"vlJuros\": \"0\",\"qtdeDiasJuros\": \"0\",\"percentualMulta\": \"0\",\"vlMulta\": \"0\",\"qtdeDiasMulta\": \"0\",\"percentualDesconto1\": \"0\",\"vlDesconto1\": \"0\",\"dataLimiteDesconto1\": \"\",\"percentualDesconto2\": \"0\",\"vlDesconto2\": \"0\",\"dataLimiteDesconto2\": \"\",\"percentualDesconto3\": \"0\",\"vlDesconto3\": \"0\",\"dataLimiteDesconto3\": \"\",\"prazoBonificacao\": \"0\",\"percentualBonificacao\": \"0\",\"vlBonificacao\": \"0\",\"dtLimiteBonificacao\": \"\",\"vlAbatimento\": \"0\",\"vlIOF\": \"0\",\"nomePagador\": \"Cliente Teste\",\"logradouroPagador\": \"rua Teste\",\"nuLogradouroPagador\": \"90\",\"complementoLogradouroPagador\": \"\",\"cepPagador\": \"12345\",\"complementoCepPagador\": \"500\",\"bairroPagador\": \"bairro Teste\",\"municipioPagador\": \"Teste\",\"ufPagador\": \"SP\",\"cdIndCpfcnpjPagador\": \"1\",\"nuCpfcnpjPagador\": \"12345648901234\",\"endEletronicoPagador\": \"\",\"nomeSacadorAvalista\": \"\",\"logradouroSacadorAvalista\": \"\",\"nuLogradouroSacadorAvalista\": \"0\",\"complementoLogradouroSacadorAvalista\": \"\",\"cepSacadorAvalista\": \"0\",\"complementoCepSacadorAvalista\": \"0\",\"bairroSacadorAvalista\": \"\",\"municipioSacadorAvalista\": \"\",\"ufSacadorAvalista\": \"\",\"cdIndCpfcnpjSacadorAvalista\": \"0\",\"nuCpfcnpjSacadorAvalista\": \"0\",\"endEletronicoSacadorAvalista\": \"\"}";

        byte[] signedBytes = signer.signPkcs7(json.getBytes("UTF-8"), signatureGenerator);
        System.out.println("Signed Encoded Bytes: " + new String(Base64.encode(signedBytes)));

        carregaCertificacaoAutenticacaoA1();

        HttpEntity entity = new StringEntity(new String(Base64.encode(signedBytes)), Charset.forName("UTF-8"));
    HttpPost post = new HttpPost(URI_REGISTRO);
    post.setEntity(entity);

    HttpClientBuilder builder = HttpClientBuilder.create();     
    HttpResponse response = builder.build().execute(post);

    System.out.println(response.getStatusLine());
    System.out.println(EntityUtils.toString(response.getEntity(), "UTF-8"));
    }

    private KeyStore loadKeyStore() throws Exception {
        KeyStore keystore = KeyStore.getInstance("JKS");

        InputStream is = new FileInputStream(PATH_TO_KEYSTORE);
        keystore.load(is, KEYSTORE_PASSWORD.toCharArray());
        return keystore;
    }

    private CMSSignedDataGenerator setUpProvider(final KeyStore keystore) throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        Enumeration<String> aliases = keystore.aliases();
    String aliaz = "";
    while (aliases.hasMoreElements()) {
        aliaz = aliases.nextElement();
        if (keystore.isKeyEntry(aliaz)) {
            break;
        }
    }

        Certificate[] certchain = (Certificate[]) keystore.getCertificateChain(aliaz);

        final List<Certificate> certlist = new ArrayList<Certificate>();

        for (int i = 0, length = certchain == null ? 0 : certchain.length; i < length; i++) {
            certlist.add(certchain[i]);
        }

        Store certstore = new JcaCertStore(certlist);

        Certificate cert = keystore.getCertificate(aliaz);

        ContentSigner signer = new JcaContentSignerBuilder(SIGNATUREALGO).setProvider("BC").
                                    build((PrivateKey) (keystore.getKey(aliaz, KEYSTORE_PASSWORD.toCharArray())));

        CMSSignedDataGenerator generator = new CMSSignedDataGenerator();

        generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").
                                            build()).build(signer, (X509Certificate) cert));

        generator.addCertificates(certstore);

        return generator;
    }

    private byte[] signPkcs7(final byte[] content, final CMSSignedDataGenerator generator) throws Exception {
        CMSTypedData cmsdata = new CMSProcessableByteArray(content);
        CMSSignedData signeddata = generator.generate(cmsdata, true);
        return signeddata.getEncoded();
    }

    public static void carregaCertificacaoAutenticacaoA1() throws Exception {
    System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

    System.clearProperty("javax.net.ssl.trustStore");
    System.clearProperty("javax.net.ssl.trustStorePassword");

    System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    System.setProperty("javax.net.ssl.trustStore", "/opt/jssecacerts");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 
    }
}
rafaelwilsondantas commented 7 years ago

O erro -2 de contrato não encontrado, poder ser gerado por quais motivos? Algum além do número do contrato estar vazio?

dodouglas12 commented 7 years ago

Aeeeee car!@#%$# kkkkkkkkkkkkkkkkkkkkkk..... Galera, liguei lá no banco e consegui a documentação atualizada (versão 1.7). Eu estava com a 1.4...lá eles tem um exemplo mais "bonito" de json.

Para quem precisar, eu fiz em vb.net

BrunoZanholo commented 7 years ago

@rafaelwilsondantas esse dai é porque você esta usando os dados do CNPJ / conta cadastrados no Bradesco net errados ou não foi feito o primeiro acesso na plataforma Bradesco NET.

@alissonwagner boa! Vai ajudar os caras do java.

BrunoZanholo commented 7 years ago

@rafaelwilsondantas segue a doc 1.7 Manual Registro de Boleto Bancário On-line_v 1 7.pdf

agichihara commented 7 years ago

@dodouglas12 poderia disponibilizar em vb.net?

dodouglas12 commented 7 years ago

opa.....vou disponibilizar....aguenta ai

hgmauri commented 7 years ago

Galera, vou disponibilizar a minha solução em C# também.. até o presente momento está funcionando tudo certo mas estou na fase de comunicação com a 7comm pra entender algumas validações do lado deles, fora isso está tudo ok

dodouglas12 commented 7 years ago

Está ai.....eu uso algumas coisas que coloquei no App.config...

Imports System.Security.Cryptography.X509Certificates Imports System.Text Imports System.Security.Cryptography.Pkcs Imports System.Net.Http

Public Class ConnectorBradescoResponse

'Executa a API do Bradesco
Public Shared Function Execute(ByVal tpResponse As Type,
                               ByVal sServiceURI As String,
                               Optional ByVal oObject As Object = Nothing,
                               Optional ByRef sJson As String = "",
                               Optional ByRef nStatusCode As Integer = 200) As Model.BradescoResponseRegistry

    Dim oResponse As New Model.BradescoResponseRegistry

    Try

        'Variaveis para request
        Dim htResponse As New HttpResponseMessage
        Dim htClient As New HttpClient
        Dim oContent As HttpContent
        Dim xml As XDocument

        'Variaveis de Mensagem
        Dim oFormatRequest As String
        Dim byRequest As Byte()
        Dim byAssignRequest As Byte()

        'Variaveis de Certificado
        Dim cCertificate As X509Certificate2
        Dim ciContente As ContentInfo
        Dim scMessageAssign As SignedCms
        Dim csCertificateAssign As CmsSigner

        '==========================================================================================================================================
        '==========================================================================================================================================
        '==========================================================================================================================================
        'Valida se e possivel contruir o objeto
        If IsNothing(sServiceURI) Then
            Throw New Exception("Unable to detect Service URI")
        End If

        '==========================================================================================================================================
        '==========================================================================================================================================
        '==========================================================================================================================================
        'Monta a mensagem e JSON e pera o byte array da mesma
        oFormatRequest = Newtonsoft.Json.JsonConvert.SerializeObject(oObject.oObject)
        byRequest = Encoding.Default.GetBytes(oFormatRequest)

        '==========================================================================================================================================
        '==========================================================================================================================================
        '==========================================================================================================================================
        'Recupera o Certificado de acordo com o CNPJ enviado
        cCertificate = GetCertificate(oObject.sCpfCnpj)

        'Assina a Requisição
        ciContente = New ContentInfo(byRequest)
        scMessageAssign = New SignedCms(ciContente, False)
        csCertificateAssign = New CmsSigner(cCertificate)
        scMessageAssign.ComputeSignature(csCertificateAssign)

        'Gera o Byte Array da requisição assinada
        byAssignRequest = scMessageAssign.Encode()

        '==========================================================================================================================================
        '==========================================================================================================================================
        '==========================================================================================================================================
        'Configuracao do timeout
        htClient.Timeout = New TimeSpan(0, 3, 0)

        'Configura o request
        oContent = New StringContent(Convert.ToBase64String(byAssignRequest))
        oContent.Headers.ContentType = New Headers.MediaTypeHeaderValue("application/json")

        'Executa o request
        htResponse = htClient.PostAsync(sServiceURI, oContent).Result

        'Pega o retorno do XML
        xml = XDocument.Parse(htResponse.Content.ReadAsStringAsync().Result)

        '==========================================================================================================================================
        '==========================================================================================================================================
        '==========================================================================================================================================
        'Monta a Classe esperada
        oResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(xml.Root.Value, tpResponse)

        'Se ocorreu erro, retorna o mesmo
        If oResponse IsNot Nothing Then
            Throw New ApplicationException("Erro na conversão para classe")
        End If

        'Recupera o Status Code da requisicao
        nStatusCode = CInt(htResponse.StatusCode)

        'Monta o JSON de referencia
        sJson = "StatusCode: " & htResponse.StatusCode & vbNewLine
        sJson += xml.Root.Value

        'Retorno da classe
        Return oResponse

    Catch
        Throw
    End Try

End Function

Private Shared Function GetCertificate(ByVal sCpfCnpj As String) As X509Certificate
    'Variaveis
    Dim cCertificates As X509Certificate2
    Dim oStoreName As StoreName
    Dim oStoreLocation As StoreLocation
    Dim oStoreCertificates As X509Store
    Dim sCertificateName As String = String.Empty

    'Recupera o Nome do Certificado
    sCertificateName = System.Configuration.ConfigurationManager.AppSettings(sCpfCnpj)

    'Define Local dos Certificados
    oStoreName = Configurations.Default.StoreName
    oStoreLocation = Configurations.Default.StoreLocation
    oStoreCertificates = New X509Store(oStoreName, oStoreLocation)

    'Abre o diretório
    oStoreCertificates.Open(OpenFlags.ReadOnly)

    Try
        'Validação de Callback
        Try
            Net.ServicePointManager.ServerCertificateValidationCallback =
                New Net.Security.RemoteCertificateValidationCallback(
                    Function(sender2 As Object, certificate As X509Certificate,
                             chain As X509Chain, sslPolicyErrors As Net.Security.SslPolicyErrors) As Boolean
                        Select Case sslPolicyErrors
                            Case Net.Security.SslPolicyErrors.None
                                Return True
                            Case Else
                                Return True
                        End Select
                    End Function)
        Catch
        End Try

        '==========================================================================================================================================
        '==========================================================================================================================================
        '==========================================================================================================================================
        'Procura o certificado do Bradesco
        For Each cCertificates In oStoreCertificates.Certificates
            If cCertificates.SubjectName.Name.ToString.Split(",")(0).Replace("CN=", "") = sCertificateName Then
                Return cCertificates
            End If
        Next

    Catch
        Throw
    Finally
        'Fecha o diretório
        oStoreCertificates.Close()
    End Try
End Function

End Class

rodrigoprado2305 commented 7 years ago

Blz pessoal, alguem poderia me passar o link com uma assinatura já efetuada pra eu testar no soapui ou postman, para validar por favor, aos que fizeram na homologação em qualquer linguagem.

por favor me informar o exemplo de um json preenchido antes de enviar e depois ele mesmo assinado pra eu testar no link.

eu consigo retornar algo somente pelo navegador?

https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrohomologacao + jsonassinado

rafaelwilsondantas commented 7 years ago

Olá. alguém sabe algo que possa estar gerando o {"cdErro":"2", "msgErro":"Erro" ?

dodouglas12 commented 7 years ago

@rafaelwilsondantas qual especie de documento você está mandando???

rafaelwilsondantas commented 7 years ago

@dodouglas12 estou realizando teste, então já tentei mandar com 16 e com 25 e nos dois deu erro

dodouglas12 commented 7 years ago

@rafaelwilsondantas Qual tipo de serviço você presta? No meu caso quando deu esse erro era porque eu estava mandando 32 e não 04 (DUPLICATA DE PRESTACAO DE SERVICO) que é o meu caso.

rafaelwilsondantas commented 7 years ago

@dodouglas12 é para faculdade, já coloquei todos os valores, ( sim eu testei os 33 valores) e todos dão o mesmo erro. Os dados do contrato estão certos, pois quando eu modificado ele dá erro de consistência.

dodouglas12 commented 7 years ago

@rafaelwilsondantas como está o seu json?

PS.: Fiz uma pequena modificação no deserialize...Retirei caracteres especiais das tags....código mais limpo (na minha opinião) rs

alissonwagner commented 7 years ago

@rafaelwilsondantas no código de exemplo Java que eu postei tem um Json válido. Não tem como fazer pelo navegador por ser um POST (não de forma direta pelo menos) com o postman acho que tu consegue, mas com o código que eu postei que ele me mandaram, é só executar no java que funciona.

willalberton commented 7 years ago

@hgmauri Poderia compartilhar sua implementação? Estou com o mesmo problema em Java.

willalberton commented 7 years ago

Pessoal,

vocês estão conseguindo assinar com JDK 8? Eu recebo "Invalid Keystore format". Consigo assinar apenas com OpenJDK 9.

Referente a transmissão, recebo o seguinte erro:

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

Alguém poderia me dar uma luz?

Segue minha implementação:

` public final class PKCS7Signer {

private static final String PATH_TO_KEYSTORE = "certificado/certificado.pfx";
private static final String KEYSTORE_PASSWORD = "12345678";
private static final String SIGNATUREALGO = "Sha256WithRSA";
private static final String URI_REGISTRO = "https://cobranca.bradesconetempresa.b.br/ibpjregistrotitulows/registrotitulohomologacao";

public static void main(String[] args) throws Exception {
    PKCS7Signer signer = new PKCS7Signer();
    KeyStore keyStore = signer.loadKeyStore();
    CMSSignedDataGenerator signatureGenerator = signer.setUpProvider(keyStore);

    // Json de teste...
    String json = "{\"nuCPFCNPJ\": \"123456789\",\"filialCPFCNPJ\": \"0001\",\"ctrlCPFCNPJ\": \"39\",\"cdTipoAcesso\": \"2\",\"clubBanco\": \"0\",\"cdTipoContrato\": \"0\",\"nuSequenciaContrato\": \"0\",\"idProduto\": \"09\",\"nuNegociacao\": \"123400000001234567\",\"cdBanco\": \"237\",\"eNuSequenciaContrato\": \"0\",\"tpRegistro\": \"1\",\"cdProduto\": \"0\",\"nuTitulo\": \"0\",\"nuCliente\": \"123456\",\"dtEmissaoTitulo\": \"25.05.2017\",\"dtVencimentoTitulo\": \"20.06.2017\",\"tpVencimento\": \"0\",\"vlNominalTitulo\": \"100\",\"cdEspecieTitulo\": \"04\",\"tpProtestoAutomaticoNegativacao\": \"0\",\"prazoProtestoAutomaticoNegativacao\": \"0\",\"controleParticipante\": \"\",\"cdPagamentoParcial\": \"\",\"qtdePagamentoParcial\": \"0\",\"percentualJuros\": \"0\",\"vlJuros\": \"0\",\"qtdeDiasJuros\": \"0\",\"percentualMulta\": \"0\",\"vlMulta\": \"0\",\"qtdeDiasMulta\": \"0\",\"percentualDesconto1\": \"0\",\"vlDesconto1\": \"0\",\"dataLimiteDesconto1\": \"\",\"percentualDesconto2\": \"0\",\"vlDesconto2\": \"0\",\"dataLimiteDesconto2\": \"\",\"percentualDesconto3\": \"0\",\"vlDesconto3\": \"0\",\"dataLimiteDesconto3\": \"\",\"prazoBonificacao\": \"0\",\"percentualBonificacao\": \"0\",\"vlBonificacao\": \"0\",\"dtLimiteBonificacao\": \"\",\"vlAbatimento\": \"0\",\"vlIOF\": \"0\",\"nomePagador\": \"Cliente Teste\",\"logradouroPagador\": \"rua Teste\",\"nuLogradouroPagador\": \"90\",\"complementoLogradouroPagador\": \"\",\"cepPagador\": \"12345\",\"complementoCepPagador\": \"500\",\"bairroPagador\": \"bairro Teste\",\"municipioPagador\": \"Teste\",\"ufPagador\": \"SP\",\"cdIndCpfcnpjPagador\": \"1\",\"nuCpfcnpjPagador\": \"12345648901234\",\"endEletronicoPagador\": \"\",\"nomeSacadorAvalista\": \"\",\"logradouroSacadorAvalista\": \"\",\"nuLogradouroSacadorAvalista\": \"0\",\"complementoLogradouroSacadorAvalista\": \"\",\"cepSacadorAvalista\": \"0\",\"complementoCepSacadorAvalista\": \"0\",\"bairroSacadorAvalista\": \"\",\"municipioSacadorAvalista\": \"\",\"ufSacadorAvalista\": \"\",\"cdIndCpfcnpjSacadorAvalista\": \"0\",\"nuCpfcnpjSacadorAvalista\": \"0\",\"endEletronicoSacadorAvalista\": \"\"}";

    byte[] signedBytes = signer.signPkcs7(json.getBytes("UTF-8"), signatureGenerator);
    System.out.println("Signed Encoded Bytes: " + new String(Base64.encode(signedBytes)));

    carregaCertificacaoAutenticacaoA1();

    HttpEntity entity = new StringEntity(new String(Base64.encode(signedBytes)), Charset.forName("UTF-8"));
    HttpPost post = new HttpPost(URI_REGISTRO);
    post.setEntity(entity);

    HttpClientBuilder builder = HttpClientBuilder.create();
    HttpResponse response = builder.build().execute(post);

    System.out.println(response.getStatusLine());
    System.out.println(EntityUtils.toString(response.getEntity(), "UTF-8"));
}

private KeyStore loadKeyStore() throws Exception {
    KeyStore keystore = KeyStore.getInstance("JKS");

    InputStream is = new FileInputStream(PATH_TO_KEYSTORE);
    keystore.load(is, KEYSTORE_PASSWORD.toCharArray());
    return keystore;
}

private CMSSignedDataGenerator setUpProvider(final KeyStore keystore) throws Exception {
    Security.addProvider(new BouncyCastleProvider());

    Enumeration<String> aliases = keystore.aliases();
    String aliaz = "";
    while (aliases.hasMoreElements()) {
        aliaz = aliases.nextElement();
        if (keystore.isKeyEntry(aliaz)) {
            break;
        }
    }

    Certificate[] certchain = (Certificate[]) keystore.getCertificateChain(aliaz);

    final List<Certificate> certlist = new ArrayList<Certificate>();

    for (int i = 0, length = certchain == null ? 0 : certchain.length; i < length; i++) {
        certlist.add(certchain[i]);
    }

    Store certstore = new JcaCertStore(certlist);

    Certificate cert = keystore.getCertificate(aliaz);

    ContentSigner signer = new JcaContentSignerBuilder(SIGNATUREALGO).setProvider("BC").
            build((PrivateKey) (keystore.getKey(aliaz, KEYSTORE_PASSWORD.toCharArray())));

    CMSSignedDataGenerator generator = new CMSSignedDataGenerator();

    generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider("BC").
            build()).build(signer, (X509Certificate) cert));

    generator.addCertificates(certstore);

    return generator;
}

private byte[] signPkcs7(final byte[] content, final CMSSignedDataGenerator generator) throws Exception {
    CMSTypedData cmsdata = new CMSProcessableByteArray(content);
    CMSSignedData signeddata = generator.generate(cmsdata, true);
    return signeddata.getEncoded();
}

public static void carregaCertificacaoAutenticacaoA1() throws Exception {
    System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

    System.clearProperty("javax.net.ssl.trustStore");
    System.clearProperty("javax.net.ssl.trustStorePassword");

    System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    System.setProperty("javax.net.ssl.trustStore", "/opt/jssecacerts");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
}

} `

Obrigado.

alissonwagner commented 7 years ago

Bom dia @willalberton, essa implementação eu mandei quarta-feira, recebi ela da empresa responsável pela API do bradesco, ela funciona perfeitamente.

O detalhe é que tu precisa de um certificado válido (em PATH_TO_KEYSTORE) e do registro do certificado do bradesco nos teus certificados confiáveis (método carregaCertificacaoAutenticacaoA1).

agichihara commented 7 years ago

@hgmauri bom dia! Poderia disponibilizar em C# Abrs