我正在尝试弄清楚如何使用 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
一些相关资源: