在 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的主要内容,如果未能解决你的问题,请参考以下文章
在 32 位设备上重新签署具有不同权利的 iOS 应用程序失败
Apple 登录“invalid_client”,使用 PHP 和 openSSL 签署 JWT 进行身份验证