Вопрос или проблема
Я хочу создать карту членства в Apple Wallet. Я добавил “добавить в кошелек” на сайт, основанный на next.js, и сгенерировал generalPass.js. Который является
generalPass.js
import fs from "fs";
import path from "path";
import {PKPass} from "passkit-generator";
const generatePass = async (userData) => {
try {
// プロジェクトのルートディレクトリを基準にパスを解決
const basePath = path.resolve(process.cwd(), "src/utils/certificates");
const certificates = {
signerCert: fs.readFileSync(path.join(basePath, "signerCert.pem")),
signerKey: fs.readFileSync(path.join(basePath, "signerKey.pem")),
wwdr: fs.readFileSync(path.join(basePath, "wwdr.pem")),
signerKeyPassphrase: "PASSKEY",
};
const pass = new PKPass(
{
model: path.join(process.cwd(), "src/utils/pass-model"), // Pass モデルのパス
certificates,
},
{
serialNumber: "123456",
description: "Member Card",
}
);
pass.addPrimaryField("memberName", "名前", userData.name);
pass.addSecondaryField("expiryDate", "有効期限", userData.expiryDate);
return pass.getAsStream();
} catch (error) {
console.error("🔥 Error generating pass:", error);
throw error;
}
};
export default generatePass;
Однако он выдает
🔥 Error generating wallet pass: TypeError: ValidationError happened. Invalid certificate(s) loaded. "wwdr" is required. Please provide valid WWDR certificates and developer signer certificate and key (with passphrase).
Refer to docs to obtain them
at generatePass (src/utils/generatePass.js:16:17)
at GET (src/app/api/wallet-pass/route.js:11:42)
14 | };
15 |
> 16 | const pass = new PKPass(
| ^
17 | {
18 | model: path.join(process.cwd(), "src/utils/pass-model"), // Pass モデルのパス
19 | certificates,
GET /api/wallet-pass 500 in 281ms
GET /favicon.ico 200 in 19ms
^[[1;2B^[[1;2B^[[1;2B
Путь к файлу wwdr.pem определенно правильный.
Я не уверен, что делать…
Кстати, я скачал файл wwdr G4 с сайта Apple и преобразовал из .cer в .pem с помощью команды “openssl x509 -inform der -in wwdrG4.cer -out wwdr.pem”
Ответ или решение
Конечно, для создания членской карты в Apple Wallet необходимо корректно настроить необходимость наличия World Wide Developer Relations (WWDR) сертификата. В данном случае, ошибка "ValidationError happened. Invalid certificate(s) loaded. ‘wwdr’ is required." указывает на то, что загруженный файл, представляющий сертификат WWDR, либо отсутствует, либо он точно не в том формате, который требуется для успешной генерации пасса.
Теория:
Сертификаты WWDR (WorldWide Developer Relations) являются ключевыми для разработчиков, так как удостоверяют доверие к продуктам, создаваемым и подписываемым в приложениях Apple. Сертификат WWDR действует как посредник между сертификатом разработчика и корневым сертификатом, обеспечивая целостность и подлинность пассов, добавляемых в Apple Wallet.
Когда дело доходит до Passbook/Apple Wallet, необходимые компоненты включают:
- Сертификат разработчика Apple: Это личный сертификат, используемый для создания и подписания ваших цифровых пропусков (Pass).
- Сертификат WWDR: Это промежуточный сертификат, который позволяет идентифицировать сертификат разработчика как доверенный.
- Закрытый ключ: Это ключ, связанный с вашим сертификатом разработчика Apple, и используется для подписания вашего пасса.
Без корректного импорта и преобразования этих сертификатов ваш проект может вызвать ошибки во время работы с компонентом PKPass
.
Пример:
Предположим, что у нас есть следующий файл JavaScript, как то представлено выше, который использует библиотеку passkit-generator
для создания и подписания цифрового пасса. Ошибка выше указывает на конкретные строки кода, где произошел сбой из-за некорректности подгруженного файла wwdr.pem
.
Наиболее распространенная ошибка, с которой сталкиваются разработчики, заключается в неправильном форматировании сертификата. При преобразовании файла формата .cer
в .pem
, необходимо убедиться, что используете правильные команды OpenSSL и что сам файл сертификата корректен и полон.
Приложение:
Для решения этой проблемы, важно внимательно рассмотреть следующие шаги:
-
Проверка Корректности Преобразования: Убедитесь, что OpenSSL правильно преобразовал файл формата
.cer
в.pem
. Команда, использованная вами, выглядит корректно, но проверьте, действительно ли результат сохранил все необходимые компоненты и что сам сертификат полный и не обрезанный.openssl x509 -inform der -in wwdrG4.cer -out wwdr.pem
-
Соединение WWDR Сертификата с Доверенной Корневой Цепочкой: Убедитесь, что ваш сертификат соответствует последней версии WWDR, доступной с сайта Apple. Кроме того, установите его в доверенные файлы вашего ключевого хранилища операционной системы.
-
Проверка Правильности Пути: Перепроверьте, правильно ли указан путь к сертификату в структуре проекта. Опечатки или неправильное указание пути могут вызывать подобные ошибки.
-
Загрузка Правильных Файлов: Подтвердите, что
signerCert.pem
иsignerKey.pem
тоже корректно сформированы и загружены. Все сертификаты должны поддерживаться и быть правильно интегрированы. -
Отметка Активации Dev Account: Убедитесь, что ваша учетная запись разработчика активна и актуальна на тот момент, когда вы пытаетесь создать и подписать pass.
Проверив все вышеперечисленные моменты и убедившись в их соответствии, вы должны увидеть разрешение текущей проблемы. В случае, если проблема сохраняется, рекомендуем обратиться за дополнительной поддержкой к документации Apple или сообществу разработчиков, где можно получить советы из первых рук.
Эти аспекты важны для понимания и решения проблемы с сертификатами, необходимыми для генерации членской карты в Apple Wallet. Работая в тандеме с новым запрашиваемым контекстом, это должно помочь избежать подобных ошибок в будущем и гарантировать успешную интеграцию.