我有一个webapp(前端JS /后端PHP),以编程方式生成一些MDM iOS configuration profiles(* .mobileconfig)。
网站用户输入一些信息,调用我的PHP api,我的PHP后端使用特定于用户的数据“动态”生成配置文件,将其保存在服务器上,并返回生成的配置文件的URL,以便用户可以单击此链接并将其安装在其iOS设备上。
简而言之:此配置文件在其有效负载中仅包含一个webclip(safari快捷方式)。
一切正常,配置文件链接打开iOS设置应用程序,要求用户在其设备上安装此配置文件。
我的问题是这个以编程方式生成的配置文件没有签名。因此,iOS会警告用户该配置文件未签名,并且他必须执行若干其他操作来确认配置文件安装。
我希望生成的配置文件能够被签名,因此用户可以更轻松快速地安装它们。
我阅读了一些有关签署配置文件的资源,我不了解所有内容,我没有任何关于签名,证书等的技能。
这对我来说不太清楚!
任何帮助表示感谢,提前感谢!
是的你可以。还有PHP。
怎么样?
我可以确认它使用@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.享受!
那取决于你:
如果只是为了签名问题,我之前已经回答了一个问题,请参阅: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声望,所以点击查看结果)
您可以随意修改上述代码以满足您的需求。