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



上下文

我有一个Web应用程序(前端JS/后端PHP(,它以编程方式生成一些MDM iOS配置文件(*.mobileconfig(。

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

简而言之:此配置文件的有效负载中只包含一个网络剪辑(safari快捷方式(。

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

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

我希望对生成的配置文件进行签名,这样用户就可以更容易、更快地安装它们

问题

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

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

我不清楚!

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

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

让我提供更多关于我的实现的细节,以帮助其他人。尤其是我对我需要签署哪些文件以及如何获得这些文件感到困惑。

1.获得证书

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

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

我将证书另存为"certificate.crt">,将私钥另存为"private-key.pem">。将它们上载到服务器的某个位置。

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

如果你只使用上面的2个文件,你的个人资料将被签名,但不会在iOS中"验证"(我正在寻找的绿色复选标记(

从这个页面下载"信任链"。

我使用了"Let's Encrypt Authority X3(IdenTrust交叉签名("一个,并将其保存到"ca chain.pem">。将其与另外两个一起上传到您的服务器。

3.制作一个PHP签名方法

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

我使用这里描述的方法从PHP中使用shell_exec调用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操作,您可以像这里解释的那样进行头部重定向(我自己没有测试(

可以。也使用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(;

如果只是符号问题,我以前已经回答过一个问题,请参阅: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);
}

已签名配置文件的结果(<10信誉,因此单击查看结果(

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

相关内容

  • 没有找到相关文章

最新更新