如何做到这一点PKCS7签署node.js?

所以我将一个ruby库移植到node.js,并需要创build一个PKCS7签名。

以下是rubylib正在做的事情:

p12_certificate = OpenSSL::PKCS12::new(File.read('some-path.c12'), self.certificate_password) x509_certificate = OpenSSL::X509::Certificate.new(File.read('some-other-path.pem')) flag = OpenSSL::PKCS7::BINARY|OpenSSL::PKCS7::DETACHED signed = OpenSSL::PKCS7::sign(p12_certificate.certificate, p12_certificate.key, File.read('some-manifest'), [x509_certificate], flag) 

我如何在节点中实现相同的function? 我认为这将是像这样的:

 crypto.createCredentials({ pfx : fs.readFileSync('some-cert.p12'), passphrase : this.certificate_password, cert : fs.readFileSync('some-path.pem','some-encoding'), }) 

问题:

  • 这是正确的方法吗?
  • 我是否需要指定密钥,ca列表,crl列表或密码列表?
  • 我应该用什么编码来读取证书?
  • 什么是signed的线路设置相当于节点
  • 什么是signed.to_der等价节点

这段代码可以帮助你。 是为PKCS7而devise的,但是您可以根据需要修改de openssl命令行。

  var util = require('util'); var spawn = require('child_process').spawn; var Promise = require('promise'); // Expose methods. exports.sign = sign; /** * Sign a file. * * @param {object} options Options * @param {stream.Readable} options.content Content stream * @param {string} options.key Key path * @param {string} options.cert Cert path * @param {string} [options.password] Key password * @param {function} [cb] Optional callback * @returns {object} result Result * @returns {string} result.pem Pem signature * @returns {string} result.der Der signature * @returns {string} result.stdout Strict stdout * @returns {string} result.stderr Strict stderr * @returns {ChildProcess} result.child Child process */ function sign(options, cb) { return new Promise(function (resolve, reject) { options = options || {}; if (!options.content) throw new Error('Invalid content.'); if (!options.key) throw new Error('Invalid key.'); if (!options.cert) throw new Error('Invalid certificate.'); var command = util.format( 'openssl smime -sign -text -signer %s -inkey %s -outform DER -nodetach', options.cert, options.key ); if (options.password) command += util.format(' -passin pass:%s', options.password); var args = command.split(' '); var child = spawn(args[0], args.splice(1)); var der = []; child.stdout.on('data', function (chunk) { der.push(chunk); }); child.on('close', function (code) { if (code !== 0) reject(new Error('Process failed.')); else resolve({ child: child, der: Buffer.concat(der) }); }); options.content.pipe(child.stdin); }) .nodeify(cb); } 

我的文件被称为:signHelper。 这是调用它的代码:

 signHelper.sign({ content: s, key: path.join(__dirname, '../certs/test/' + "keyfile.key")//, cert: path.join(__dirname, '../certs/test/' + "certfile.crt"), password: 'password' }).catch(function (err) { logger.error("Error signing: " + err.stack); callback(err); }).then(function (result) { logger.info("signTicket ++++++++++++"); callback(null, result.der); //result.der is the signed certificate }); 

你只需要了解如何用openssl来做你需要的。 我希望这个对你有用。

validationnode.js中的PKCS#7(PEM)签名/解包数据

不能评论更多的链接,但希望这可以让你开始。 这只是validation签名,但我相信你可以反向工程这创build一个,而不是。

现在在node或iojs中本地没有办法做到这一点,最好的办法是使用smime模块来运行一个exec命令。