ericmaicon / nfe

Projeto em PHP que contempla a criação do arquivo XML, assinatura, Validação do XSD e Envio para o SEFAZ de NFE (Nota fiscal Eletrônica).
20 stars 6 forks source link

Gerar parte final do certificado digital #5

Open batata004 opened 6 years ago

batata004 commented 6 years ago

Amigo,

Antes de mais nada gostaria de parabenizá-lo pela biblioteca, show de bola! Mas estou com uma dúvida.

Comprei o certificado do tipo A1 para emitir notas fiscais eletronicas na prefeitura aqui de Florianopolis. Já integrei todo o meu sistema com a API da Prefeitura e a forma de gerar a NFe é bem simples: eu realizo um POST contendo um XML e pronto, a Prefeitura gerará a NFe.

Minha dúvida é a seguinte: no final do arquivo XML há várias linhas que preciso preencher no formato abaixo, como que eu gero essas linhas usando tua biblioteca e usando o certificado do tipo A1? Eu procurei bastante no código e não descobri como que gero essa parte final do arquivo XML.

Grato por sua ajuda!


                <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Sign-4.938194207420864E7">

                    <ds:SignedInfo>

                        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/>
                        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                        <ds:Reference Id="RefElement-3.496850484729869E7" URI="">
                        <ds:Transforms>
                        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>KsPAoHg2H0y/wSrrOGRihebcE/g=</ds:DigestValue>
                        </ds:Reference>

                    </ds:SignedInfo>

                    <ds:SignatureValue Id="SignatureValueID-7.454649528132233E7">
                    CkDFTzGt0+vgVIYy6t5V2uClQU/1hWwjwEG/L9r3kkOmE11dBggoKhdyVpVFAjFjB5kFSUc309Vl yZv4uIeD11kHcAVlxGQ8JiGiv6wLC37lNp9bfHl67lIK4cgVxJHMyyiyNduoH2Ingq+JLw+J8q5V Qpc/gUTesSeOtjarBLtY4D0om7eMPjPldgRfKpwSg9FdmgID1UlFcBH6JvyTrdVAcYLC0Et8KKAx oqULFRgqBuu9Vcax7n8LrJLzLJqsqrqVFNRakwaKBedbpXICAO+MFh2Aeq8wiCtfDqRQ2oo5ODo2 syFEnpzgsjsO85cLgq9p0M3G3VlpFoeRwQnlMA==
                    </ds:SignatureValue>
                    <ds:KeyInfo>

                        <ds:X509Data>

                            <ds:X509IssuerSerial>

                                <ds:X509IssuerName>
                                CN=AC Instituto Fenacon RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR
                                </ds:X509IssuerName>
                                <ds:X509SerialNumber>1c28f49fd377eec2a94602f988f1d180</ds:X509SerialNumber>

                            </ds:X509IssuerSerial>

                            <ds:X509Certificate>
                            MIIIPDCCBiSgAwIBAgIQXF4X2+PUuWBo7SmU1Tak7zANBgkqhkiG9w0BAQsFADCBgDELMAkGA1UE BhMCQlIxEzARBgNVBAoTCklDUC1CcmFzaWwxNjA0BgNVBAsTLVNlY3JldGFyaWEgZGEgUmVjZWl0 YSBGZWRlcmFsIGRvIEJyYXNpbCAtIFJGQjEkMCIGA1UEAxMbQUMgSW5zdGl0dXRvIEZlbmFjb24g UkZCIEczMB4XDTE3MDUyMjE3MDEyMFoXDTE4MDUyMjE3MDEyMFowggEEMQswCQYDVQQGEwJCUjET MBEGA1UECgwKSUNQLUJyYXNpbDELMAkGA1UECAwCU0MxFjAUBgNVBAcMDUZMT1JJQU5PUE9MSVMx NjA0BgNVBAsMLVNlY3JldGFyaWEgZGEgUmVjZWl0YSBGZWRlcmFsIGRvIEJyYXNpbCAtIFJGQjEW MBQGA1UECwwNUkZCIGUtQ05QSiBBMTE3MDUGA1UECwwuQXV0ZW50aWNhZG8gcG9yIEFSIFNlc2Nv biBHcmFuZGUgRmxvcmlhbm9wb2xpczEyMDAGA1UEAwwpTVVOSUNJUElPIERFIEZMT1JJQU5PUE9M SVM6ODI4OTIyODIwMDEyMDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDh2FregECm Sik4UErbxsVVZYdj/ttf07qidaB+XOtXHxSpipAmCwyqBzaiXKUFyfFDHXzrvmYiFj8TUJ28xVzd InDkRnyi4xSIEt2ZUAkurVVed13y5eKj/NUDpJMCfvBvaTgxDsPggoBvPRCYNK8PsiwsqeGvsvY2 f8JaRp3gdGVuVtC68/x+3jdMWBoIRLd3nPRdEhy2TF96ux7eqV4WUY4KL2fQAXJjQp1HPHjOPBTl J9t0igtJn/5UFFNw2HmG4VytMS1tk4Bg7oOPq9PgGiZhiHVTXiMFq9byB8/9rVrQH4RYO5rGX6L7 7RfDmFuaDCPklV86PBWymcamBvB9AgMBAAGjggMpMIIDJTCBswYDVR0RBIGrMIGooD0GBWBMAQME oDQEMjA5MTAxOTcyODIzMzQxOTY5OTEwMDAwMDAwMDAwMDAwMDAwMDAwMDc3ODQ5NVNTUFNDoCAG BWBMAQMCoBcEFUdFQU4gTUFSUVVFUyBMT1VSRUlST6AZBgVgTAEDA6AQBA44Mjg5MjI4MjAwMTIw NKAXBgVgTAEDB6AOBAwwMDAwMDAwMDAwMDCBEW5mZUBwbWYuc2MuZ292LmJyMAkGA1UdEwQCMAAw HwYDVR0jBBgwFoAUJseUPXqHfn9LeIqHPeDPtc6psNowgYYGA1UdIAR/MH0wewYGYEwBAgEiMHEw bwYIKwYBBQUHAgEWY2h0dHA6Ly9pY3AtYnJhc2lsLmFjZmVuYWNvbi5jb20uYnIvcmVwb3NpdG9y aW8vZHBjL0FDLUluc3RpdHV0by1GZW5hY29uLVJGQi9EUENfQUNfSUZlbmFjb25fUkZCLnBkZjCB ygYDVR0fBIHCMIG/MF6gXKBahlhodHRwOi8vaWNwLWJyYXNpbC5hY2ZlbmFjb24uY29tLmJyL3Jl cG9zaXRvcmlvL2xjci9BQ0luc3RpdHV0b0ZlbmFjb25SRkJHMy9MYXRlc3RDUkwuY3JsMF2gW6BZ hldodHRwOi8vaWNwLWJyYXNpbC5vdXRyYWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDSW5z dGl0dXRvRmVuYWNvblJGQkczL0xhdGVzdENSTC5jcmwwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQW MBQGCCsGAQUFBwMCBggrBgEFBQcDBDCBuwYIKwYBBQUHAQEEga4wgaswZgYIKwYBBQUHMAKGWmh0 dHA6Ly9pY3AtYnJhc2lsLmFjZmVuYWNvbi5jb20uYnIvcmVwb3NpdG9yaW8vY2VydGlmaWNhZG9z L0FDX0luc3RpdHV0b19GZW5hY29uX1JGQkczLnA3YzBBBggrBgEFBQcwAYY1aHR0cDovL29jc3At YWMtaW5zdGl0dXRvLWZlbmFjb24tcmZiLmNlcnRpc2lnbi5jb20uYnIwDQYJKoZIhvcNAQELBQAD ggIBAERKrUntRX36Ar6JbK5ieGFvGU7D1OXAl3EQ8ACVTS9x9m2w03PU1f9SxFx5eyEtw5PTibQB THidvzGqYadUwogG0g5VQamnRUHyk9uSjmi8KpmbI5wX4G7Md+y5jqu2DRcwUWlko2FCEAk/x54L zplIY99MDDH1+Tawbj8PXbhZk2dzFrJXwLu+is6RyI9LwwJwLyWyeWzyuBI0WUYLE7jD3PgDO95b 4QTqDgNkd2dLaaUwk09L0BFPSMiPVavkW7BhkkXNtzC9S5p+Pk2qK67PVC7fFT4IyOg3+T4qPczp hY7eUKocLDU0vaP6iiMkxg5d1/hEbKT0KfoZLk5loy88BgdKMAHZkKFOPTnpMJYZA46UCj2dQG15 lM4nSGmwiwLY6UER1lxQe1NR2KRH65OAwDuGnapCoQqPNmycMC8DrZI/YL3nCY9UI5DUhb86Jhgx gdeBkMpdNe6Gx2NBLe/j46OAs+QqzW0fjkyd6NWLGVQVj18zR3EmqRF0UnV1uAkHUzPBgDfCN87y TwpN9byhROi2mVJ5sav3R3l7U1KYXnZXzkiM6NHrj/wgx3DtHmzdl+fGlGKI5rOIjYLyHS+cUF5e qPMLAgjE5X2w0Tdn8A33A/lQzoCszBMqZt+tuvFyqmeKYZrNi+b3ASsCPMclrcO5Zy5VBvsJL3s+ nqWN
                            </ds:X509Certificate>

                        </ds:X509Data>

                    </ds:KeyInfo>

                </ds:Signature>
