在Visual Studio中生成Apple Passbook优惠券/ S-MIME签名

我试图在我的系统中创建Apple钱包传递,在从C#读取OpenSSL和C#以及Apple Passbook优惠券 之间的不同S / MIME签名后,系统现在可以自动创建.pkasss。

而我的问题是签名无法在实际中成功创建 。 如果我使用iPhone并尝试打开.pkpass文件,则无法打开!! 我发现问题来自签名,如果我使用mac在终端中创建签名,它会创建一个3326字节大小的签名; 我的代码只能创建一个3002字节的文件,这意味着签名必须遗漏一些东西。

Mac OS X方法与Windows操作系统方法有很大区别吗?

以前有人遇到过这个问题吗? 有谁知道为什么签名不同?

有谁知道怎么解决它?


这是我的源代码:

var cert = new X509Certificate2(assetsFolder + p12File, p12Password); var buffer = File.ReadAllBytes(Path.Combine(assetsFolder, "manifest.json")); var cont = new ContentInfo(buffer); var cms = new SignedCms(cont, true); var signer = new CmsSigner(cert) { IncludeOption = X509IncludeOption.ExcludeRoot, SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber, }; cms.ComputeSignature(signer, true); var myCmsMessage = cms.Encode(); File.WriteAllBytes(Path.Combine(assetsFolder, "signature"), myCmsMessage); 

十分感谢!!!

———————————- UPDATE ————— ——————

我找到了签名!!! OID和SignerIdentifierType的设置将影响签名这是我的解决方案:

  byte[] buffer = File.ReadAllBytes(Path.Combine(assetsFolder, "manifest.json")); X509Certificate2 cert = new X509Certificate2(assetsFolder + p12File, p12Password); var oid = new Oid("1.2.840.113549.1.7.2"); ContentInfo contentInfo = new ContentInfo(oid, buffer); SignedCms signedCms = new SignedCms(contentInfo, true); var cmsSigner = new CmsSigner(cert); cmsSigner.IncludeOption = X509IncludeOption.ExcludeRoot; cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now)); cmsSigner.SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier; signedCms.ComputeSignature(cmsSigner); byte[] myCmsMessage = signedCms.Encode(); return myCmsMessage;