Skip to content

Commit

Permalink
Merge pull request #149 from wmixvideo/assinatura
Browse files Browse the repository at this point in the history
Nova versão com suporte a qualquer tipo de cetificado.
  • Loading branch information
fincatto committed May 21, 2016
2 parents 2d49211 + a2d9089 commit a41bc49
Show file tree
Hide file tree
Showing 86 changed files with 1,249 additions and 1,636 deletions.
80 changes: 33 additions & 47 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Nota Fiscal Eletrônica
Comunicador de nota fiscal da [fazenda](http://www.nfe.fazenda.gov.br/portal/principal.aspx).<br/>
[![Build Status](https://api.travis-ci.org/wmixvideo/nfe.png)](http://travis-ci.org/#!/wmixvideo/nfe)
[![Coverage Status](https://coveralls.io/repos/wmixvideo/nfe/badge.svg?branch=master&service=github)](https://coveralls.io/github/wmixvideo/nfe?branch=master)
[![Maven Central](https://img.shields.io/badge/maven%20central-1.1.14-blue.svg)](http://search.maven.org/#artifactdetails|com.github.wmixvideo|nfe|1.1.14|)
[![Maven Central](https://img.shields.io/badge/maven%20central-1.2.0-blue.svg)](http://search.maven.org/#artifactdetails|com.github.wmixvideo|nfe|1.2.0|)
[![Apache 2.0 License](https://img.shields.io/badge/license-apache%202.0-green.svg) ](https://github.com/wmixvideo/nfe/blob/master/LICENSE)

## Atenção
Expand All @@ -22,7 +22,7 @@ Caso não possua conhecimento técnico para criar notas fiscais, um profissional
<dependency>
<groupId>com.github.wmixvideo</groupId>
<artifactId>nfe</artifactId>
<version>1.1.14</version>
<version>1.2.0</version>
</dependency>
```

Expand All @@ -33,67 +33,53 @@ comunicação com os webservices da Sefaz.

```java
// Exemplo de configuracao para acesso aos serviços da Sefaz.
public class ConfiguracaoSefaz implements NFeConfig {
public class NFeConfigTeste extends NFeConfig {

private final boolean ehAmbienteDeTeste;

public ConfiguracaoSefaz(final boolean ehAmbienteDeTeste) {
this.ehAmbienteDeTeste = ehAmbienteDeTeste;
}

@Override
public NFAmbiente getAmbiente() {
return this.ehAmbienteDeTeste ? NFAmbiente.HOMOLOGACAO : NFAmbiente.PRODUCAO;
}

@Override
public File getCertificado() throws IOException {
try (InputStream is = CertificadoUtils.class.getResource("certificado.pfx").openStream()) {
return IOUtils.toByteArray(is);
}
}
private KeyStore keyStoreCertificado = null;
private KeyStore keyStoreCadeia = null;

@Override
public File getCadeiaCertificados() throws IOException {
try (InputStream is = CertificadoUtils.class.getResource("cadeia_certificado.jks").openStream()) {
return IOUtils.toByteArray(is);
}
public NFUnidadeFederativa getCUF() {
return NFUnidadeFederativa.SC;
}

@Override
public String getCertificadoSenha() {
return "senhaDoCertificado";
return "senha_certificado";
}

@Override
public String getCadeiaCertificadosSenha() {
return "senhaDaCadeiaDeCertificados";
}

@Override
public NFUnidadeFederativa getCUF() {
return NFUnidadeFederativa.SC;
public String getCadeiaCertificadosSenha() {
return "senha_cadeia";
}

@Override
public NFTipoEmissao getTipoEmissao() {
return NFTipoEmissao.EMISSAO_NORMAL;
public KeyStore getCertificadoKeyStore() throws KeyStoreException {
if (this.keyStoreCertificado == null) {
this.keyStoreCertificado = KeyStore.getInstance("PKCS12");
try (InputStream certificadoStream = new FileInputStream("/tmp/certificado.pfx")) {
this.keyStoreCertificado.load(certificadoStream, this.getCertificadoSenha().toCharArray());
} catch (CertificateException | NoSuchAlgorithmException | IOException e) {
this.keyStoreCadeia = null;
throw new KeyStoreException("Nao foi possibel montar o KeyStore com a cadeia de certificados", e);
}
}
return this.keyStoreCertificado;
}

@Override
public String getSSLProtocolo() {
return "TLSv1";
}

@Override
public Integer getCodigoSegurancaContribuinteID() {
return null;
}

@Override
public String getCodigoSegurancaContribuinte() {
return null;
}
public KeyStore getCadeiaCertificadosKeyStore() throws KeyStoreException {
if (this.keyStoreCadeia == null) {
this.keyStoreCadeia = KeyStore.getInstance("JKS");
try (InputStream cadeia = new FileInputStream("/tmp/cadeia.jks")) {
this.keyStoreCadeia.load(cadeia, this.getCadeiaCertificadosSenha().toCharArray());
} catch (CertificateException | NoSuchAlgorithmException | IOException e) {
this.keyStoreCadeia = null;
throw new KeyStoreException("Nao foi possibel montar o KeyStore com o certificado", e);
}
}
return this.keyStoreCadeia;
}
}
```

Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<groupId>com.github.wmixvideo</groupId>
<artifactId>nfe</artifactId>
<packaging>jar</packaging>
<version>1.1.15-SNAPSHOT</version>
<version>1.2.0-SNAPSHOT</version>
<name>nfe</name>
<description>Biblioteca de comunicacao de nota fiscal eletronica brasileira</description>
<url>https://github.com/wmixvideo/nfe</url>
Expand All @@ -26,7 +26,7 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<axis2.version>1.6.3</axis2.version>
<axis2.version>1.6.4</axis2.version>
<joda.version>2.9.3</joda.version>
<junit.version>4.12</junit.version>
</properties>
Expand Down
102 changes: 87 additions & 15 deletions src/main/java/com/fincatto/nfe310/NFeConfig.java
Original file line number Diff line number Diff line change
@@ -1,33 +1,105 @@
package com.fincatto.nfe310;

import java.io.IOException;

import com.fincatto.nfe310.classes.NFAmbiente;
import com.fincatto.nfe310.classes.NFTipoEmissao;
import com.fincatto.nfe310.classes.NFUnidadeFederativa;

public interface NFeConfig {
import java.security.KeyStore;
import java.security.KeyStoreException;

/**
* Configuração basica do sistema de notas fiscais.
*/
public abstract class NFeConfig {

String VERSAO_NFE = "3.10";
String NFE_NAMESPACE = "http://www.portalfiscal.inf.br/nfe";
public static final String VERSAO_NFE = "3.10";
public static final String NFE_NAMESPACE = "http://www.portalfiscal.inf.br/nfe";

NFAmbiente getAmbiente();
/**
* Indica o ambiente de trabalho, se em produção ou homologação.
*
* @return Ambiente de trabalho.
*/
public NFAmbiente getAmbiente() {
return NFAmbiente.HOMOLOGACAO;
}

byte[] getCertificado() throws IOException;
/**
* Unidade da federação do emissor das notas.
*
* @return Unidade da federação do emissor.
*/
public abstract NFUnidadeFederativa getCUF();

byte[] getCadeiaCertificados() throws IOException;
/**
* KeyStore contendo o certificado pessoal do emissor. <br>
* Esse certificado é fornecido por uma autoridade certificadora. <br>
* Em caso de dúvidas, consulte seu contador.
*
* @return KeyStore do certificado pessoal.
* @throws KeyStoreException Caso não consiga carregar o KeyStore.
*/
public abstract KeyStore getCertificadoKeyStore() throws KeyStoreException;

String getCertificadoSenha();
/**
* Senha do certificado pessoal do emissor, contido dentro do KeyStore do certificado.
*
* @return Senha do certificado.
* @see #getCertificadoKeyStore()
*/
public abstract String getCertificadoSenha();

String getCadeiaCertificadosSenha();
/**
* KeyStore contendo a cadeia de certificados da SEFAZ de destino. <br>
* Para gerar a cadeia, use o utilitário fornecido com a biblioteca:<br>
* FileUtils.writeByteArrayToFile(new File("/tmp/producao.cacerts"), NFGeraCadeiaCertificados.geraCadeiaCertificados(NFAmbiente.PRODUCAO, "senha"));
*
* @return KeyStore da cadeia de certificados.
* @throws KeyStoreException Caso nao consiga carregar o KeyStore.
*/
public abstract KeyStore getCadeiaCertificadosKeyStore() throws KeyStoreException;

NFUnidadeFederativa getCUF();
/**
* Senha da cadeia de certificados, contida dentro do KeyStore da cadeia.
*
* @return Senha da cadeia de certificados.
* @see #getCadeiaCertificadosKeyStore()
*/
public abstract String getCadeiaCertificadosSenha();

NFTipoEmissao getTipoEmissao();
/**
* ID de contribuinte, somente para NFCe.
*
* @return ID do contribuinte.
*/
public Integer getCodigoSegurancaContribuinteID() {
return null;
}

String getSSLProtocolo();
/**
* Codigo de seguranca do contribuinte, com 36 caracteres, somente para NFCe.
*
* @return Codigo de segurança do contribuinte.
*/
public String getCodigoSegurancaContribuinte() {
return null;
}

Integer getCodigoSegurancaContribuinteID();
/**
* Tipo da emissão das notas (se normal ou em contingência).
*
* @return Tipo da emissão das notas.
*/
public NFTipoEmissao getTipoEmissao() {
return NFTipoEmissao.EMISSAO_NORMAL;
}

String getCodigoSegurancaContribuinte();
/**
* Protocolo de SSL, usado pela SEFAZ para receber as notas.
*
* @return Protocolo SSL da SEFAZ de origem.
*/
public String getSSLProtocolo() {
return "TLSv1";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
Expand Down Expand Up @@ -75,12 +74,9 @@ public boolean isValida(final InputStream xmlStream) throws Exception {
}

public String assinarDocumento(final String conteudoXml) throws Exception {
final KeyStore keyStore = KeyStore.getInstance("PKCS12");
try (InputStream certificadoStream = new ByteArrayInputStream(this.config.getCertificado())) {
keyStore.load(certificadoStream, this.config.getCertificadoSenha().toCharArray());
}

final KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(keyStore.aliases().nextElement(), new KeyStore.PasswordProtection(this.config.getCertificadoSenha().toCharArray()));
final String certificateAlias = config.getCertificadoKeyStore().aliases().nextElement();
final KeyStore.PasswordProtection passwordProtection = new KeyStore.PasswordProtection(this.config.getCertificadoSenha().toCharArray());
final KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) config.getCertificadoKeyStore().getEntry(certificateAlias, passwordProtection);
final XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");

final List<Transform> transforms = new ArrayList<>(2);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/fincatto/nfe310/classes/NFAmbiente.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public enum NFAmbiente {

private final String codigo;

private NFAmbiente(final String codigo) {
NFAmbiente(final String codigo) {
this.codigo = codigo;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public enum NFFinalidade {
private final String codigo;
private final String descricao;

private NFFinalidade(final String codigo, final String descricao) {
NFFinalidade(final String codigo, final String descricao) {
this.codigo = codigo;
this.descricao = descricao;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
package com.fincatto.nfe310.classes;

public enum NFFormaPagamentoPrazo {

A_VISTA("0", "A vista"),
A_PRAZO("1", "A prazo"),
OUTROS("2", "Outros");

private final String codigo;
private final String descricao;
private NFFormaPagamentoPrazo(final String codigo, final String descricao) {

NFFormaPagamentoPrazo(final String codigo, final String descricao) {
this.codigo = codigo;
this.descricao = descricao;
}

public String getCodigo() {
return this.codigo;
}

public String getDescricao() {
return this.descricao;
}

public static NFFormaPagamentoPrazo valueOfCodigo(final String codigo) {
for (NFFormaPagamentoPrazo formaPagamento : NFFormaPagamentoPrazo.values()) {
if (formaPagamento.getCodigo().equals(codigo)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public enum NFModalidadeFrete {

private String codigo;

private NFModalidadeFrete(final String codigo) {
NFModalidadeFrete(final String codigo) {
this.codigo = codigo;
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/fincatto/nfe310/classes/NFModelo.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public enum NFModelo {

private final String codigo;

private NFModelo(final String codigo) {
NFModelo(final String codigo) {
this.codigo = codigo;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public enum NFNotaInfoCombustivelTipo {

private String codigo;

private NFNotaInfoCombustivelTipo(final String codigo) {
NFNotaInfoCombustivelTipo(final String codigo) {
this.codigo = codigo;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public enum NFNotaInfoEspecieVeiculo {

private String codigo;

private NFNotaInfoEspecieVeiculo(final String codigo) {
NFNotaInfoEspecieVeiculo(final String codigo) {
this.codigo = codigo;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public enum NFNotaInfoImpostoTributacaoICMS {

String codigo;

private NFNotaInfoImpostoTributacaoICMS(final String codigo) {
NFNotaInfoImpostoTributacaoICMS(final String codigo) {
this.codigo = codigo;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public enum NFNotaInfoImpostoTributacaoISSQN {

private String codigo;

private NFNotaInfoImpostoTributacaoISSQN(final String codigo) {
NFNotaInfoImpostoTributacaoISSQN(final String codigo) {
this.codigo = codigo;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public enum NFNotaInfoItemImpostoICMSModalidadeBaseCalculo {
private final String codigo;
private final String descricao;

private NFNotaInfoItemImpostoICMSModalidadeBaseCalculo(final String codigo, final String descricao) {
NFNotaInfoItemImpostoICMSModalidadeBaseCalculo(final String codigo, final String descricao) {
this.codigo = codigo;
this.descricao = descricao;
}
Expand Down
Loading

0 comments on commit a41bc49

Please sign in to comment.