ericmaicon commented 6 years ago

Olá, tudo bom?

Obrigado. Espero que tenha sido útil para ti. Acho que infelizmente você não vai conseguir assinar usando meu código. O certificado A1 é disponibilizado via dispositivos físicos, Vc precisaria ler o smartcard antes e pegar o certificado internamente para conseguir assinar. Eu fiz uma vez com java, mas acho que nem tenho mais o código para disponibilizar.

Abraços

batata004 commented 6 years ago

Obrigado amigo por sua resposta. Então, o certificado A3 é que exige o token (o dispositivo fisico), o A1 que possuo é o que não exige dispositivo físico... eu estou mesmo com duvida só para gerar a parte da autenticacao e estou empacado nisso há dias! Se puderes me ajudar seria de grande valia :)

ericmaicon commented 6 years ago

Confundi. Hehehe

A parte de assinatura eh uma simples classe q peguei do projeto nfephp.

Estou em viagem hoje. Chego dia 04. se não tiver conseguido resolver até lá, conseguirei te dar mais atenção

Abraços

batata004 commented 6 years ago

Amigo, agradeço imensamente! Desculpe lhe atrapalhar na sua viagem e se não tiveres tempo para me responder eu lhe aguardarei sim pois não estou encontrando outra alternativa.

Eu estou precisando mesmo saber como assinar o XML. Eu já consegui gerar o XML, ele tem uma estrutura bem simples, veja abaixo. A minha única dúvida (para não ficar tomando muito de seu tempo) é como que eu faço para assinar esse XML, ou seja, como que gero a parte lá em baixo no final de tudo. Eu já dei uma olhada no nfephp mas achei bastante confuso, eu pessoalmente nao conheco nada sobre certificados digitais e até cheguei fazer algumas perguntas na internet mas está realmente dificil achar alguem que saiba de fato como assinar.

