【问题标题】:How-to sign an iOS configuration profile generated programmatically?如何签署以编程方式生成的 iOS 配置文件?
【发布时间】:2018-11-22 16:01:41
【问题描述】:

上下文

我有一个 webapp(前端 JS / 后端 PHP)以编程方式生成一些 MDM iOS configuration profiles (*.mobileconfig)。

网站用户输入一些信息,调用我的 PHP api,我的 PHP 后端使用用户特定的数据“即时”生成配置文件,将其保存在服务器上,然后返回生成的配置文件的 URL,以便用户可以单击此链接并将其安装在其 iOS 设备上。

简而言之:此配置文件在其有效负载中仅包含一个网络剪辑(Safari 快捷方式)。

一切正常,配置文件链接打开 iOS 设置应用程序,要求用户在其设备上安装此配置文件。

我的问题是这个以编程方式生成的个人资料没有签名。因此用户被 iOS 警告该配置文件未签名,他必须执行几个额外的操作来确认配置文件安装。

我希望对生成的配置文件进行签名,以便用户可以更轻松快捷地安装它们。

问题

  • 有可能吗?
  • 如果可以,是否可以使用 PHP?
  • 如果是,我该怎么做?

我阅读了一些关于签署配置文件的资源,因为我不了解所有内容,我没有任何关于签署、证书等的技能。

我不清楚!

任何帮助表示赞赏,在此先感谢!

【问题讨论】:

    标签: php ios mdm signing configuration-profile


    【解决方案1】:

    是的,你可以。也可以使用 PHP。

    怎么做?

    1. 将您要签名的个人资料保存到临时文件中:

      file_put_contents ($tmp_file_name, $profile_data);

    2. 签署您刚刚创建的文件:

      $data = shell_exec("openssl smime -sign -in $tmp_file_name {在这里添加你需要的其他参数...}");

    3. 向客户端发送数据:

      回显 $data;

    4. 删除tmp文件...

      取消链接($tmp_file_name);

    【讨论】:

    • 听起来不错,谢谢。但是,您在 "{add here another parameters you need...}" 上添加了哪些信息?我想我必须将一些 Apple 证书信息放在其他地方?这是否与您必须生成的 Apple 开发人员证书相关联才能在应用商店上发布应用程序?很抱歉这么笨,我是一名 JS 前端开发人员,所以这真的不是我的舒适区!
    • 请参见此处:discussions.apple.com/thread/4907079 > openssl smime \ -sign \ -signer your_server.crt \ -inkey your_server_cert_key.pem \ -certfile your_server_cert_chain.pem \ -nodetach \ -outform der \ -in your_unsigned_profile。 mobileconfig \ -out your_signed_profile.mobileconfig
    • 是的,谢谢!我确实看到并为这个链接添加了书签。所以我想我现在必须从 iOS 开发人员证书的 p12 文件中生成 *.pem 文件(我已经阅读了其他相关内容)。当然,我必须先注册 Apple 的开发计划,或者购买另一个证书。
    • 在我确认它适用于我的情况后,我想将其标记为已接受,但这可能需要一些时间来测试,所以我接受你的回答,这对我有很大帮助。当我有时间实现所有这些时,我会在这里告诉你。谢谢
    【解决方案2】:

    我可以使用@zvi 答案确认它是否有效。谢谢!

    让我提供有关我的实施的更多详细信息,以帮助其他人。特别是我对需要签署哪些文件以及如何获取它们感到困惑。

    1.获取证书

    我使用来自Let's Encrypt 的免费证书,通过ZeroSSL 轻松获取所需的 2 个文件(证书和私钥)。

    您需要证明该域是您的(使用 FTP 或 DNS 方法)

    我将证书保存为 "certificate.crt" 并将私钥保存为 "private-key.pem"。将它们上传到您的服务器的某个位置。

    2。获取证书授权链文件

    如果您只使用上面的 2 个文件,您的个人资料将被签名但在 iOS 中未“验证”(我正在寻找的绿色复选标志)

    this page 下载“信任链”。

    我使用了“Let's Encrypt Authority X3 (IdenTrust cross-signed)”,并将其保存到 "ca-chain.pem"。将其与其他两个一起上传到您的服务器。

    3.制作一个PHP登录方法

    为了通过 PHP 脚本对其进行签名,我为此创建了一个方法,获取输入配置文件(未签名)并写入输出配置文件(签名)。

    我使用the method descibed here 使用 shell_exec

    从 PHP 调用 openssl 命令
    <?php
    function sslSignProfileToFile($inputFile, $outputFile)
    {
        $sslPath = '/absolute/path/to/your/cert/files';
        shell_exec("openssl smime -sign -signer ".$sslPath."/certificate.crt -inkey ".$sslPath."/private-key.pem -certfile ".$sslPath."/ca-chain.pem -nodetach -outform der -in ".$inputFile." -out ".$outputFile);
    }
    ?>
    

    4.生成您的个人资料并签名

    根据需要生成它,然后调用上面的方法来制作它的签名副本。

    <?php
    sslSignProfileToFile( "/path/to/your/unsigned-profile.mobileconfig", "/path/to/your/signed-profile.mobileconfig");
    ?>
    

    5.尽情享受吧!

    那就看你自己了:

    • 如果您像我一样在 AJAX 请求中,您可以在正文中返回要下载的签名配置文件的 URL

    • 如果您使用的是经典的表单 POST 操作,您可以只做一个标头重定向 like explained here(未经我自己测试)

    【讨论】:

      【解决方案3】:

      如果只是符号问题,我之前已经回答过一个,请参阅:https://stackoverflow.com/a/56917093/9297400

      /**
       * Sign MobileConfig
       *
       * @return string
       */
      function signMobileConfig (
          string $file_full_pathname,
          string $certificate_pathname,
          string $private_key_pathname,
          bool $remove_file = true
      ) {
          openssl_pkcs7_sign(
              $file_full_pathname,
              $file_full_pathname.'.sig',
              file_get_contents($certificate_pathname),
              file_get_contents($private_key_pathname),
              [], 0
          );
      
          $signed = file_get_contents($file_full_pathname.'.sig');
      
          if ($remove_file) {
              unlink($file_full_pathname.'.sig');
              unlink($file_full_pathname);
          }
      
          $trimmed = preg_replace('/(.+\n)+\n/', '', $signed, 1);
          return base64_decode($trimmed);
      }
      

      result of signed config file

      请随意修改上面的代码以满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 2018-01-29
        • 2014-08-10
        • 1970-01-01
        相关资源
        最近更新 更多