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

时间:2016-10-28 02:04:08

标签: c# .net windows passbook wallet

我正在尝试在我的系统中创建Apple钱包传递,在阅读Different S/MIME signature between OpenSSL and C#Apple Passbook coupons from C#之后,系统现在可以自动创建.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;

0 个答案:

没有答案