【问题标题】:How to sign an xml with XADES4j, certificate store windows and Smart Card + PIN Code如何使用 XADES4j、证书存储窗口和智能卡 + PIN 码签署 xml
【发布时间】:2017-11-15 18:36:08
【问题描述】:

我正在尝试使用 XADES4j 对 xml 文件进行签名。我也使用智能卡认证(将从 windows 商店加载)。

是否有符合我搜索的示例,因为我是 XML 签名和智能卡的新手。我搜索了几个星期的修复程序但没有成功。

还有其他例子,但不是很清楚:

Example1 Example2

我在https://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingData 找到了这个演示,但我不知道如何设置函数PKCS11KeyStoreKeyingDataProvider 以应用Windows 证书参数及其密码:

    KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
              "path/to/native/lib",
               "MS SABRI", // CERTIFICATE NAME
               new FirstCertificateSelector(),
               null, 
               null,false);, 

我的代码:

          try {

     // >>> TEST N°1
     // KeyingDataProvider kp = new DirectKeyingDataProvider((X509Certificate) certExemple, PrivateKEY);

      // >>> TEST N°2
      KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
              "path/to/native/lib",
               "name", // CERTIFICATE NAME
               new FirstCertificateSelector(),
               new DirectPasswordProvider("123456"), // PIN CODE
               new DirectPasswordProvider("123456"), // PIN CODE
               false);



      // XADES
      XadesSigningProfile p = new XadesBesSigningProfile(kp);
      XadesSigner signer    = p.newSigner();

      javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
      factory.setNamespaceAware(true);
      javax.xml.parsers.DocumentBuilder builder = null;
      builder = factory.newDocumentBuilder();


      // XML FILE TO BE SIGNED
      Document doc1 = builder.parse(new File("FileNotSigned.xml"));

      // NODE
      Node parentElement            = doc1.getDocumentElement();
      Node nodeToSign               = doc1.getDocumentElement().getFirstChild();
      Node nodeToAttachSignature    = doc1.getDocumentElement();


      IndividualDataObjsTimeStampProperty dataObjsTimeStamp = new IndividualDataObjsTimeStampProperty();
      AllDataObjsCommitmentTypeProperty globalCommitment    = AllDataObjsCommitmentTypeProperty.proofOfApproval();
      CommitmentTypeProperty commitment                     = CommitmentTypeProperty.proofOfCreation();   

      // XPATH STRING
      String xpathHeader    ="/InvoiceHeader";
      String xpathBody      ="/InvoiceBody";

      // OBJECT
      DataObjectDesc obj1 = new DataObjectReference("");
      obj1.withTransform(XPath2Filter.intersect( xpathHeader ).intersect(xpathBody));
      SignedDataObjects dataObjs = new SignedDataObjects( obj1 );

      // SIGN
      signer.sign(dataObjs, nodeToAttachSignature);

      // TRANSFORMER
      Transformer transformer = TransformerFactory.newInstance().newTransformer();

      // XML SIGNED
      Result output = new StreamResult(new File("FileSigned.xml"));
      Source input  = new DOMSource(doc1);
      transformer.transform(input, output);

【问题讨论】:

    标签: java xml xades4j gemalto


    【解决方案1】:

    我不确定您所说的“Windows 商店 + 智能卡”是什么意思,因为两者似乎都是独一无二的。不管怎样,只要你想用智能卡,你的代码就差不多了。

    智能卡通常具有安装在主机操作系统上的本机库。在PKCS11KeyStoreKeyingDataProvider 的第一个参数上,您应该将路径传递给该库。第二个参数(name)只是注册提供者实例的名称。由于智能卡通常处理 PIN 以访问密钥,因此您通常可以为 keyStorePasswordProviderentryPasswordProvider 参数提供 null

    在库单元测试中,您可以找到example using the Portuguese citizen card

    希望这会有所帮助。

    【讨论】:

    • 感谢路易斯的帮助。我设法成功地进行了签名。但是当从证书提供者检查 xml 文件时,他给我发了这个答案:“securityController 期间出错:java.lang.String 无法转换为 java.security.cert.X509Certificate”。你能告诉我这个错误的原因吗?我们该如何解决呢?再次感谢路易斯。
    • 异常似乎很明显..形成堆栈跟踪,您应该能够找到导致该问题的代码行.. xades4j 似乎没有问题,但请告诉我如果是的话。
    • 是的,xades4j 似乎没有问题。我删除了 块,问题就解决了。我还有其他签名验证问题(证书提供者方面),我仍在检查它们。示例:我必须在签名块中保留一个引用(我创建的引用包含 XPATH2),因此必须消除创建的代码收集到块 SignedProperties 的自动引用:通常它不会产生问题,不是吗? .如果我很快遇到阻塞错误,我正在等待您的帮助!再次感谢路易斯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多