certificate.js 946 B

12345678910111213141516171819202122232425262728293031
  1. 'use strict';
  2. const { unescape } = require('querystring');
  3. const { pki, md, asn1 } = require('node-forge');
  4. /*
  5. escapedPemCertificate comes from nginx, it's the client cert in PEM format.
  6. This function calculates the 10-byte fingerprint required by OpenADR.
  7. Ref: OpenADR 2.0b protocol specification section 10.5.1
  8. */
  9. function calculatePartialFingerprintOfEscapedPemCertificate(
  10. escapedPemCertificate,
  11. ) {
  12. const pemCertificate = unescape(escapedPemCertificate);
  13. const parsedCertificate = pki.certificateFromPem(pemCertificate);
  14. const asn1Encoded = pki.certificateToAsn1(parsedCertificate);
  15. const derEncoded = asn1.toDer(asn1Encoded).getBytes();
  16. const fullFingerprintDelimited = md.sha256
  17. .create()
  18. .update(derEncoded)
  19. .digest()
  20. .toHex()
  21. .match(/.{2}/g)
  22. .join(':');
  23. return fullFingerprintDelimited.slice(-29).toUpperCase();
  24. }
  25. module.exports = {
  26. calculatePartialFingerprintOfEscapedPemCertificate,
  27. };