如何以编程方式签署iOS配置文件?

问题描述 投票:0回答:2

上下文

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

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

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

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

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

我希望生成的配置文件能够被签名,因此用户可以更轻松快速地安装它们。

问题

  • 可能吗?
  • 如果是的话,用PHP可以吗?
  • 如果是的话,我该怎么做?

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

这对我来说不太清楚!

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

php ios mdm signing configuration-profile
2个回答
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文件... unlink($ tmp_file_name);

0
投票

我可以确认它使用@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交叉签名)”一个,并将其保存到“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(未经我自己测试)

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声望,所以点击查看结果)

您可以随意修改上述代码以满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.