Для меня это совершенно новая концепция, поэтому я снимаю в темноте.
Чтобы создать файл подписи, создайте отдельную подпись PKCS # 7
файл манифеста, используя закрытый ключ, связанный с вашей подписью
сертификат. Включите промежуточный сертификат WWDR как часть
подпись. Вы можете скачать этот сертификат с сайта Apple.
Запишите подпись в файл подписи на верхнем уровне прохода
пакет. Укажите дату и время, когда пропуск был подписан с использованием
Атрибут времени подписи S / MIME.
Чтобы создать файл подписи, создайте отдельную подпись файла манифеста PKCS # 7.
Я буду использовать openssl_pkcs7_sign
функция с использованием флага PKCS7_DETACHED
,
используя закрытый ключ, связанный с вашим сертификатом подписи.
Я буду использовать местоположение моего SSL cert.pem
файл как signcert
Параметр и расположение cert.key
файл как privkey
параметр.
Включите промежуточный сертификат WWDR как часть подписи.
Я включу путь к сертификату 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://
, Почему это?
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);
}
Рекомендации:
Других решений пока нет …