2012-02-07 24 views
1

データベースから正しく取得された秘密鍵と証明書でXML文書に署名しようとしています。この私有鍵と証明書は私に与えられたので、私はJavaにおけるプロバイダの同等性についてはあまりよく分かりません。私はこれを行うために実装this tutorial証明書と秘密鍵を使用してJavaでXML文書に署名するにはどうすればよいですか?

コードを使用するXML文書に署名するため、次のとおりです。

 PrivateKey pk = null; 
     javax.security.cert.X509Certificate cert = null; 
     try{ 
      ByteArrayInputStream bis = new ByteArrayInputStream(keyCer.getLlave()); 
      ObjectInput in = new ObjectInputStream(bis); 
      pk = (PrivateKey) in.readObject(); 
      bis.close(); 

      bis = new ByteArrayInputStream(keyCer.getCertificado()); 
      in = new ObjectInputStream(bis); 
      cert = (javax.security.cert.X509Certificate) in.readObject(); 
      bis.close(); 

      keyCer.setCertB64(Base64.encodeBase64String(cert.getEncoded())); 

      DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); 
      dbfac.setNamespaceAware(true); 
      DocumentBuilder docBuilder; 
      docBuilder = dbfac.newDocumentBuilder(); 
      DOMImplementation domImpl = docBuilder.getDOMImplementation(); 
      Document doc = domImpl.createDocument("http://cancelacfd.sat.gob.mx", "Cancelacion", null); 
      doc.setXmlVersion("1.0"); 
      doc.setXmlStandalone(true); 

      Element cancelacion = doc.getDocumentElement(); 
      cancelacion.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xsd","http://www.w3.org/2001/XMLSchema"); 
      cancelacion.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"); 
      cancelacion.setAttribute("RfcEmisor", rfc); 
      cancelacion.setAttribute("Fecha", fecha); 

      Element folios = doc.createElement("Folios"); 
      cancelacion.appendChild(folios); 
      for (int i=0; i<uuid.length; i++) { 
       Element u = doc.createElement("UUID"); 
       u.setTextContent(uuid[i]); 
       folios.appendChild(u); 
      } 

      DOMSignContext dsc = new DOMSignContext (pk, doc.getDocumentElement()); 
      XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); 

      Reference ref = fac.newReference ("", fac.newDigestMethod(DigestMethod.SHA1, null), 
         Collections.singletonList 
         (fac.newTransform(Transform.ENVELOPED, 
         (TransformParameterSpec) null)), null, null); 

      SignedInfo si = fac.newSignedInfo 
         (fac.newCanonicalizationMethod 
         (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, 
          (C14NMethodParameterSpec) null), 
         fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null), 
         Collections.singletonList(ref)); 

      KeyInfoFactory kif = fac.getKeyInfoFactory(); 
      KeyValue kv = kif.newKeyValue(cert.getPublicKey()); 
      KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv)); 

      XMLSignature signature = fac.newXMLSignature(si, ki); 

      signature.sign(dsc); 

      TransformerFactory transfac = TransformerFactory.newInstance(); 
      Transformer trans = transfac.newTransformer(); 
      trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
      trans.setOutputProperty(OutputKeys.VERSION, "1.0"); 
      trans.setOutputProperty(OutputKeys.INDENT, "yes"); 

      //CREAR STRING DEL ARBOL XML 
      StringWriter sw = new StringWriter(); 
      StreamResult result = new StreamResult(sw); 
      DOMSource source = new DOMSource(doc); 
      trans.transform(source, result); 
      String xmlString = sw.toString(); 
      System.out.println(xmlString); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

プログラムを実行しているとき、私は次の例外を取得:

javax.xml.crypto.dsig.XMLSignatureException: java.security.InvalidKeyException: No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl 
    [java]  at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(Unknown Source) 
    [java]  at prueba.cancelaciones.CancelaFE.doPost(CancelaFE.java:140) 
    [java]  at prueba.cancelaciones.CancelaFE.doGet(CancelaFE.java:66) 
    [java]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    [java]  at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    [java]  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306) 
    [java]  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    [java]  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
    [java]  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) 
    [java]  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    [java]  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    [java]  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541) 
    [java]  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    [java]  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383) 
    [java]  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243) 
    [java]  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
    [java]  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
    [java]  at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288) 
    [java]  at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    [java]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    [java]  at java.lang.Thread.run(Unknown Source) 
    [java] Caused by: java.security.InvalidKeyException: No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl 
    [java]  at java.security.Signature$Delegate.chooseProvider(Unknown Source) 
    [java]  at java.security.Signature$Delegate.engineInitSign(Unknown Source) 
    [java]  at java.security.Signature.initSign(Unknown Source) 
    [java]  at org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.sign(Unknown Source) 
    [java]  ... 21 more 

任意の提案を?

+0

実行時にJava Cryptographic Extensionポリシーファイルが既にインストールされていますか。それが問題かどうか分かりません。ちょうどそのチャンスを尋ねます。 –

+0

はい、私は実際にそれらをインストールしましたが、私は同じ例外が発生し続けます。 – user1084509

答えて

5

問題は私のものだった、私は間違って署名方法を指定していた。

SignedInfo si = fac.newSignedInfo 
         (fac.newCanonicalizationMethod 
         (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, 
          (C14NMethodParameterSpec) null), 
         fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), 
         Collections.singletonList(ref)); 
+0

transforms要素でxslt transformを使用する方法を知っていますか?もしそうなら、あなたは返信してください。少なくとも、XML署名でxsltを使用する例を示すリンクを指摘してください。私はjavaを使用しています。ありがとうございました。 – Ashwin

0

多分、BouncyCastleにあるようなJCE/JCAプロバイダをインストールする必要があります。しかし、ちょうど推測する。

関連する問題