这对我来说是一个全新的概念,所以我在黑暗中拍摄。
要创建签名文件,请创建一个PKCS#7分离签名 清单文件,使用与您的签名关联的私钥 证书。包括WWDR中间证书作为的一部分 签名。您可以从Apple的网站下载此证书。 将签名写入传递顶层的文件签名 包。包括使用的签名通行证的日期和时间 S / MIME签名时属性。
要创建签名文件,请创建清单文件的PKCS#7分离签名
我将使用标记PKCS7_DETACHED
使用openssl_pkcs7_sign
函数。
使用与您的签名证书关联的私钥。
我将使用我的ssl cert.pem
文件的位置作为signcert
参数,并将cert.key
文件的位置用作privkey
参数。< / p>
将WWDR中间证书作为签名的一部分包括在内。
我将在extracerts
参数
使用S / MIME签名时属性包括传递签名的日期和时间。
我将包含一个包含密钥signing-time
的数组,并为2015-05-03 10:40:00
参数添加类似headers
的值。
private function createSignature($dir)
{
$cert = '/etc/ssl/cert.pem';
$key = '/etc/ssl/private/cert.key';
$wwdr = '/location/of/apple/wwdr/cert.cer';
$headers = [
'signing-time' => (new DateTime())->format('o-m-d H:i:s'),
];
return openssl_pkcs7_sign("$dir/manifest.json", "$dir/signature", $cert, $key, $headers, PKCS7_DETACHED, $wwdr);
}
我在openssl_pkcs7_sign
函数的文档示例中注意到文件的某些位置的前缀为file://
。这是为什么?
答案 0 :(得分:4)
Certificates.p12
,无需密码openssl pkcs12 -in Certificates.p12 -clcerts -nokeys -out pass_cert.pem -passin pass:
以生成证书openssl pkcs12 -in Certificates.p12 -nocerts -out pass_key.pem -passin pass: -passout pass:YourPassword
以生成密钥wwdr.pem
创建分离签名的功能:
public function createSignature()
{
$cert = "file://location/of/pass_cert.pem";
$key = "file://location/of/pass_key.pem";
$wwdr = "/location/of/wwdr.pem";
openssl_pkcs7_sign("/location/of/manifest.json", "/location/of/signature",
$cert, [$key, 'YourPassword'], [], PKCS7_BINARY | PKCS7_DETACHED, $wwdr);
// convert pem to der
$signature = file_get_contents("/location/of/signature");
$begin = 'filename="smime.p7s"';
$end = '------';
$signature = substr($signature, strpos($signature, $begin) + strlen($begin));
$signature = substr($signature, 0, strpos($signature, $end));
$signature = trim($signature);
$signature = base64_decode($signature);
file_put_contents("/location/of/signature", $signature);
}
参考文献: