gpt4 book ai didi

ruby - 如何在 node.js 中执行此 PKCS7 签名?

转载 作者:数据小太阳 更新时间:2023-10-29 06:55:06 28 4
gpt4 key购买 nike

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

这是 ruby​​ 库正在做的事情:

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)

我如何在 Node 中实现同样的事情?我假设它会是这样的:

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

问题:

  • 这样做正确吗?
  • 我是否需要指定 key 、ca 列表、crl 列表或密码列表?
  • 我应该使用什么编码来读取证书?
  • 行设置signed的 Node 等价物是什么
  • 什么是 signed.to_der 的等效 Node

最佳答案

这段代码可以帮到你。专为 PKCS7 设计,但您可以根据需要修改 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 执行您需要的操作即可。我希望它对你有用。

关于ruby - 如何在 node.js 中执行此 PKCS7 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com