在 PHP 服务器上签署 .mobileconfig

Posted

技术标签:

【中文标题】在 PHP 服务器上签署 .mobileconfig【英文标题】:Sign .mobileconfig on a PHP server 【发布时间】:2015-07-22 22:18:41 【问题描述】:

谁能告诉我如何在 php 中使用 openssl smime -sign -signer cert.pem -inkey key.pem -certfile ca-bundle.pem -nodetach -outform der -in profile-uns.mobileconfig -out profile-sig.mobileconfig 这个(这个工作正常!)?

我试过了

$path = __DIR__ . DIRECTORY_SEPARATOR;  // my actual directory
$infilename = $path . 'profile.mobileconfig'; // my unsigned profile
$outfilename = $path . 'profile-sig.mobileconfig'; // my signed profile
$signcert = file_get_contents($path . 'cert.pem'); // my certificate to sign
$privkey = file_get_contents($path . 'key.pem'); // my private key of the certificate
$extracerts = $path . 'ca-bundle.pem'; // the cert chain of my CA

echo openssl_pkcs7_sign($infilename, $outfilename , $signcert, $privkey, array(), PKCS7_NOATTR,$extracerts);

没有成功。我还尝试了所有 PKCS7 属性...

【问题讨论】:

我现在正在尝试exec('openssl smime -sign -signer cert.pem -inkey key.pem -certfile ca-bundle.pem -nodetach -outform der -in profile.mobileconfig -out profile-sig.mobileconfig');,但还是不行。 更新:这是有效的。 在哪里可以获得 ca-bundle.pem 【参考方案1】:

exec 调用openssl smime 可以正常工作:

exec('openssl smime -sign -signer cert.pem -inkey key.pem -certfile ca-bundle.pem -nodetach -outform der -in profile.mobileconfig -out profile-sig.mobileconfig');

【讨论】:

【参考方案2】:

其实,有一个简单的方法可以解决这个问题:

/**
 * Sign MobileConfig
 *
 * @string $file_full_pathname   e.g. /tmp/example.mobileconfig
 * @string $certificate_pathname e.g. /etc/cert.d/apple_distribution.cert.pem
 * @string $private_key_pathname e.g. /etc/cert.d/apple_distribution.key.pem
 * @bool   $remove_file          Optional, default is true, if you want to keep your file then set to false.
 *
 * @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);

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

【讨论】:

以上是关于在 PHP 服务器上签署 .mobileconfig的主要内容,如果未能解决你的问题,请参考以下文章

如何签署 PHP 源代码

在 32 位设备上重新签署具有不同权利的 iOS 应用程序失败

Apple 登录“invalid_client”,使用 PHP 和 openSSL 签署 JWT 进行身份验证

签署 JSON 对象

赋能提速,智慧安全!ATFX携Adobe Sign网上签署服务再出发

Pubsub 使用错误的密钥签署 JWT 令牌以进行推送