OBRIGADO POR SUA ATENÇÃO e boa viagem! Ficarei no aguardo de sua generosidade para me ajudar nessa parte!

                <xmlProcessamentoNfpse>

                    <bairroTomador>XXX</bairroTomador>
                    <baseCalculo>XXX</baseCalculo>
                    <baseCalculoSubstituicao>XXX</baseCalculoSubstituicao>
                    <cfps>XXX</cfps>
                    <codigoMunicipioTomador>XXX</codigoMunicipioTomador>

...
...
....
.....
......
                    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Sign-4.938194207420864E7">

                        <ds:SignedInfo>

                            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/>
                            <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                            <ds:Reference Id="RefElement-3.496850484729869E7" URI="">
                            <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#WithComments"/>
                            </ds:Transforms>
                            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                            <ds:DigestValue>KsPAoHg2H0y/wSrrOGRihebcE/g=</ds:DigestValue>
                            </ds:Reference>

                        </ds:SignedInfo>

                        <ds:SignatureValue Id="SignatureValueID-7.454649528132233E7">
                        CkDFTzGt0+vgVIYy6t5V2uClQU/1hWwjwEG/L9r3kkOmE11dBggoKhdyVpVFAjFjB5kFSUc309Vl yZv4uIeD11kHcAVlxGQ8JiGiv6wLC37lNp9bfHl67lIK4cgVxJHMyyiyNduoH2Ingq+JLw+J8q5V Qpc/gUTesSeOtjarBLtY4D0om7eMPjPldgRfKpwSg9FdmgID1UlFcBH6JvyTrdVAcYLC0Et8KKAx oqULFRgqBuu9Vcax7n8LrJLzLJqsqrqVFNRakwaKBedbpXICAO+MFh2Aeq8wiCtfDqRQ2oo5ODo2 syFEnpzgsjsO85cLgq9p0M3G3VlpFoeRwQnlMA==
                        </ds:SignatureValue>
                        <ds:KeyInfo>

                            <ds:X509Data>

                                <ds:X509IssuerSerial>

                                    <ds:X509IssuerName>
                                    CN=AC Instituto Fenacon RFB G3, OU=Secretaria da Receita Federal do Brasil - RFB, O=ICP-Brasil, C=BR
                                    </ds:X509IssuerName>
                                    <ds:X509SerialNumber>1c28f49fd377eec2a94602f988f1d180</ds:X509SerialNumber>

                                </ds:X509IssuerSerial>

                                <ds:X509Certificate>
                                MIIIPDCCBiSgAwIBAgIQXF4X2+PUuWBo7SmU1Tak7zANBgkqhkiG9w0BAQsFADCBgDELMAkGA1UE BhMCQlIxEzARBgNVBAoTCklDUC1CcmFzaWwxNjA0BgNVBAsTLVNlY3JldGFyaWEgZGEgUmVjZWl0 YSBGZWRlcmFsIGRvIEJyYXNpbCAtIFJGQjEkMCIGA1UEAxMbQUMgSW5zdGl0dXRvIEZlbmFjb24g UkZCIEczMB4XDTE3MDUyMjE3MDEyMFoXDTE4MDUyMjE3MDEyMFowggEEMQswCQYDVQQGEwJCUjET MBEGA1UECgwKSUNQLUJyYXNpbDELMAkGA1UECAwCU0MxFjAUBgNVBAcMDUZMT1JJQU5PUE9MSVMx NjA0BgNVBAsMLVNlY3JldGFyaWEgZGEgUmVjZWl0YSBGZWRlcmFsIGRvIEJyYXNpbCAtIFJGQjEW MBQGA1UECwwNUkZCIGUtQ05QSiBBMTE3MDUGA1UECwwuQXV0ZW50aWNhZG8gcG9yIEFSIFNlc2Nv biBHcmFuZGUgRmxvcmlhbm9wb2xpczEyMDAGA1UEAwwpTVVOSUNJUElPIERFIEZMT1JJQU5PUE9M SVM6ODI4OTIyODIwMDEyMDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDh2FregECm Sik4UErbxsVVZYdj/ttf07qidaB+XOtXHxSpipAmCwyqBzaiXKUFyfFDHXzrvmYiFj8TUJ28xVzd InDkRnyi4xSIEt2ZUAkurVVed13y5eKj/NUDpJMCfvBvaTgxDsPggoBvPRCYNK8PsiwsqeGvsvY2 f8JaRp3gdGVuVtC68/x+3jdMWBoIRLd3nPRdEhy2TF96ux7eqV4WUY4KL2fQAXJjQp1HPHjOPBTl J9t0igtJn/5UFFNw2HmG4VytMS1tk4Bg7oOPq9PgGiZhiHVTXiMFq9byB8/9rVrQH4RYO5rGX6L7 7RfDmFuaDCPklV86PBWymcamBvB9AgMBAAGjggMpMIIDJTCBswYDVR0RBIGrMIGooD0GBWBMAQME oDQEMjA5MTAxOTcyODIzMzQxOTY5OTEwMDAwMDAwMDAwMDAwMDAwMDAwMDc3ODQ5NVNTUFNDoCAG BWBMAQMCoBcEFUdFQU4gTUFSUVVFUyBMT1VSRUlST6AZBgVgTAEDA6AQBA44Mjg5MjI4MjAwMTIw NKAXBgVgTAEDB6AOBAwwMDAwMDAwMDAwMDCBEW5mZUBwbWYuc2MuZ292LmJyMAkGA1UdEwQCMAAw HwYDVR0jBBgwFoAUJseUPXqHfn9LeIqHPeDPtc6psNowgYYGA1UdIAR/MH0wewYGYEwBAgEiMHEw bwYIKwYBBQUHAgEWY2h0dHA6Ly9pY3AtYnJhc2lsLmFjZmVuYWNvbi5jb20uYnIvcmVwb3NpdG9y aW8vZHBjL0FDLUluc3RpdHV0by1GZW5hY29uLVJGQi9EUENfQUNfSUZlbmFjb25fUkZCLnBkZjCB ygYDVR0fBIHCMIG/MF6gXKBahlhodHRwOi8vaWNwLWJyYXNpbC5hY2ZlbmFjb24uY29tLmJyL3Jl cG9zaXRvcmlvL2xjci9BQ0luc3RpdHV0b0ZlbmFjb25SRkJHMy9MYXRlc3RDUkwuY3JsMF2gW6BZ hldodHRwOi8vaWNwLWJyYXNpbC5vdXRyYWxjci5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDSW5z dGl0dXRvRmVuYWNvblJGQkczL0xhdGVzdENSTC5jcmwwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQW MBQGCCsGAQUFBwMCBggrBgEFBQcDBDCBuwYIKwYBBQUHAQEEga4wgaswZgYIKwYBBQUHMAKGWmh0 dHA6Ly9pY3AtYnJhc2lsLmFjZmVuYWNvbi5jb20uYnIvcmVwb3NpdG9yaW8vY2VydGlmaWNhZG9z L0FDX0luc3RpdHV0b19GZW5hY29uX1JGQkczLnA3YzBBBggrBgEFBQcwAYY1aHR0cDovL29jc3At YWMtaW5zdGl0dXRvLWZlbmFjb24tcmZiLmNlcnRpc2lnbi5jb20uYnIwDQYJKoZIhvcNAQELBQAD ggIBAERKrUntRX36Ar6JbK5ieGFvGU7D1OXAl3EQ8ACVTS9x9m2w03PU1f9SxFx5eyEtw5PTibQB THidvzGqYadUwogG0g5VQamnRUHyk9uSjmi8KpmbI5wX4G7Md+y5jqu2DRcwUWlko2FCEAk/x54L zplIY99MDDH1+Tawbj8PXbhZk2dzFrJXwLu+is6RyI9LwwJwLyWyeWzyuBI0WUYLE7jD3PgDO95b 4QTqDgNkd2dLaaUwk09L0BFPSMiPVavkW7BhkkXNtzC9S5p+Pk2qK67PVC7fFT4IyOg3+T4qPczp hY7eUKocLDU0vaP6iiMkxg5d1/hEbKT0KfoZLk5loy88BgdKMAHZkKFOPTnpMJYZA46UCj2dQG15 lM4nSGmwiwLY6UER1lxQe1NR2KRH65OAwDuGnapCoQqPNmycMC8DrZI/YL3nCY9UI5DUhb86Jhgx gdeBkMpdNe6Gx2NBLe/j46OAs+QqzW0fjkyd6NWLGVQVj18zR3EmqRF0UnV1uAkHUzPBgDfCN87y TwpN9byhROi2mVJ5sav3R3l7U1KYXnZXzkiM6NHrj/wgx3DtHmzdl+fGlGKI5rOIjYLyHS+cUF5e qPMLAgjE5X2w0Tdn8A33A/lQzoCszBMqZt+tuvFyqmeKYZrNi+b3ASsCPMclrcO5Zy5VBvsJL3s+ nqWN
                                </ds:X509Certificate>

                            </ds:X509Data>

                        </ds:KeyInfo>

                    </ds:Signature>

                </xmlProcessamentoNfpse>
