我有一个webapp(前端JS /后端PHP),它可以通过编程方式生成一些MDM iOS configuration profiles(* .mobileconfig)。
网站用户输入一些信息,调用我的PHP api,然后我的PHP后端使用用户特定的数据“即时”生成配置文件,将其保存在服务器上,然后返回生成的配置文件的URL,因此用户可以单击此链接并将其安装在其iOS设备上。
简而言之:此配置文件的有效负载中仅包含一个webclip(Safari快捷方式)。
一切正常,配置配置文件链接会打开“ iOS设置”应用,要求用户在设备上安装此配置文件。
我的问题是,该以编程方式生成的配置文件未签名。因此,用户 iOS会警告,该配置文件未签名,并且他必须执行其他一些操作来确认配置文件的安装。
我希望对生成的配置文件进行签名,以便用户可以更轻松,快速地安装它们。
我阅读了一些有关签名配置文件的资源,因为我并不了解所有内容,我对签名,证书等也没有任何技能。
这对我来说还不清楚!
任何帮助表示感谢,谢谢!!
答案 0 :(得分:1)
可以。也可以用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);
答案 1 :(得分:0)
我可以使用@zvi答案确认它是否有效。谢谢!
让我提供有关实施的更多详细信息,以帮助其他人。特别是我对需要签名的文件以及如何获取文件感到困惑。
1。获取证书
我使用了Let's Encrypt到ZeroSSL的免费证书,以轻松获取所需的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信誉,所以单击以查看结果)
可以随意修改上面的代码来满足您的要求。