4

我正在尝试弄清楚如何使用 node.js 和加密对 iOS Passbook 通行证 manifest.json 进行签名。似乎应该是可能的,但我似乎无法创建正确的签名。

这是我尝试过的:

var crypto = require("crypto");
var fs = require('fs');

var manifest = fs.readFileSync('manifest.json');
var pem = fs.readFileSync('passbookdemo.pem');
var key = pem.toString('ascii');

var sign = crypto.createSign('RSA-SHA256');
sign.update(manifest);
var sig = sign.sign(key);

fs.writeFileSync('signature');

我之前使用以下方法生成了 passbookdemo.pem:

openssl pkcs12 -in passbookdemo.p12 -out passbookdemo.pem -nodes

没有与 passbookdemo.pem 关联的密码短语。

我可以看到的一个可能的问题是,我没有在签名过程中加入 Apple 开发者关系证书,我认为这是一项要求。

另一种可能性是我在crypto.createSign('RSA-SHA256');. 我不确定应该改用什么。

这是 Apple 提供的一个 ruby​​ 代码示例,我可以使用它来正确签署清单。

def sign_manifest
    puts "Signing the manifest"
    # Import the certificates
    p12_certificate = OpenSSL::PKCS12::new(File.read(self.certificate_url), self.certificate_password)
    wwdr_certificate = OpenSSL::X509::Certificate.new(File.read(self.wwdr_intermediate_certificate_path))

    # Sign the data
    flag = OpenSSL::PKCS7::BINARY|OpenSSL::PKCS7::DETACHED
    signed = OpenSSL::PKCS7::sign(p12_certificate.certificate, p12_certificate.key, File.read(self.manifest_url), [wwdr_certificate], flag)

    # Create an output path for the signed data
    self.signature_url = self.temporary_path + "/signature"

    # Write out the data
    File.open(self.signature_url, "w") do |f|
        f.syswrite signed.to_der
    end
end

一些相关资源:

4

1 回答 1

1

我知道这篇文章写完已经五年了,但我偶然发现了它,并认为它值得一个答案。对的,这是可能的。 这是一个从节点调用的示例脚本。openssl

于 2018-07-10T12:42:38.417 回答