如何签名以编程方式生成的iOS配置文件?

时间:2018-11-22 16:01:41

标签: php ios mdm signing configuration-profile

上下文

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

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

简而言之:此配置文件的有效负载中仅包含一个webclip(Safari快捷方式)。

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

我的问题是,该以编程方式生成的配置文件未签名。因此,用户 iOS会警告,该配置文件未签名,并且他必须执行其他一些操作来确认配置文件的安装。

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

问题

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

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

这对我来说还不清楚!

任何帮助表示感谢,谢谢!!

3 个答案:

答案 0 :(得分:1)

可以。也可以用PHP。

如何?

  1. 将要签名的配置文件保存到临时文件:

      

    file_put_contents($ tmp_file_name,$ profile_data);

  2. 对刚刚创建的文件签名:

      

    $ data = shell_exec(“ openssl smime -sign -in $ tmp_file_name {在此处添加您需要的其他参数...}”);

  3. 将数据发送到客户端:

      

    echo $ data;

  4. 删除tmp文件...

      

    取消链接($ tmp_file_name);

答案 1 :(得分:0)

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

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

1。获取证书

我使用了Let's EncryptZeroSSL的免费证书,以轻松获取所需的2个文件(证书和私钥)。

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

我将证书另存为 “ certificate.crt” ,并将私钥另存为 “ private-key.pem” < / strong>。将它们上传到您的服务器上。

2。获取证书颁发机构链文件

如果您仅使用上述2个文件,则您的个人资料将在iOS中未“验证”(我一直在寻找的绿色对号)上签名。

this page下载“信任链”。

我使用了“让我们的加密授权机构X3(IdenTrust交叉签名)”,并将其保存到 “ 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(未经我自己测试)

答案 2 :(得分:0)

如果只是出于标志问题,我已经回答过一个,请参阅: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(<10信誉,所以单击以查看结果)

可以随意修改上面的代码来满足您的要求。