batata004 commented 6 years ago

No NFEPHP tem um código de exemplo mais ou menos como o abaixo. O problema é que ele nao possui um parametro onde forneco o meu arquivo do certificado :/

require_once("ToolsNFe.php");

// Instancia um objeto da classe "Tools" da API. $tools = new ToolsNFePHP();

// Esta variável deve conter o XML inteiro da NF-e a ser assinada. $sXml = '<?xml version="1.0" encoding="utf-8"><NFe ... ';

// Chama o método "signXML()" da API. $sXmlAssinado = $this->toolsNFe->signXML($sXml, 'infNFe');

ericmaicon commented 6 years ago

Na teoria VC só precisa colocar seu XML dentro de um DocElement, chamar a função da URL abaixo e escolher qual tag VC vai assinar. A tag deve seguir a documentação da nfe. No caso do nfe eh a infNfe, por exemplo

https://github.com/ericmaicon/nfe/blob/master/lib/helpers/XmlHelper.php

Veja se te ajuda

batata004 commented 6 years ago

Joia, amigo obrigado pela ajuda! Vamos lá, comecei testando o seu próprio codigo de exemplo em emissao.php e quando executo essa pagina no meu navegador aparece o seguinte (eu salvei um certificado .pem no diretorio correto).

image

ericmaicon commented 6 years ago

Provavelmente sua chave ta no formato inválido...se lembro vem deve ser .PEM. No final do readme tem como converter.

Falta curl no seu ambiente tb

batata004 commented 6 years ago

Sim, o curl vou instalar. O estranho é que no seu arquivo emissao.php não encontrei nenhuma linha que faça a autenticacao do documento. Eu nao sou muito acosumado com PHP mas por favor me ajude nessa questão:

1) importarei o arquivo https://github.com/ericmaicon/nfe/blob/master/lib/helpers/XmlHelper.php no meu projeto usando include("XmlHelper.php");

2) gerarei o meu XML num DocElement;

3) Qual o nome da funcao que devo executar para autenticar o XML com um arquivo *.pem? Eu passo o nome do arquivo .pem como parametro?

Sei que na sua excelente biblioteca vc faz uso do arquivo conf.ini mas se eu for usar somente esse recurso de autenticar acima, como que faço?