2012-10-05 16 views
7

私はrubyライブラリをnode.jsに移植しており、PKCS7署名を作成する必要があります。node.jsでこのPKCS7署名を行う方法は?

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) 

はどのようにしてノードで同じことを達成するであろう:

はここでルビーのlibがやっている何ですか?これは、これを行うには正しい方法です

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

    質問:私はそれはようなものになるだろうと仮定しますか?

  • キー、caリスト、crlリスト、または暗号リストを指定する必要がありますか。
  • 証明書を読むにはどのようなエンコードを使用しますか?リンク以上にコメントすることはできませんsigned.to_der
+0

あなたはAppleの通帳ライブラリを作成しています。私は同じことを理解しようと苦労しました。 –

+0

@ChrisF - だから、あきらめましたか? C言語で書かれたリンゴのサンプル署名者を使って、ノードがこれを引き出すことができることは分かっていますが、コンパイルされた依存関係の導入を避けたいと思います。 – Jesse

+0

@Jesseあなたはどうですか?それでもなお、私はノードMDMサーバーで同じ問題に遭遇していますが、以前は固まっています! cf. http://stackoverflow.com/questions/12956995/pkcs7-data-payload-unpacking-with-nodejs – Olivier

答えて

0

Verify PKCS#7 (PEM) signature/unpack data in node.js

のノード同等ですが、うまくいけば、これはあなたが始めることができるものsigned

  • 回線設定のノードと同等であるものを
  • 。これはシグネチャを検証するだけですが、リバースエンジニアリングして署名を作成することができます。

  • 0

    ノードまたはiojsでネイティブに実行する方法はありません。たとえば、smime moduleを使用してexecコマンドを実行することができます。

    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で必要なものを行う方法を理解する必要があります。 私はそれがあなたのために働くことを願っています。

    関連する問題