[quote=thingol]Experimente para ver se os providers da Sun (SunPKCS11, disponível a partir do Java 5.0, e SunMSCAPI, disponível a partir do java 6.0) conseguem efetuar as operações com seu token USB.
Eles dependem de o driver criptográfico estar corretamente instalado na máquina.
A configuração desses providers é feita através do arquivo java.security dentro do diretório jre/lib/security.
Uma vez consegui usar o SunPKCS11 - mas não sei se as operações criptográficas que você precisa são suportadas pelo SunPKCS11.
[/quote]
Com o codigo abaixo consigo “enxergar” várias informações do meu token:
public class Teste {
public static void main( String args[] ) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException {
Provider p = new sun.security.pkcs11.SunPKCS11(“c:/temp/security/security.cfg”);
Security.addProvider(p);
KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, new String("xxxxxx").toCharArray());
PrivateKey privateKey = (PrivateKey) ks.getKey("ALIAS", new String("xxxxxx").toCharArray());
Certificate certificate = (Certificate) ks.getCertificate("ALIAS");
System.out.println(privateKey.toString());
}
}
Conteúdo do arquivo de configuração:
name=Safenetikey2032
library=c:\windows\system32\dkck201.dll
attributes = compatibility
*** Essa DLL encontrei citada num exemplo da net e verifiquei que tinha no meu windows. Usei e deu “certo”, outra citada para o modelo do token (SafeNet ikey 2032) seria dkck2032.dll mas essa nao tenho e nao encontrei no site do fabricante para download ****
Isso me retorna para a chave privada:
SunPKCS11-Safenetikey2032 RSA private key, 1024 bits (id 2293760, token object, sensitive, unextractable)
O que gostaria de ajuda para entender seria:
-
Se é possível e como utilizar esse token USB para assinar um arquivo XML ?
-
Como configurar no java/netbeans o acesso ao web service via HTTPS usando o certificado contido nesse token ? O WS a ser acessado requer autenticação do cliente, isso já está como uma extensão do certificado do token.
Segue um código de teste de assinatura e a exceção levantada:
public class XMLSigner {
private static final String CANONICALIZE_METHOD = “http://www.w3.org/TR/2001/REC-xml-c14n-20010315”;
private static final String C14N_TRANSFORM_METHOD = “http://www.w3.org/TR/2001/REC-xml-c14n-20010315”;
private static final String PROVIDER_CLASS_NAME = “org.jcp.xml.dsig.internal.dom.XMLDSigRI”;
private static final String PROVIDER_NAME = “jsr105Provider”;
public static OutputStream sign( File inXML, File ouXML ) {
OutputStream os = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
// Obtem DOM do documento
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(inXML);
// Obtem elemento do documento a ser assinado, será criado uma REFERENCE para o mesmo
NodeList elements = doc.getElementsByTagName("infNFe");
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");
// Cria uma factory representando o elemento XML Signature, a partir dela serão criados as parte desse elemento
String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
// Cria método de Digest e canonicalização
DigestMethod digestMethod = signatureFactory.newDigestMethod(DigestMethod.SHA1, null);
C14NMethodParameterSpec c14NMethodParameterSpec = null;
CanonicalizationMethod canonicalMethod = signatureFactory.newCanonicalizationMethod(CANONICALIZE_METHOD, c14NMethodParameterSpec);
// Cria classe representando o Hash e algoritmo de criptografia a ser aplicado
SignatureMethod sm = signatureFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null);
// Cria a lista de tranformações a serem aplicadas as referencias a serem assinadas
ArrayList transformList = new ArrayList();
TransformParameterSpec tps = null;
Transform envelopedTransform = signatureFactory.newTransform(Transform.ENVELOPED, tps);
Transform c14NTransform = signatureFactory.newTransform(C14N_TRANSFORM_METHOD, tps);
transformList.add(envelopedTransform);
transformList.add(c14NTransform);
// Cria referencia, parte do XML a ser assinado
Reference ref = signatureFactory.newReference("#" + id, digestMethod, transformList, null, null);
ArrayList refList = new ArrayList();
refList.add(ref);
SignedInfo signedInfo = signatureFactory.newSignedInfo(canonicalMethod, sm, refList);
Provider p = new sun.security.pkcs11.SunPKCS11("c:/temp/security/security.cfg");
Security.addProvider(p);
KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, new String("inteqq").toCharArray());
PrivateKey privateKey = (PrivateKey) ks.getKey("4e1ece83-89de-4ae8-86f1-9564d7fdf945", new String("inteqq").toCharArray());
Certificate certificate = (Certificate) ks.getCertificate("4e1ece83-89de-4ae8-86f1-9564d7fdf945");
DOMSignContext dsc = new DOMSignContext(privateKey, doc.getDocumentElement());
KeyInfoFactory kif = signatureFactory.getKeyInfoFactory();
X509Data x509Data = kif.newX509Data(Collections.singletonList(certificate));
KeyInfo keyInfo = kif.newKeyInfo(Collections.singletonList(x509Data));
XMLSignature signature = signatureFactory.newXMLSignature(signedInfo, keyInfo);
signature. sign(dsc);
os = new FileOutputStream(ouXML);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
} catch (TransformerException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (MarshalException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (XMLSignatureException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnrecoverableKeyException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (CertificateException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (KeyStoreException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidAlgorithmParameterException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (SAXException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
} catch (ParserConfigurationException ex) {
Logger.getLogger(XMLSigner.class.getName()).log(Level.SEVERE, null, ex);
}
return os;
}
public static void main( String[] args ) {
OutputStream out = XMLSigner.sign(new File("c:/temp/entrada/teste-nfe.xml"), new File("c:/temp/entrada/teste-nfe-out.xml"));
}
}
Exceção:
01/02/2008 10:07:01 inteq.nfe.servicos.util.XMLSigner sign
SEVERE: null
javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.dsig.TransformException: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at org.jcp.xml.dsig.internal.dom.DOMSignedInfo.canonicalize(DOMSignedInfo.java:175)
at org.jcp.xml.dsig.internal.dom.DOMRSASignatureMethod.sign(DOMRSASignatureMethod.java:140)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:367)
at inteq.nfe.servicos.util.XMLSigner.sign(XMLSigner.java:128)
at inteq.nfe.servicos.util.XMLSigner.main(XMLSigner.java:169)
Caused by: javax.xml.crypto.dsig.TransformException: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer.transform(ApacheCanonicalizer.java:231)
at org.jcp.xml.dsig.internal.dom.DOMTransform.transform(DOMTransform.java:129)
at org.jcp.xml.dsig.internal.dom.DOMCanonicalizationMethod.canonicalize(DOMCanonicalizationMethod.java:67)
at org.jcp.xml.dsig.internal.dom.DOMSignedInfo.canonicalize(DOMSignedInfo.java:172)
… 4 more
Caused by: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at sun.security.pkcs11.P11Signature.engineUpdate(P11Signature.java:371)
at java.security.Signature$Delegate.engineUpdate(Signature.java:1118)
at java.security.Signature.update(Signature.java:684)
at org.jcp.xml.dsig.internal.SignerOutputStream.write(SignerOutputStream.java:68)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.flushBuffer(UnsyncBufferedOutputStream.java:62)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.flush(UnsyncBufferedOutputStream.java:78)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.close(UnsyncBufferedOutputStream.java:84)
at com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerBase.engineCanonicalizeSubTree(CanonicalizerBase.java:192)
at com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerBase.engineCanonicalize(CanonicalizerBase.java:138)
at com.sun.org.apache.xml.internal.security.transforms.implementations.TransformC14N.enginePerformTransform(TransformC14N.java:65)
at com.sun.org.apache.xml.internal.security.transforms.Transform.performTransform(Transform.java:350)
at org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer.transform(ApacheCanonicalizer.java:218)
… 7 more
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at sun.security.pkcs11.wrapper.PKCS11.C_SignUpdate(Native Method)
at sun.security.pkcs11.P11Signature.engineUpdate(P11Signature.java:365)
… 18 more
javax.xml.crypto.dsig.TransformException: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer.transform(ApacheCanonicalizer.java:231)
at org.jcp.xml.dsig.internal.dom.DOMTransform.transform(DOMTransform.java:129)
at org.jcp.xml.dsig.internal.dom.DOMCanonicalizationMethod.canonicalize(DOMCanonicalizationMethod.java:67)
at org.jcp.xml.dsig.internal.dom.DOMSignedInfo.canonicalize(DOMSignedInfo.java:172)
at org.jcp.xml.dsig.internal.dom.DOMRSASignatureMethod.sign(DOMRSASignatureMethod.java:140)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:367)
at inteq.nfe.servicos.util.XMLSigner.sign(XMLSigner.java:128)
at inteq.nfe.servicos.util.XMLSigner.main(XMLSigner.java:169)
Caused by: java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at sun.security.pkcs11.P11Signature.engineUpdate(P11Signature.java:371)
at java.security.Signature$Delegate.engineUpdate(Signature.java:1118)
at java.security.Signature.update(Signature.java:684)
at org.jcp.xml.dsig.internal.SignerOutputStream.write(SignerOutputStream.java:68)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.flushBuffer(UnsyncBufferedOutputStream.java:62)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.flush(UnsyncBufferedOutputStream.java:78)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.close(UnsyncBufferedOutputStream.java:84)
at com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerBase.engineCanonicalizeSubTree(CanonicalizerBase.java:192)
at com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerBase.engineCanonicalize(CanonicalizerBase.java:138)
at com.sun.org.apache.xml.internal.security.transforms.implementations.TransformC14N.enginePerformTransform(TransformC14N.java:65)
at com.sun.org.apache.xml.internal.security.transforms.Transform.performTransform(Transform.java:350)
at org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer.transform(ApacheCanonicalizer.java:218)
… 7 more
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at sun.security.pkcs11.wrapper.PKCS11.C_SignUpdate(Native Method)
at sun.security.pkcs11.P11Signature.engineUpdate(P11Signature.java:365)
… 18 more
java.security.ProviderException: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at sun.security.pkcs11.P11Signature.engineUpdate(P11Signature.java:371)
at java.security.Signature$Delegate.engineUpdate(Signature.java:1118)
at java.security.Signature.update(Signature.java:684)
at org.jcp.xml.dsig.internal.SignerOutputStream.write(SignerOutputStream.java:68)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.flushBuffer(UnsyncBufferedOutputStream.java:62)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.flush(UnsyncBufferedOutputStream.java:78)
at com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream.close(UnsyncBufferedOutputStream.java:84)
at com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerBase.engineCanonicalizeSubTree(CanonicalizerBase.java:192)
at com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerBase.engineCanonicalize(CanonicalizerBase.java:138)
at com.sun.org.apache.xml.internal.security.transforms.implementations.TransformC14N.enginePerformTransform(TransformC14N.java:65)
at com.sun.org.apache.xml.internal.security.transforms.Transform.performTransform(Transform.java:350)
at org.jcp.xml.dsig.internal.dom.ApacheCanonicalizer.transform(ApacheCanonicalizer.java:218)
at org.jcp.xml.dsig.internal.dom.DOMTransform.transform(DOMTransform.java:129)
at org.jcp.xml.dsig.internal.dom.DOMCanonicalizationMethod.canonicalize(DOMCanonicalizationMethod.java:67)
at org.jcp.xml.dsig.internal.dom.DOMSignedInfo.canonicalize(DOMSignedInfo.java:172)
at org.jcp.xml.dsig.internal.dom.DOMRSASignatureMethod.sign(DOMRSASignatureMethod.java:140)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:367)
at inteq.nfe.servicos.util.XMLSigner.sign(XMLSigner.java:128)
at inteq.nfe.servicos.util.XMLSigner.main(XMLSigner.java:169)
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_MECHANISM_INVALID
at sun.security.pkcs11.wrapper.PKCS11.C_SignUpdate(Native Method)
at sun.security.pkcs11.P11Signature.engineUpdate(P11Signature.java:365)
O que siginifica esse CKR_MECHANISM_INVALID ?
Desculpem o tamanho da mensagem.
Desde java agradeço qualquer ajudar.