Как вы возможно знаете, для покупки промо-офферов необходимо сгенерировать подпись с помощью ключа подписки, скачанного из App Store Connect. Ключ можно создать в разделе Users & Access > Keys.
Сам по себе PKCS#8 приватный ключ имеет расширение .p8 и использует эллипитический алгоритм ECDSA P-256. Более подрубно описано в документации Apple.
Если открыть содержимое ключа в текстовом редакторе, то будет выглядеть так:
\-----BEGIN PRIVATE KEY----- MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgKfLl2Sldom13UQJi WdTL8aRc90qEigTA/QelysCOTiCgCgYIKoZIzj0DAQehRANCAASm29jY3KbTHtJI GkOgiXtvWnidZp5N+B/RDC9T0n/vZV/UCmbAA1wa1f5jF6E2YwzK5r/fsTAEac66 IlbfvTT4 \-----END PRIVATE KEY-----
Данные ключи работают исправно и Apphud умеет создавать подписи для них при покупке промо офферов.
Ключ подписки, сгенерированный в Xcode, имеет другой формат и алгоритм, описанный в документации Apple, не подходит!
Чтобы найти данное попап окно:
Ключ подписки состоит из пары публичного и приватного ключа. Xcode отображает в попапе только приватный ключ. Чтобы посмотреть пару ключей, откройте ваш Configuration.storekit файл в любом текстовом редакторе, он имеет JSON формат. Там вы найдете ключ subscriptionOffersKeyPair
. Пара выглядит таким образом:
"subscriptionOffersKeyPair" : { "id" : "AD97257D", "privateKey" : "MF8CAQEEGNSWDVsrVXfxGfn2wvQAUUNHA/S+nqDvwqAKBggqhkjOPQMBAaE0AzIA\\nBK0s7Oq6mdN0mcimQvy+ofIpVfnZx7b/KZ7uesoNx6LwwQ3w5XyjrUN5Mx1onhl8\\nQg==", "publicKey" : "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAErSzs6rqZ03SZyKZC/L6h8ilV+dnH\\ntv8pnu56yg3HovDBDfDlfKOtQ3kzHWieGXxC" }
Сам баг состоит в том, что приватный ключ, скачанный из App Store Connect использует ECDSA P-256 эллиптический алгоритм, тогда как приватный ключ из StoreKit Testing использует кривую P-192. OpenSSL идентифицирует ключ как prime192v1. При попытке прочитать ключ с помощью OpenSSL обычным образом выдается ошибка "Unable to load key" либо "Could not parse PKey: no start line".
Мы связались с премиум поддержкой Apple DTS Support, они подтвердили данный баг в Xcode. Ошибка сохраняется в Xcode 12.4 (12D4e) и Xcode 12.5 beta (12E5220o).
По умолчанию, OpenSSL не может прочитать ключ с хедером и футером, который отображает Xcode.
Можно это обойти, вручную изменив хедер на:
``` -----BEGIN EC PRIVATE KEY----- ``` //и футер на: `-----END EC PRIVATE KEY-----`
Мы продолжаем коммуникацию с Apple, чтобы добиться успешной работы ключей попдиски из StoreKit Testing и обновим данную статью, когда проблема будет решена. Надеемся в следующем обновлении Xcode 12 данная проблема будет исправлена.
Спасибо!