8

そのため、Ruby ライブラリを node.js に移植していて、PKCS7 署名を作成する必要があります。

ruby lib が行っていることは次のとおりです。

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)

ノードで同じことをどのように達成できますか? 私はそれが次のようなものになると仮定します:

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
4

3 に答える 3

1

このコードはあなたを助けることができます。PKCS7 用に設計されていますが、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 で必要なことを行う方法だけを理解する必要があります。うまくいくことを願っています。

于 2015-02-20T14:26:56.633 に答える
0

PKCS#7 (PEM) 署名の検証 / node.js でのデータのアンパック

リンク以外にコメントすることはできませんが、これで始められることを願っています。これは署名を検証しているだけですが、これをリバース エンジニアリングして署名を作成できると確信しています。

于 2013-05-07T13:23:58.717 に答える
0

現在、node または iojs でネイティブに実行する方法はありません。たとえば、smime モジュールを使用して exec コマンドを実行するのが最善の方法です。

于 2015-01-23T09:49:02.053 に答える