Nodejs's native https is a wrap of OpenSSL. If you want to use HSM(hardware security module), you need to use openSSL's SetEngine function and you need to write C code.
This lib is based on node-forge (A pure JS implementation of TLS via Nodejs net.socket). You can make Certificate Signature by RSA in JS. This in a very common use in bank's USBkey.
Tested in Node v8.9.3
npm install https-hsm
/** * HTTPS Request, call hardware security module to make Certificate Signature * @param {Object} options * @property {string} host A domain name or IP address of the server to issue the request to. Default: 'localhost' * @property {number} port Port of remote server, default 443 * @property {string} method A string specifying the HTTP request method. Default: 'POST'. * @property {path} path Request path. Should include query string if any. E.G. '/index.html?page=12'.Default: '/'. * @property {Object} headers An object containing request headers. * @property {Object} body An object containing request body. * @property {function} getCA get Array of CA cert string in PEM format, support Async * @property {function} getCert get client cert string in PEM format or client cert Buffer in CRT format, support Async * @property {function} rsaSign get Certificate Signature in Buffer format,only support RSA * @property {Boolean} debug debug mode will console.log more info. Default: false */module.exports=asyncfunctionhttpsHSMconstfs=require('fs')consthttpsHSM=require('https-hsm')httpsHSM.request({host: '127.0.0.1',port: 8000,path: '/t',headers: {'content-type': 'application/json;charset=UTF-8'},body: {name: 'Hello World!',age: 2046},asyncgetCA(){return[fs.readFileSync('./test/ca-crt.pem').toString()]},asyncgetCert(){returnfs.readFileSync('./test/client1-crt.pem').toString()},asyncrsaSign(b){constprivateKeyStr=fs.readFileSync('./test/client1-key.pem').toString()constprivateKey=httpsHSM.forge.pki.privateKeyFromPem(privateKeyStr)returnprivateKey.sign(b,null)},debug: false}).then((r)=>{console.log(r)},(e)=>{console.error(e)})the original node-forge current does not support Tls v1.2 but this lib does and I had made PR to it.Once node-forge support Tls v1.2 I will use original node-forge