2012-10-05 36 views
7

Vì vậy, tôi đang chuyển thư viện ruby ​​sang node.js và cần tạo chữ ký PKCS7.Làm cách nào để thực hiện việc đăng nhập PKCS7 này trong node.js?

Dưới đây là những gì các lib ruby ​​được thực hiện:

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) 

Làm thế nào tôi sẽ đạt được điều tương tự trong nút? Tôi cho rằng nó sẽ là một cái gì đó như:

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

Câu hỏi:

  • Đây có phải là đúng cách để làm điều này?
  • Tôi có cần chỉ định danh sách khóa, danh sách ca, danh sách crl hoặc danh sách mật mã không?
  • tôi nên sử dụng mã hóa nào để đọc chứng chỉ?
  • là những gì tương đương với nút thiết signed
  • dòng là những gì tương đương với nút của signed.to_der
+0

Bạn đang viết thư viện sổ tiết kiệm Apple. Tôi đã cố gắng tìm ra điều tương tự. –

+0

@ChrisF - vậy, bạn có bỏ cuộc hay không? Tôi biết nút có thể kéo điều này đi, ít nhất là bằng cách sử dụng ký hiệu mẫu của Apple được viết bằng C - tuy nhiên, tôi muốn tránh giới thiệu một phụ thuộc biên dịch. – Jesse

+0

@Jesse Còn bạn thì sao? Vẫn còn mắc kẹt về điều này, tôi đang gặp phải những thách thức tương tự cho một máy chủ MDM nút nhưng tôi bị mắc kẹt trước đó! cf. http://stackoverflow.com/questions/12956995/pkcs7-data-payload-unpacking-with-nodejs – Olivier

Trả lời

0

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

không thể bình luận hơn liên kết, nhưng hy vọng điều này có thể giúp bạn bắt đầu. Đây chỉ là xác minh chữ ký, tuy nhiên tôi chắc chắn bạn có thể đảo ngược kỹ sư này để tạo chữ ký thay thế.

0

Không có cách nào để thực hiện điều đó một cách tự nhiên trong nút hoặc ioj ngay bây giờ, tốt nhất bạn có thể làm là chạy lệnh exec sử dụng smime module để biết ví dụ.

1

mã này có thể giúp bạn. Được thiết kế cho PKCS7, nhưng bạn có thể sửa đổi dòng lệnh de openssl như bạn muốn.

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

Tệp của tôi được gọi là: signHelper. Đây là mã để gọi:

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

Bạn chỉ phải hiểu cách làm những gì bạn cần với openssl. Tôi hy vọng nó hoạt động cho bạn.

Các vấn đề liên quan