ios — Создание отдельной подписи PKCS # 7 для проходов Apple Wallet с использованием переполнения стека

Для меня это совершенно новая концепция, поэтому я снимаю в темноте.

Чтобы создать файл подписи, создайте отдельную подпись 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://, Почему это?

2

Решение

  1. Сгенерируйте идентификатор типа пропуска в https://developer.apple.com/account/ios/identifier/passTypeId
  2. Создайте сертификат для этого идентификатора типа пропуска в https://developer.apple.com/account/ios/certificate/create/
  3. Загрузите сертификат и положите его в свой брелок
  4. Найдите сертификат в цепочке для ключей и экспортируйте его как Certificates.p12 без пароля
  5. Открыть терминал, запустить openssl pkcs12 -in Certificates.p12 -clcerts -nokeys -out pass_cert.pem -passin pass: генерировать сертификат
  6. В терминале беги openssl pkcs12 -in Certificates.p12 -nocerts -out pass_key.pem -passin pass: -passout pass:YourPassword генерировать ключ
  7. Скачать сертификат WWDR от https://www.apple.com/certificateauthority/ и положить его в свой брелок
  8. Экспортируйте сертификат WWDR из вашей цепочки для ключей как 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);
}

Рекомендации:

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]