2

我正在尝试在我的系统中创建 Apple 钱包通行证,在阅读OpenSSL 和 C# 之间的不同 S/MIME 签名以及来自C# 的 Apple Passbook 优惠券之后,系统现在可以自动创建 .pkasss。

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

Mac OS X 方法与 Windows OS 方法有很大区别吗?

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

有谁知道如何解决它?


这是我的源代码:

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

非常感谢!!!

- - - - - - - - - - - - - - - - - 更新 - - - - - - - - ------------------

我找到了签名的ans!!!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;
4

0 回答 0