# Web Push RFC 8030 请求 + VAPID + RFC 8291 负载加密编码器

编码完整的 Web Push 发送流程：RFC 8291 aes128gcm 负载加密、RFC 8292 VAPID ES256 JWT、RFC 8030 头部、APNs/FCM 头部对照与解密往返验证。

> 标准页面: https://elysiatools.com/zh/tools/web-push-rfc8030-vapid-rfc8291-payload-encrypted-content-encoder

- **分类:** Format Conversion

- **关键词:** web push 加密, rfc 8291 aes128gcm, vapid jwt, rfc 8292, rfc 8030 头, p256dh auth secret, ecdh p-256 hkdf, apns 头, fcm collapse key, 推送往返验证

## 概述

加密严格遵循 RFC 8291：应用服务器临时密钥与订阅 p256dh 密钥做 P-256 ECDH，HKDF-SHA256 结合 auth secret（"WebPush: info" 上下文），随机 16 字节盐，经 "Content-Encoding" 上下文派生 CEK/nonce，并用 RFC 8188 二进制头（盐 + 记录长度 + 密钥 ID）做 AES-128-GCM。实现逐字节复现 RFC 8291 §5 与 draft-ietf-webpush-encryption-04 的官方算例。

## 输入项

- **负载（明文）** (textarea): Message body sent to the user agent, e.g. {"title":"Order shipped"}
- **内容编码** (select)
- **订阅 p256dh（base64url）** (text): uncompressed P-256 point from subscription.keys.p256dh
- **订阅 auth secret（base64url）** (text): 16-byte secret from subscription.keys.auth
- **接收端私钥（base64url，可选——用于往返验证）** (text): user-agent P-256 scalar, only if you own the subscription keys
- **应用服务器临时私钥（base64url）** (text): 32-byte P-256 scalar; generate fresh per send in production
- **盐（base64url，16 字节）** (text): random 16 bytes per message in production
- **填充字节数** (number)
- **TTL 秒数（RFC 8030）** (number)
- **紧急度（RFC 8030）** (select)
- **主题（RFC 8030，可选）** (text): coalescing key, e.g. new-message
- **推送服务主机** (text)
- **端点路径** (text)
- **构建 VAPID Authorization 头（RFC 8292）** (checkbox)
- **VAPID sub（联系方式）** (text)
- **VAPID aud（推送服务源）** (text)
- **VAPID exp（unix 秒）** (number)
- **VAPID 签名私钥（base64url）** (text): P-256 scalar, MUST differ from the encryption key

## 适用场景

- 在开发或调试 Web 推送后端服务时，需要验证 ECDH P-256 与 HKDF-SHA256 密钥派生及 aes128gcm 密文计算的准确性。
- 需要根据订阅端点生成符合 RFC 8292 标准的 VAPID Authorization 头并核对 ES256 JWT 签名与有效期声明。
- 排查推送服务返回的 400 Bad Request、401 Unauthorized 或 413 Payload Too Large 等协议交互错误。

## 工作原理

- 基于订阅端公钥（p256dh）与应用服务器临时私钥进行 P-256 ECDH 协商，结合 auth secret 经由 HKDF-SHA256 派生会话主密钥（IKM）。
- 使用 16 字节随机盐与指定上下文标签派生内容加密密钥（CEK）与 Nonce，对明文负载执行 AES-128-GCM 加密并封装二进制头部（RFC 8188）或 HTTP 头字段。
- 根据配置的 VAPID 私钥签发 ES256 JWT 令牌，并一并组装 TTL、Urgency、Topic 等 RFC 8030 请求头以及 FCM/APNs 协议映射表。

## 使用案例

- 自研 Web Push 服务端推送信道时，比对标准 RFC 8291 §5 向量以保证加密库实现的逐字节兼容性。
- 构造包含 VAPID 头和加密 Body 的完整 HTTP/2 POST 请求报文，用于 Postman 或 curl 联调推送网关。
- 分析多端推送协议差异，快速对照 RFC 8030 与 APNs/FCM 特有头部（如 collapse_key 与 apns-priority）。

## 常见问题

### 现行 RFC 8291 与传统 aesgcm（draft-04）有什么区别？

RFC 8291（aes128gcm）将盐、记录长度与临时公钥统一封装在二进制负载头部；而 draft-04 则依赖 Encryption 与 Crypto-Key HTTP 头传递参数并使用不同的 HKDF 上下文字符串。

### 应用服务器私钥与 VAPID 私钥可以使用同一个吗？

不建议。RFC 8291 加密私钥应为每次推送生成的临时密钥，而 RFC 8292 VAPID 私钥是代表应用服务器身份的长期凭据。

### 为什么加密结果需要传入 16 字节的 Salt（盐）？

盐用于保证即使向同一订阅者发送相同明文，每次派生出的加密密钥和密文也完全不同，防止重放与已知明文分析。

### 接收端私钥（uaPrivateKey）是必须填写的吗？

非必填。仅当您需要执行解密往返验证以确认派生出的密文可被客户端成功还原时才需要提供。

### Topic 请求头的作用是什么？

Topic 用于消息聚合与替换。在推送服务队列中，带有相同 Topic 的未送达旧消息会被新消息自动覆盖。

## 相关工具

- [Data URI 生成器](https://elysiatools.com/zh/tools/data-uri-generator): 将文件转换为 Data URI（Base64 或百分号编码），用于直接在 HTML、CSS 或 Markdown 中内联图片、字体等资源
- [哈希算法对比器](https://elysiatools.com/zh/tools/hash-algorithm-comparator): 对同一输入同时用 MD5、SHA-1、SHA-256、SHA-512、BLAKE2b、BLAKE3 哈希并横向对比：输出长度、十六进制/Base64 摘要、安全状态（已破解/现代）以及相对速度基准。适合教学、选择哈希算法或核对校验和。
- [RSA 加解密](https://elysiatools.com/zh/tools/rsa-encrypt-decrypt): 用 RSA 公钥加密文本，或用匹配的私钥解密密文，使用 OAEP 填充（SHA-1 或 SHA-256）。支持长消息分段。密钥与数据均在本地，不外传。由于 Bleichenbacher 攻击，Node 已禁用 PKCS#1 v1.5 解密，故本工具不提供该选项。
- [OpenTelemetry W3C traceparent / tracestate / baggage 与 OTLP 头传播验证器](https://elysiatools.com/zh/tools/opentelemetry-w3c-traceparent-tracestate-baggage-and-otlp-protobuf-headers-propagation-validator): 按 W3C Trace Context ABNF 校验 traceparent（版本/16 字节 trace-id/8 字节 parent-id/1 字节 trace-flags，全零与 ff 版本拒绝、大写告警）、tracestate（≤32 个成员、simple 与 tenant@system 键、重复键告警）、baggage（百分号编码值 + 不透明属性）；校验 OTLP 导出 Content-Type 与 gRPC grpc-trace-context-bin 的 25 字节二进制上下文往返一致性；并对两个独立 traceparent 做关联 round-trip（trace-id 稳定性 + 随机子 span-id 冲突检查），输出可直接重发的规范化头。
- [Base64转换器](https://elysiatools.com/zh/tools/base64-converter): 将数据编码/解码为Base64格式，支持URL安全选项
- [PCIe 链路训练 LTSSM 与 Lane Margining 眼图解码器](https://elysiatools.com/zh/tools/pcie-link-training-linkstate-and-lane-margining-eye-decode): 解析 PCIe 链路训练日志(LTSSM 状态序列 + TS1/TS2 有序集),输出 Gen1-Gen6 全代次状态时间线、协商速率/宽度、速率标识位解码、通道反转与极性反转、均衡相位及 Detect/Recovery 重启诊断;并对 pcilmr 通道裕量报告按 Base Spec §8.4.2 逐代际判级,绘制逐通道眼图裕量热力图 SVG。
- [PKCE Code Verifier 与 Challenge 生成器](https://elysiatools.com/zh/tools/pkce-code-verifier-generator): 生成、校验与验证 OAuth2 / OIDC PKCE（RFC 7636）的 code_verifier 与 S256 code_challenge 配对。三种模式：(1) 从密码学安全随机字节（256/384/512/768 位熵）生成全新的 verifier + challenge；(2) 按 RFC 审计你已有的 verifier——长度（43–128）、字符集 \[A-Za-z0-9-._~\] 与 ≥256 位熵；(3) 通过重算 BASE64URL(SHA256(verifier)) 验证 verifier/challenge 配对。可选构建完整的授权请求 URL 与令牌交换体。补足通用的 nonce-generator（仅输出 verifier+challenge 配对）——增加 RFC 合规审计与配对验证。
- [播客章节标记生成器（ID3 / Podcasting 2.0）](https://elysiatools.com/zh/tools/podcast-chapter-marker-builder): 粘贴时间码章节列表，一次生成全部交付格式：Podcasting 2.0 章节 JSON（v1.2.0）与 RSS podcast:chapters 标签、可选把 ID3v2.4 CHAP+CTOC 章节帧直接烧入上传的 MP3（毫秒为普通大端 uint32、偏移 0xFFFFFFFF、每章嵌 TIT2 子帧、保留原有标签帧）、Vorbis CHAPTER001 注释对（OGG/Opus）、mp4chaps 文本、YouTube 说明栏时间戳块与 SRT 副车文件，并附各播放器真实支持情况（Apple 自 2025 起支持 RSS JSON；Pocket Casts/Overcast 仅读内嵌 ID3；Spotify 两者都不读）。

## 示例

- [Web Python 图像处理示例](https://elysiatools.com/zh/samples/web-image-processing-python): Web Python 图像处理示例，使用 PIL/Pillow 包括读取、保存、缩放和格式转换
- [Web Rust 图像处理示例](https://elysiatools.com/zh/samples/web-image-processing-rust): Web Rust 图像处理示例，包括图像读取保存、缩放和格式转换
- [Web TypeScript 图像处理示例](https://elysiatools.com/zh/samples/web-image-processing-typescript): Web TypeScript 图像处理示例，包括图像读取保存、缩放和格式转换
- [Web Go 文件操作示例](https://elysiatools.com/zh/samples/web-file-operations-go): Web Go 文件操作示例，包括文本文件读写、文件复制移动、目录遍历和文件验证
