| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- Checks the SAML metadata provided by the IdP.
- Currently, only checking the valid from and to dates for the certificate
- Run with: node check-idp-metadata /path/idp-metadata.xml
- */
- import { Certificate } from '@fidm/x509'
- import _ from 'lodash'
- import moment from 'moment'
- import fs from 'fs'
- import xml2js from 'xml2js'
- function checkCertDates(signingKey) {
- let cert = _.get(signingKey, [
- 'ds:KeyInfo',
- 0,
- 'ds:X509Data',
- 0,
- 'ds:X509Certificate',
- 0,
- ])
- if (!cert) {
- throw new Error('no cert')
- }
- cert = cert.replace(/\s/g, '')
- const certificate = Certificate.fromPEM(
- Buffer.from(
- `-----BEGIN CERTIFICATE-----\n${cert}\n-----END CERTIFICATE-----`,
- 'utf8'
- )
- )
- const validFrom = moment(certificate.validFrom)
- const validTo = moment(certificate.validTo)
- return {
- validFrom,
- validTo,
- }
- }
- async function main() {
- const [, , file] = process.argv
- console.log('Checking SAML metadata')
- const data = await fs.promises.readFile(file, 'utf8')
- const parser = new xml2js.Parser()
- const xml = await parser.parseStringPromise(data)
- const idp = xml.EntityDescriptor.IDPSSODescriptor
- const keys = idp[0].KeyDescriptor
- const signingKey =
- keys.length === 1
- ? keys[0]
- : keys.find(key => _.get(key, ['$', 'use']) === 'signing')
- const certDates = checkCertDates(signingKey)
- console.log(
- `SSO certificate is valid from ${certDates.validFrom} to ${certDates.validTo}`
- )
- }
- main()
|