%PDF- %PDF-
| Direktori : /usr/share/doc/node-undici/examples/ca-fingerprint/ |
| Current File : //usr/share/doc/node-undici/examples/ca-fingerprint/index.js |
'use strict'
const crypto = require('crypto')
const https = require('https')
const { Client, buildConnector } = require('../..')
const pem = require('https-pem')
const caFingerprint = getFingerprint(pem.cert.toString()
.split('\n')
.slice(1, -1)
.map(line => line.trim())
.join('')
)
const server = https.createServer(pem, (req, res) => {
res.setHeader('Content-Type', 'text/plain')
res.end('hello')
})
server.listen(0, function () {
const connector = buildConnector({ rejectUnauthorized: false })
const client = new Client(`https://localhost:${server.address().port}`, {
connect (opts, cb) {
connector(opts, (err, socket) => {
if (err) {
cb(err)
} else if (getIssuerCertificate(socket).fingerprint256 !== caFingerprint) {
socket.destroy()
cb(new Error('Fingerprint does not match or malformed certificate'))
} else {
cb(null, socket)
}
})
}
})
client.request({
path: '/',
method: 'GET'
}, (err, data) => {
if (err) throw err
const bufs = []
data.body.on('data', (buf) => {
bufs.push(buf)
})
data.body.on('end', () => {
console.log(Buffer.concat(bufs).toString('utf8'))
client.close()
server.close()
})
})
})
function getIssuerCertificate (socket) {
let certificate = socket.getPeerCertificate(true)
while (certificate && Object.keys(certificate).length > 0) {
// invalid certificate
if (certificate.issuerCertificate == null) {
return null
}
// We have reached the root certificate.
// In case of self-signed certificates, `issuerCertificate` may be a circular reference.
if (certificate.fingerprint256 === certificate.issuerCertificate.fingerprint256) {
break
}
// continue the loop
certificate = certificate.issuerCertificate
}
return certificate
}
function getFingerprint (content, inputEncoding = 'base64', outputEncoding = 'hex') {
const shasum = crypto.createHash('sha256')
shasum.update(content, inputEncoding)
const res = shasum.digest(outputEncoding)
return res.toUpperCase().match(/.{1,2}/g).join(':')
}