Bom dia Pessoal,
Gostaria que me ajudassem com uma questão.
Tenho um assinador digital que é uma applet.
Essa applet assina um arquivo pdf, usando a API iText.
O assinador funciona perfeitamente em todas as máquinas exceto em uma máquina só, que na hora de fechar o arquivo (PDFStamper.close())
me retorna a seguinte exceção:
java.lang.NoSuchFieldError: INSTANCE
at com.itextpdf.text.pdf.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:1200)
at com.itextpdf.text.pdf.PdfPKCS7.getEncodedPKCS7(PdfPKCS7.java:1151)
at com.itextpdf.text.pdf.PdfSigGenericPKCS.setSignInfo(PdfSigGenericPKCS.java:107)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:973)
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:897)
at com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:192)
at AssinadorDigitalApplet.assinaDocumento(AssinadorDigitalApplet.java:854)
at AssinadorDigitalApplet.signFile(AssinadorDigitalApplet.java:685)
at AssinadorDigitalApplet.signSelectedFile(AssinadorDigitalApplet.java:462)
at AssinadorDigitalApplet.init(AssinadorDigitalApplet.java:160)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
abaixo segue o metodo assinaDocumento:
[code]
System.out.println("*******************************************Entrou no metodo assina documento*************************************************");
PdfReader reader;
PrivateKey key;
java.security.cert.Certificate[] chain = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
String cpf = "";
String email = "";
String location = "";
try {
System.out.println("Instancia parametros da assinatura digital");
KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, aPinCode.toCharArray());
String alias = (String)ks.aliases().nextElement();
key = (PrivateKey)ks.getKey(alias,aPinCode.toCharArray());
chain = ks.getCertificateChain(alias);
System.out.println("Cria objeto para guardar arquivo pdf");
reader = new PdfReader(aDocumentToSign);
//PdfStamper stp = PdfStamper.createSignature(reader, os, '\0');
System.out.println("Cria assinatura no pdfStamper");
PdfStamper stp = PdfStamper.createSignature(reader, os, '\0', null, true);
PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("Eu sou o autor");
sap.setLocation("AGU");
// comente a linha abaixo caso queira uma assinatura invisivel
//sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
System.out.println("inclui certificado X509");
String nome = PdfPKCS7.getSubjectFields((X509Certificate)chain[0]).getField("CN");
//------------------------------------------------------------------------------------------------
// CPF
//------------------------------------------------------------------------------------------------
System.out.println("Captura dados da assinatura");
X509Certificate cert = (X509Certificate)chain[0];
for (List<?> subjectAlternativeName : cert.getSubjectAlternativeNames()) {
Pair<DERObjectIdentifier, String> otherName;
int pos;
// O primeiro elemento é um Integer com o valor 0 = otherName, 1 = rfc822name etc.
// O segundo valor é um byte array ou uma String. Veja o javadoc de
// getSubjectAlternativeNames.
switch (((Number) subjectAlternativeName.get(0)).intValue()) {
case 0: // OtherName - contém CPF, CNPJ etc.
otherName = getOtherName((byte[]) subjectAlternativeName.get(1));
String t2 = otherName.second;
if (otherName.first.toString().equals("2.16.76.1.3.1")){
cpf = t2.substring(8, 19);
}
// o OID fica em otherName.first
break;
case 1: // rfc822Name - usado para email
email = (String) subjectAlternativeName.get(1);
//props.put("email", email);
break;
default:
break;
}
}
System.out.println("Verifica responsavel");
System.out.println("indicador de verificação de responsavel: " + inVerificarResponsavel);
if (inVerificarResponsavel.equals("1")){
System.out.println("inicia verificação de responsável");
//Busca pessoa
if (dsAmbiente.equalsIgnoreCase("producao")){
location = "";
}else{
if(dsAmbiente.equalsIgnoreCase("homologacao")){
location = "";
}else{
if (dsAmbiente.equalsIgnoreCase("desenvolvimento") || dsAmbiente.equalsIgnoreCase("gesis") || dsAmbiente.equalsIgnoreCase("clone")){
location = "";
//location = "";
}
}
}
System.out.println("Location: " + location);
HttpURLConnection con = (HttpURLConnection) getServletConnection(location);
ObjectInputStream inputFromServletPessoa = new ObjectInputStream(con.getInputStream());
PessoaBean pessoa = (PessoaBean) inputFromServletPessoa.readObject();
inputFromServletPessoa.close();
System.out.println("Buscou pessoa");
if (!pessoa.getCpf().equals(cpf)){
System.out.println("Token do assinador não corresponde ao proprietário do documento.");
autoriza = "Nao";
os = null;
retornoApplet(hdnRetorno, "Propietario token");
log.setIdMidia(Integer.parseInt(midia));
log.setErro("Token do assinador não corresponde ao proprietário do documento.");
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
throw new Exception("Token do assinador não corresponde ao proprietário do documento.");
}
}
System.out.println("Verifica se é para colocar a chancela");
if (inChancela.equalsIgnoreCase("1") && inMultiplasAssinaturas.equals("0")){
System.out.println("Coloca Chancela");
String chancela = formatar(cpf, "###.###.###-##") + " - " + nome;
//-----------------------------------------------------------------------
// Chancela
//-----------------------------------------------------------------------
for (int page = 1; page <= reader.getNumberOfPages(); page++){
PdfContentByte conteudoPdfByte = stp.getOverContent(page);
conteudoPdfByte.beginText();
BaseFont baseFont = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
conteudoPdfByte.setFontAndSize(baseFont, 9);
conteudoPdfByte.showTextAligned(conteudoPdfByte.ALIGN_CENTER, chancela, conteudoPdfByte.getPdfDocument().getPageSize().getWidth() - 20, conteudoPdfByte.getPdfDocument().getPageSize().getHeight()/2, 90);
conteudoPdfByte.endText();
}
}
System.out.println("fecha stamper do pdf");
stp.close(); //(Parte que provoca a excecão)
} catch (IOException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (DocumentException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (KeyStoreException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (CertificateException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (InstantiationException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (IllegalAccessException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (ClassNotFoundException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (SQLException e) {
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
} catch (Exception e) {
System.out.println("Erro na instancia do arquivo");
log.setIdMidia(Integer.parseInt(midia));
log.setErro(e.getMessage());
log.setEtapa("Assinando arquivo");
gravaLog(log, dsAmbiente);
e.printStackTrace();
}
System.out.println("retorna arquivo assinado");
return os;
}[/code]
Eu ja desisntalei e reinstalei o plugin java, ja desinstalei e reinstalei o browser. Não sei o que pode esta ocasionando esse erro. Se alguém puder me ajudar.
Obrigado