上下文
我有一个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。
如何?
-
将要签名的配置文件保存到临时文件:
file_put_contents($tmp_file_name,$profile_data(;
-
签署您刚刚创建的文件:
$data=shell_exec("openssl smime-sign-in$tmp_file_name{在此处添加您需要的另一个参数…}"(;
-
将数据发送到客户端:
echo$data;
-
删除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信誉,因此单击查看结果(
请随意修改上面的代码以满足您的需求。