- GitHub OAuthでログインした開発者を
developer_idへ正規化する - 開発者審査の状態をサーバー側で管理する
- 審査済み開発者からCSRを受け取る
- サーバーが保持するCA秘密鍵でコード署名用証明書を発行する
- 証明書の失効状態を管理する
mochiOS側は以下を行う想定である。
/v1/ca/rootでルートCA証明書を取得する- リリースmetadataに含まれる証明書と署名を検証する
- 失効済み証明書や停止済み開発者を拒否する
- 必要な trust 情報を端末にキャッシュし、オフライン時はそのキャッシュで既知のアプリを検証する
- GitHub OAuthはログイン手段であり、署名の信頼根ではない
- サーバーCAが「この公開鍵はこの開発者に発行した」と署名する
- mochiOSはサーバーCAをtrust anchorとして扱う
- オフライン時は「最後に同期した root CA / certificate / revocation snapshot」を使って既知の対象だけを検証する
- 新しい証明書の取得や未同期の release の検証はオンライン時のみ許可する
開発者の審査状態を保持する。
pendingverifiedrejected
開発者が提出したCSRを保持する。
- CSR本文
- CSRから抽出した公開鍵
- 公開鍵fingerprint
- subjectDN
- 審査状態
サーバーCAが発行した証明書を保持する。
certificate_pemserial_numberpublic_key_fingerprintissued_atexpires_atstatusrevoked_at
既存の失効テーブルを利用し、証明書失効時にtarget_type = certificateを記録する。
config/app.phpに以下の共通設定を置く。
'admin_api_token' => '',
'ca_cert_path' => '',
'ca_key_path' => '',
'ca_key_passphrase' => '',
'ca_certificate_days' => 365,本番では実値を設定する。秘密値をリポジトリへコミットしてはいけない。
テストやローカル起動では以下の環境変数でも上書きできる。
APPSTORE_ADMIN_API_TOKENAPPSTORE_CA_CERT_PATHAPPSTORE_CA_KEY_PATHAPPSTORE_CA_KEY_PASSPHRASEAPPSTORE_CA_CERTIFICATE_DAYS
自分の審査状態を返す。
審査申請を作成する。
{
"note": "please verify me"
}自分の CSR 一覧を返す。
審査済み開発者のみ CSR を提出できる。
{
"csr_pem": "-----BEGIN CERTIFICATE REQUEST-----\n..."
}自分に発行された証明書一覧を返す。
自分に発行された証明書詳細を返す。
公開用のルート CA 証明書を返す。
管理 API は X-Admin-Token ヘッダが必要。
審査状態を更新する。
{
"verification_status": "verified",
"note": "approved"
}CSR を CA で署名し、開発者証明書を発行する。
CSR を却下する。
{
"reason": "missing verification"
}証明書を失効させる。
{
"reason": "compromised"
}- 開発者が GitHub OAuth でログインする
- 開発者が
POST /v1/developer-verifications/requestを実行する - 管理者が
POST /v1/admin/developers/{developer_id}/verificationでverifiedにする - 開発者がローカルで鍵ペアを生成する
- 開発者が CSR を
POST /v1/certificate-requestsで提出する - 管理者が
POST /v1/admin/certificate-requests/{csr_id}/issueを実行する - サーバーが CA 秘密鍵で CSR を署名する
- 開発者は発行済み証明書を使って release manifest に署名する
- 管理者が
POST /v1/admin/certificates/{certificate_id}/revokeを実行する developer_certificates.statusをrevokedに更新するrevocationsに履歴を残す- mochiOS は失効済み証明書を拒否する
- mochiOS 側の証明書チェーン検証
- release manifest の canonicalization
- package 署名の実施
- CRL/OCSP のようなオンライン失効配布
- オフライン時の trust cache 配布 API
これらは OS 側または release API 拡張で扱う。
オフライン対応を行う場合、mochiOS は以下の方針で動く。
- インストール済みまたは事前同期済みの release のみ検証する
- ルート CA 証明書と失効スナップショットは端末内に保持する
- 失効情報は「最後に同期した時点まで」を保証範囲とする
- 新しい release や新しい証明書はネットワーク復帰後に再同期する
サーバー側は将来的に以下の同期 API を追加できる。
GET /v1/sync/root-caGET /v1/sync/revocationsGET /v1/sync/certificatesGET /v1/sync/releases/{bundle_id}