<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: thompsomimp290</title>
    <description>The latest articles on DEV Community by thompsomimp290 (@thompsomimp290).</description>
    <link>https://dev.to/thompsomimp290</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F654638%2F25e6664e-9ae7-4474-bd63-c88e2513d346.png</url>
      <title>DEV Community: thompsomimp290</title>
      <link>https://dev.to/thompsomimp290</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thompsomimp290"/>
    <language>en</language>
    <item>
      <title>Sign XML file with my .PEM certificate using NodeJS</title>
      <dc:creator>thompsomimp290</dc:creator>
      <pubDate>Wed, 23 Jun 2021 14:47:03 +0000</pubDate>
      <link>https://dev.to/thompsomimp290/sign-xml-file-with-my-pem-certificate-using-nodejs-4gae</link>
      <guid>https://dev.to/thompsomimp290/sign-xml-file-with-my-pem-certificate-using-nodejs-4gae</guid>
      <description>&lt;p&gt;I need to sign an XML file with my .PEM certificate and password using NODEJS. The expected result will be an XML output file with the following format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Signature&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SignedInfo&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;CanonicalizationMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SignatureMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#rsa-sha1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Reference&lt;/span&gt; &lt;span class="na"&gt;URI=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Transforms&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Transform&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#enveloped-signature"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Transform&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/Transforms&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DigestMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#sha1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DigestValue&amp;gt;&lt;/span&gt;zHZj0KS0h60yrhNIijxk0HgKEQI=&lt;span class="nt"&gt;&amp;lt;/DigestValue&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Reference&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/SignedInfo&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;SignatureValue&amp;gt;&lt;/span&gt;e6ENjwpibfoCkWL13X......&lt;span class="nt"&gt;&amp;lt;/SignatureValue&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;KeyInfo&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;X509Data&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;X509Certificate&amp;gt;&lt;/span&gt;BaWgAwIBAgIIUgD9d3AI..&lt;span class="nt"&gt;&amp;lt;/X509Certificate&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/X509Data&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/KeyInfo&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Signature&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But I'm not able to add this tag  and its values. My output xml file is something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;Signature&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;SignedInfo&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;CanonicalizationMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SignatureMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#rsa-sha1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Reference&lt;/span&gt; &lt;span class="na"&gt;URI=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Transforms&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Transform&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#enveloped-signature"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Transform&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/TR/2001/REC-xml-c14n-20010315"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/Transforms&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DigestMethod&lt;/span&gt; &lt;span class="na"&gt;Algorithm=&lt;/span&gt;&lt;span class="s"&gt;"http://www.w3.org/2000/09/xmldsig#sha1"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;DigestValue&amp;gt;&lt;/span&gt;zHZj0KS0h60yrhNIijxk0HgKEQI=&lt;span class="nt"&gt;&amp;lt;/DigestValue&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Reference&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/SignedInfo&amp;gt;&lt;/span&gt; 
  &lt;span class="nt"&gt;&amp;lt;SignatureValue&amp;gt;&lt;/span&gt;e6ENjwpibfoCkWL13X......&lt;span class="nt"&gt;&amp;lt;/SignatureValue&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;KeyInfo&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;X509Data&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/X509Certificate&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;/X509Data&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/KeyInfo&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Signature&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check below my code in Node.js v16.0.3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var select = require('xml-crypto').xpath
  , dom = require('xmldom').DOMParser
  , SignedXml = require('xml-crypto').SignedXml
  , FileKeyInfo = require('xml-crypto').FileKeyInfo
  , fs = require('fs')

    function signXml(xml, xpath, key, dest) {
      var sig = new SignedXml()
      sig.signingKey = fs.readFileSync(key)

      // not working:
      sig.canonicalizationAlgorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
      sig.signatureAlgorithm = "http://www.w3.org/2000/09/xmldsig#rsa-sha1"
      sig.addReference(xpath, ["http://www.w3.org/2000/09/xmldsig#enveloped-signature", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"])

      // working:
      // sig.addReference(xpath)

      sig.computeSignature(xml)
      fs.writeFileSync(dest, sig.getSignedXml())
    }

    function MyKeyInfo() {
        this.getKeyInfo = function(key) {
            return "&amp;lt;X509Data&amp;gt;&amp;lt;/X509Data&amp;gt;"
        };
        this.getKey = function(keyInfo) {
            return fs.readFileSync("certificate.pem", 'utf-8');
        };
    }

    //formatando nota fiscal
    var xml = '&amp;lt;ns1:ReqConsultaNotas ' +
                  'xmlns:ns1="http://localhost:8080/WsNFe2/lote" ' +
                  'xmlns:tipos="http://localhost:8080/WsNFe2/tp" ' +
                  'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                  'xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/ReqConsultaNotas.xsd"&amp;gt;' +
                '&amp;lt;Header Id="Consulta:notas"&amp;gt;' +
                  '&amp;lt;Version&amp;gt;1&amp;lt;/Version&amp;gt;' +
                '&amp;lt;/Header&amp;gt;' +
              '&amp;lt;/ns1:ReqConsultaNotas&amp;gt;'

    //sign an xml document
    signXml(xml,
      "//*[@Id='Consulta:notas']",
      "certificate.pem",
      "result.xml")

    console.log("xml signed succesfully")

    var xml = fs.readFileSync("result.xml").toString()

    var sig = new SignedXml();
    sig.keyInfoProvider = new MyKeyInfo();
    //sig.addReference("//*[local-name(.)='InfNfse']");
    sig.signingKey = fs.readFileSync("certificate.pem");
    sig.computeSignature(xml);
    fs.writeFileSync("signed.xml", sig.getSignedXml());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any tips how to add  tag?&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
