Safari 推送包:如何修复 Apple 过期的 WWDR 证书

Posted

技术标签:

【中文标题】Safari 推送包:如何修复 Apple 过期的 WWDR 证书【英文标题】:Safari Push Package: how to fix Apple's expired WWDR certificate 【发布时间】:2016-02-23 10:07:43 【问题描述】:

好吧,我们都知道,这即将发生,根据 Apple 的news release,Apple WWDR 证书已在情人节到期(这就是我所说的“开发者之爱”)。

我正在使用 C# 为 Safari 生成推送包,惊喜,这不再起作用了。这是我在日志记录端点中收到的消息:

"logs":["推送包签名验证失败"]

这就是我的旧 PKCS#7 签名代码的样子:

//  Sign the message with the private key of the signer.
static byte[] PKCS7SignMessage(byte[] message, X509Certificate2 signerCertificate)

    //  Place message in a ContentInfo object.
    //  This is required to build a SignedCms object.
    ContentInfo contentInfo = new ContentInfo(message);

    //  Instantiate SignedCms object with the ContentInfo above.
    //  Has default SubjectIdentifierType IssuerAndSerialNumber.
    //  Has default Detached property value false, so message is
    //  included in the encoded SignedCms.
    SignedCms signedCms = new SignedCms(contentInfo, true);

    //  Formulate a CmsSigner object for the signer.
    CmsSigner cmsSigner = new CmsSigner(signerCertificate);
    cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;        

    //  Sign the CMS/PKCS #7 message.
    signedCms.ComputeSignature(cmsSigner);

    //  Encode the CMS/PKCS #7 message.
    return signedCms.Encode();

Apple 还要求“将路径传递给额外证书参数的更新中间体”。

所以我尝试了这个:

X509Certificate2 appleIntermediate = new X509Certificate2();
appleIntermediate.Import(@"Path-to-new-WWRD.cer");
cmsSigner.Certificates.Add(appleIntermediate);

不行。(推送包签名验证失败)

后来我试图改变这一行:

cmsSigner.IncludeOption = X509IncludeOption.WholeChain;

它不起作用。我有一个例外说:

“无法为受信任的根授权建立证书链”。

好吧,现在我决定:

将所有 Apple CA 根证书添加到本地计算机的受信任证书存储区。 将续订的 WWRD 证书添加到本地计算机的中间证书存储区。 重新启动进程并再次尝试代码。好消息,它现在再次签名,理论上包括整个证书链。

BUT:没用。(推送包签名验证失败)

根据 Apple 的说法,解决这个问题是小菜一碟:

Safari 推送通知

在 2016 年 2 月 14 日之前更新您的通知包签名服务器以包含您的 Web 推送证书和续订的中间证书。在此日期之后,新用户将无法从您的网站注册推送通知,直到您的服务器已经更新。如果您使用 openssl_pkcs7_sign 函数仅使用您的 Web 推送证书对您的推送包进行签名,您应该将路径传递给更新的中间层以获得额外的证书参数。

现在,这在计划英语中是什么意思? 以及如何将其应用于 C# 上下文?

【问题讨论】:

您找到解决方案了吗? @JonSquared 还没有。我决定不把这个放在首位,因为 Safari 没有巨大的市场份额。只要 Firefox 和 Chrome 继续为我提供良好的 Push 消息支持,我就可以对 Apple 说 f* 字。 【参考方案1】:

Apple 不想要整个链条。他们只希望包含您的证书和他们的中间证书。所以你的代码应该是这样的:

    static public byte[] PKCS7SignMessage(byte[] manifest_data, X509Certificate2 signerCertificate) 
        X509Certificate2Collection ca_chain;
        ContentInfo content;
        SignedCms signed_cms;
        CmsSigner signer;

        signed_cms = new SignedCms();

        ca_chain = new X509Certificate2Collection(new X509Certificate2(@"Path-to-new-intermediate-WWRD.cer"));

        content = new ContentInfo(manifest_data);

        signed_cms = new SignedCms(content, true);

        signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, signerCertificate);
        signer.IncludeOption = X509IncludeOption.ExcludeRoot;
        signer.Certificates.AddRange(ca_chain);

        signed_cms.ComputeSignature(signer);

        return signed_cms.Encode();
    

【讨论】:

以上是关于Safari 推送包:如何修复 Apple 过期的 WWDR 证书的主要内容,如果未能解决你的问题,请参考以下文章

Safari 推送通知不起作用

网站的 OSX 推送通知 - 从未调用过 Safari requestPermission 回调

推送新的配置文件

Safari 推送通知

如何配置Apple推送证书 push证书

Apple 推送通知令牌