• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iOS - 验证私有(private)应用商店的企业配置文件

[复制链接]
菜鸟教程小白 发表于 2022-12-13 11:46:41 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

作为我们移动设备管理功能的一部分,我们为客户提供私有(private)应用商店。管理员可以将 ipa 文件上传到我们的服务器,我们将允许托管设备直接安装这些企业应用程序。

当管理员上传ipa时,我们想做一些验证,如果ipa不符合要求,立即拒绝。具体来说:

  1. 如果ipa是由企业证书以外的证书(如appstore证书)签名的,我们要拒绝它;
  2. 如果 ipa 由已过期的证书签名,我们希望拒绝它;
  3. 如果 ipa 由已撤销的证书签署,我们希望拒绝它。

我有以下问题:

  1. 对于要求 #1,我注意到企业版本在 ipa 中有一个文件 embedded.mobileprovision,但 appstore 版本没有该文件。检查该文件的存在是否足以确定上传的 ipa 是否为企业 ipa,或者是否有更准确的方法来识别非企业 ipa?
  2. 对于需求 #2,embedded.mobileprovision 中似乎有一个字段 ExpirationDate,我可以检查它的值来确定到期日期吗?
  3. 据我所知,上面的#1 和#2 是可能的,但在用户实际尝试安装 ipa 之前,#3 无法验证。即,当管理员上传 ipa 时,我无法捕捉到错误,但我会允许这样做,用户将收到无法安装应用程序的错误。

提前致谢。



Best Answer-推荐答案


下面的代码完成了所需的任务。

Boolean foundMobileProvision = false;
Pattern mobileProvisionPattern = Pattern.compile("embedded\\.mobileprovision$");

while ((entry = zipStream.getNextEntry()) != null) {
    Matcher mobileProvisionMatcher = mobileProvisionPattern.matcher(entryName);
    if (!entry.isDirectory()) {
        if (mobileProvisionMatcher.find()) {
            foundMobileProvision = true;
            CMSSignedDataParser parser = new CMSSignedDataParser(new BcDigestCalculatorProvider(), zipStream);
            InputStream plistContentStream = parser.getSignedContent().getContentStream();

            Map<String, Object> mobileProvisionAttributes = PlistParser.parsePlistToMap(plistContentStream);

            plistContentStream.close();

            validateEnterpriseProvision(mobileProvisionAttributes);
        }
    }
}
zipStream.close();
if (!foundMobileProvision) {
    throw new InvalidEnterpriseProvisionException("Uploaded app must have a valid enterprise provisioning profile");
}

private void validateEnterpriseProvision(Map<String, Object> mobileProvisionAttributes) {
    Boolean provisionAllDevices = (Boolean) mobileProvisionAttributes.get(IOS_MOBILE_PROVISION_ALL_DEVICES);

    if (provisionAllDevices == null || !provisionAllDevices) {
        throw new InvalidEnterpriseProvisionException("Uploaded app must have a valid enterprise provisioning profile");
    }

    Date expirationDate = (Date) mobileProvisionAttributes.get(IOS_MOBILE_PROVISION_EXPIRATION_DATE);
    if (new Date().after(expirationDate)) {
        throw new EnterpriseProvisionExpiredException("rofile expired");
    }
}

关于iOS - 验证私有(private)应用商店的企业配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683634/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap