闪签证书站 · 领取证书

客户在证书站下单后,填购买时提交的 UDID,即可把签名证书导入闪签 App。

或者用本地订单的领取码:

必须在 iPhone 的 Safari 里打开本页,微信内置浏览器和电脑浏览器会拦截 fsign:// 自定义协议。两个按钮都要点一次:先导入 P12,再导入描述文件。

服务器配置步骤

前提:这套文件必须放在 https://rjy.ipaioscc.cn 的网站根目录——服务器版 IPA 把服务基址写死成了这个域名,App 只会请求它下面的 /api/...。放到 xs.xskja.com 或别的域名/子目录都不会生效。域名不对就说一声,我重打一份 IPA。

① 建站向导怎么选(宝塔为例)

选项选什么
域名rjy.ipaioscc.cn,A 记录指向服务器,不加 www、不带端口
数据库不创建。MySQL / Redis / SQLite 全不需要,也不用导 SQL
PHP 版本PHP 7.1 以上,推荐 7.4 / 8.0 / 8.1,需带 cURL。千万别选「纯静态」,否则 .php 会被当文件下载
FTP不创建,用文件管理器上传即可
SSL必须开有效证书并开启强制 HTTPS。iOS 拒绝 http 和自签证书
伪静态先留默认,第 ④ 步再填
防跨站 / 防盗链 / CC 防护关掉或加白名单,别把 /api/* 拦成 HTML 页

② 上传文件

最省事:把桌面上的 闪签_证书站_上传包.zip 传上去,用面板「解压」到网站根目录(zip 内已是根目录层级,别再多套一层文件夹)。也可以手动把 闪签_证书站/ 里的全部内容(含隐藏的 .htaccess)传上去,保持层级:

网站根目录/
├── index.html
├── .htaccess                 ← 隐藏文件,别漏传
├── api/
│   ├── _lib.php  config.php  config.json
│   ├── upstream.php  import.php  admin.php
│   ├── selftest.php           ← 部署自检,验证完删掉
│   └── certificates/router.php
├── data/                     ← upstream.json / orders.json / .htaccess
└── certs/                    ← 可选,本地订单模式才用

目录 755、文件 644。data/ 和 certs/ 需要禁止 Web 访问(见第 ④ 步),里面存着 Token。

③ 改配置(只有两个文件)

  1. api/_lib.php:把 FLASH_SECRET 换成 32 位以上随机串、FLASH_ADMIN_PW 换成后台密码。若站点在 CDN/反代后面导致生成的导入链接是 http://,把 FLASH_PUBLIC_BASE 填成 'https://rjy.ipaioscc.cn'。
  2. data/upstream.json:证书站地址和 Token 已填好。若证书站签出的 P12 有固定密码,填进 p12Password;无密码留空。

api/config.json 里的 officialSourceURL 已经是你的软件源,不用改。

④ 伪静态 / rewrite

Apache:随包的 .htaccess 自动生效,但需要站点允许 AllowOverride All。若报 500,删掉第一行的 -MultiViews。

Nginx / 宝塔:在「网站 → 设置 → 伪静态」粘贴下面这段(完整说明见 nginx.conf.example):

location ~ ^/(data|certs)/ { deny all; return 404; }
location ~ ^/api/certificates/(redeem|session-restore)$ {
    rewrite ^/api/certificates/(.*)$ /api/certificates/router.php?action=$1 last;
}

这一段做两件事:把 App 请求的两个无扩展名路径转到 router.php,并封住敏感目录。宝塔默认模板已带 pathinfo.conf,不需要额外改 PHP 配置;万一 /api/import.php/cert.p12 返回 404,页面会自动给备用链接。

⑤ 打开自检页

→ 打开 /api/selftest.php。它会逐项检查 PHP、HTTPS、密钥是否改过、敏感目录有没有封住、rewrite 是否生效、以及 Token 能不能连通证书站。全部通过后删除 api/selftest.php。

⑥ 手动复核(可选)

DOMAIN=https://rjy.ipaioscc.cn
curl -i $DOMAIN/api/config.php
curl -i -X POST -H 'Content-Type: application/json' \
  -d '{"udid":"40位UDID","code":"fsr_..."}' \
  $DOMAIN/api/certificates/redeem
curl -i $DOMAIN/data/upstream.json

第一条要返回含 officialSourceURL 的 JSON;第二条要返回 JSON(certificate_not_found 属正常),返回 404 HTML 就是 rewrite 没生效;第三条必须 403/404,绝不能 200。

上游模式不需要录入订单:客户在证书站买完证书,只要 UDID 对得上,打开本页填 UDID 就能拿到导入链接。api/admin.php 后台只用于可选的「本地订单」模式。软件源自动导入和证书领取是同一个站点、同一套文件,不冲突。

接口清单(从 App 二进制还原)

路径请求体用途
POST api/certificates/redeemudid, code恢复码兑换证书
POST api/certificates/session-restoreudid, enrollmentToken, bundleID启动自动查询
POST api/config.php—远程配置(上次已给)
GET api/import.php/cert.p12o,e,t一键导入证书文件

错误码:invalid_request / certificate_not_found / certificate_missing / certificate_pending / certificate_revoked / recovery_disabled / automatic_disabled / enrollment_required / method_not_allowed

上游证书站 API(已实测)

基础地址 https://xs.xskja.com。所有接口必须用 POST,且 token 必须放在请求体里;放 URL 上会返回 {"code":1001,"msg":"请使用 POST 提交 token(禁止 URL 传参)"}。你的 Token 已写入 data/upstream.json。

路径参数说明
/api/getcertificateid 或 udid查询证书,返回 p12 / mobileprovision 的 base64 —— 中转层只用这个
/api/adddeviceudid, warranty, type, beizhu, deviceType添加设备(秒出),会扣费
/api/addyydevice同上 + iswsh添加设备(预约)
/api/checkstatuskid检查设备状态
/api/getbalance—实测 {"code":1,"data":{"balance":2.6,"score":0}}
/api/getalldevice—实测 30 秒无响应,疑似未开放

错误码:1 成功 / 0 失败 / 1001 参数错误或 Token 无效 / 1002 余额不足 / 1003 设备数不足 / 1004 无可用开发者账号。warranty:0 躺平 1 普通 2 加强 3 稳定 4 摆烂;type:0 公共池 1 独立池 2 自动选择。

本中转层只调用只读接口(getcertificate / getbalance),不会调用 adddevice,不会产生任何扣费。证书售卖、UDID 绑定、扣费仍全部由你原来的证书站负责。
两处待确认
① router.php 里成功响应的 profile 结构(分字段 base64 / 整体 zip / 下载链接)静态分析定不死,需真机 + 真实订单抓一次成功报文,抓到后只改 profile_response() 一个函数。「UDID → 一键导入」这条不依赖它,现在就能用。
② 证书站 getcertificate 的文档示例里没有 P12 密码字段。代码会自动尝试 password/p12pwd/pwd 等常见字段,取不到就回落到 data/upstream.json 的 p12Password。请确认该站签出的 P12 是否无密码,若有固定密码,把它填进 p12Password。

数据存在哪

订单:data/orders.json 证书:certs/<订单号>.p12 与 .mobileprovision。换成数据库只是把 read_orders() / save_orders() 两个函数改成 SQL,其余不用动。