我正在尝试在我的系统中创建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;