我已经在这里待了大约 12 个小时。所有与 MDM 相关的 google 链接都是紫色的。我向所有重要的事情发誓,我已经尝试了一切。我已经多次重新生成供应商和客户 CSR、密钥等,但无法获得推送通知。
这是我所做的:
- 创建了供应商 CSR,将私钥导出为 vendor.p12
- 登录 Apple Provisioning Portal 并生成 MDM CSR 证书
- 下载了该证书并将其命名为 vendor.cer
- 运行此命令“openssl pkcs12 -in vendor.p12 -nocerts -out vendor.pem”
- 然后我在 Keychain Utility 中创建了第二个 CSR,名为 customer.csr
- 我使用了在这里找到的很酷的 python 脚本:https ://github.com/grinich/mdmvendorsign
- 我为此脚本运行了命令:“python mdm_vendor_sign.py --csr customer.csr --key vendor.key --mdm vendor.cer”
- 这生成了一个 plist 证书请求,然后我将其上传到https://identity.apple.com/pushcert/
- 我下载了证书并将其命名为 client-push.pem
- 我试图通过运行以下命令来检查它是否有效:“openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert push.pem -key vendor.pem”。这给了我错误“错误设置私钥 67028:error:0B080074:x509 证书例程:X509_check_private_key:key values mismatch:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/crypto/x509/x509_cmp.c:406:”
所以我的问题是:我使用什么密钥和证书组合来发送推送通知?我将使用 VENDOR 密钥和客户的证书是有道理的,因为我永远不会拥有客户的私钥,但这是错误的吗?
当我使用客户的 KEY 和 CERT 时,它看起来像是通过打印一大堆东西来工作,但在最顶部它说“验证错误:num = 20:无法获得本地颁发者证书”。此外,我将如何获得客户的私钥?
最后要尝试的是供应商的证书和密钥,这似乎与使用客户的密钥和证书完全相同。
哪种组合是正确的方法?
附带说明一下,我是否需要做任何事情来将“数据”推送令牌转换为常规推送令牌?它说它是base64编码的。我需要解码吗?
更新
我读过该令牌是一个 32 字节的 base64 编码字符串。我正在使用 PHP 发送推送通知操作系统,我认为 bin2hext(base64_decode(Token)) 可以工作。至少当我这样做时它看起来是合法的。仍然没有推送通知。
我还尝试了所有可能的组合,并且只有当我在同一个 PEM 文件中同时使用供应商密钥和证书时,我才能让它发送通知而没有任何错误。消息仍然没有到达。我还多次尝试(并成功生成)来自 identity.apple.com/pushcert 的 PEM 证书文件。它说它在那个页面上工作。
我正在为 Laravel 框架使用 Push 库。它所要求的只是证书文件、推送服务器主机和 pem 密码。
当我尝试使用从 identity.apple.com/pushcert 生成的 pem 文件时出现此错误:
stream_socket_client():无法设置本地证书链文件`/Users/neb/Dev/www/cgmdm/trunk/app/certificates/MDM.p12';检查您的 cafile/capath 设置是否包含您的证书及其颁发者的详细信息