1

语境

我有一个以编程方式生成一些MDM iOS 配置文件(*.mobileconfig) 的 webapp(前端 JS / 后端 PHP)。

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

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

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

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

我希望对生成的配置文件进行签名,以便用户可以更轻松快捷地安装它们。

问题

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

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

这对我来说不清楚!

任何帮助表示赞赏,在此先感谢!

4

3 回答 3

1

是的你可以。也与 PHP。

如何?

  1. 将要签名的配置文件保存到临时文件:

    file_put_contents ($tmp_file_name, $profile_data);

  2. 签署您刚刚创建的文件:

    $data = shell_exec ("openssl smime -sign -in $tmp_file_name {在这里添加你需要的其他参数...}");

  3. 将数据发送给客户端:

    回显$数据;

  4. 删除tmp文件...

    取消链接($tmp_file_name);

于 2018-11-29T08:48:58.510 回答
1

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

让我提供有关我的实施的更多详细信息以帮助其他人。特别是我对需要签署哪些文件以及如何获取它们感到困惑。

1. 获得证书

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

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

我将证书保存为"certificate.crt"并将私钥保存为"private-key.pem"。将它们上传到您的服务器的某个地方。

2.获取证书授权链文件

如果您只使用上面的 2 个文件,您的个人资料将被签名但在 iOS 中未“验证”(我正在寻找的绿色复选标志)

从此页面下载“信任链” 。

我使用了“Let's Encrypt Authority X3 (IdenTrust cross-signed)”,并将其保存到“ca-chain.pem”。将其与其他两个一起上传到您的服务器。

3.制作PHP登录方法

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

我使用这里描述的方法使用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 操作,您可以像解释这里那样做一个标题重定向(未经我自己测试)

于 2019-04-16T08:39:48.900 回答
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);
}

签名配置文件的结果(<10 信誉,所以点击查看结果)

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

于 2019-07-06T19:37:58.257 回答