2012-10-05 5 views
7

Quindi porto una libreria ruby ​​su node.js e devo creare una firma PKCS7.Come eseguire questa registrazione PKCS7 in node.js?

Ecco ciò che il lib rubino sta facendo:

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) 

Come dovrei ottenere la stessa cosa nel nodo? Suppongo che sarebbe qualcosa di simile:

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

Domande:

  • È questo il modo giusto per fare questo?
  • Devo specificare una chiave, un elenco, un elenco di crl o un elenco di cifre?
  • quale codifica dovrei usare per leggere il certificato?
  • qual è il nodo equivalente di impostazione signed
  • linea di quello che è il nodo equivalente di signed.to_der
+0

Stai scrivendo una libreria di libretti Apple. Ho faticato a cercare di capire la stessa cosa. –

+0

@ChrisF - quindi, ti sei arreso, o cosa? So che il nodo può farcela, almeno utilizzando il firmatario di esempio di Apple scritto in C - tuttavia, vorrei evitare di introdurre una dipendenza compilata. – Jesse

+0

@Jesse E tu? Ancora bloccato su questo, sto incontrando la stessa sfida per un server MDM nodo ma sono bloccato in precedenza! cf. http://stackoverflow.com/questions/12956995/pkcs7-data-payload-unpacking-with-nodejs – Olivier

risposta

0

Non esiste un modo per farlo in modo nativo in nodo o iojs in questo momento, il meglio che si può fare è eseguire un comando exec usando smime module per un esempio.

1

questo codice può aiutarti. È progettato per PKCS7, ma puoi modificare la riga di comando di openssl come desideri.

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); 
} 

Il mio file è chiamato: signHelper. Questo è il codice di chiamarlo:

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 
     }); 

È solo necessario capire come fare quello che ti serve con OpenSSL. Spero che funzioni per voi.