2012-10-05 13 views
7

तो मैं node.js पर रूबी लाइब्रेरी पोर्ट कर रहा हूं, और एक पीकेसीएस 7 हस्ताक्षर बनाने की आवश्यकता है।यह PKCS7 node.js में साइन इन करने के लिए कैसे करें?

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'), 
}) 

सवाल:

  • इस ऐसा करने के लिए सही तरीका है?
  • क्या मुझे एक कुंजी, सीए सूची, सीआरएल सूची, या सिफर सूची निर्दिष्ट करने की आवश्यकता है?
  • प्रमाण पत्र पढ़ने के लिए मुझे किस एन्कोडिंग का उपयोग करना चाहिए?
  • signed.to_der
+0

आप एक ऐप्पल पासबुक लाइब्रेरी लिख रहे हैं। मैंने एक ही चीज़ को समझने की कोशिश कर संघर्ष किया है। –

+0

@ChrisF - तो, ​​क्या आप हार गए, या क्या? मुझे पता है कि नोड सी में लिखे गए सेब के नमूने हस्ताक्षरकर्ता का उपयोग करके कम से कम इसे खींच सकता है - हालांकि, मैं संकलित निर्भरता को पेश करने से बचना चाहता हूं। – Jesse

+0

@ जेसे आपके बारे में क्या? अभी भी इस पर फंस गया है, मुझे एक नोड एमडीएम सर्वर के लिए एक ही चुनौती का सामना करना पड़ रहा है लेकिन मैं पहले अटक गया हूँ! सीएफ 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

    अभी नोड या आईओजेएस में इसे मूल रूप से करने का कोई तरीका नहीं है, उदाहरण के लिए smime module का उपयोग करके निष्पादन आदेश चलाने के लिए सबसे अच्छा तरीका है।

    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 साथ की जरूरत है ऐसा करने के लिए: यह कॉल करने के लिए कोड है। मुझे आशा है कि यह आपके लिए काम करेगा।

    संबंधित मुद्दे