C2PA 快速入门指南
C2PA 快速入门指南
Section titled “C2PA 快速入门指南”5 分钟开始使用 C2PA!本指南将帮助您理解、验证和创建 C2PA 签名内容。
理解 C2PA
Section titled “理解 C2PA”您需要了解的内容
Section titled “您需要了解的内容”C2PA 向您的媒体文件添加加密签名的”清单”,包含:
- 谁:创作者/编辑者身份
- 什么:执行的操作(创建、编辑、AI 生成)
- 何时:时间戳
- 如何:使用的工具和设置
- 来自:源材料(成分)
30 秒理解关键概念
Section titled “30 秒理解关键概念”原始照片 → [添加 C2PA 清单] → 签名照片 ↓ 包含元数据: • 创作者:张三 • 相机:Nikon Z9 • 日期:2025-11-21 • GPS:37.7749°N, 122.4194°W • 签名:✓ 有效编辑时:
签名照片 → [在 Photoshop 中编辑] → 新签名照片 ↓ 新清单引用 原始作为"成分"结果:从原始到当前版本的完整来源链。
验证 C2PA 内容
Section titled “验证 C2PA 内容”方法 1:在线工具(最简单)
Section titled “方法 1:在线工具(最简单)”无需安装!
- 访问 https://contentcredentials.org/verify
- 拖放任何图像/视频/文档
- 查看来源信息:
- 创作者身份
- 编辑历史
- 签名状态
- 原始内容(如果可用)
立即尝试 示例图像:https://contentauthenticity.org/examples
方法 2:浏览器扩展
Section titled “方法 2:浏览器扩展”在浏览时自动验证:
- 安装内容凭证扩展
- 适用于 Chrome、Edge、Brave
- 正常浏览
- 扩展自动检测 C2PA 内容
- 点击图标查看来源详情
方法 3:命令行
Section titled “方法 3:命令行”对于开发者和高级用户:
安装 c2patool
Section titled “安装 c2patool”# macOS/Linux(使用 Cargo)cargo install c2patool
# macOS(使用 Homebrew)brew install c2patool
# Windows# 从以下位置下载:https://github.com/contentauth/c2patool/releases# 基本验证c2patool photo.jpg
# 详细 JSON 输出c2patool photo.jpg --detailed
# 将清单保存到 JSON 文件c2patool photo.jpg --output manifest.json
# 检查多个文件c2patool *.jpgFile: photo.jpgStatus: ✓ Valid C2PA signature
Creator: John Doe (john@example.com)Created: 2025-11-21T10:30:00ZCamera: Nikon Z9Signature: ValidCertificate: DigiCertActions: Captured方法 4:编程方式
Section titled “方法 4:编程方式”将验证集成到您的应用:
JavaScript/Node.js
Section titled “JavaScript/Node.js”const c2pa = require('c2pa-node');
async function verify(imagePath) { const manifest = await c2pa.read(imagePath);
if (manifest) { console.log('Creator:', manifest.claim.creator); console.log('Created:', manifest.claim.created); console.log('Valid:', manifest.validation_status); } else { console.log('No C2PA data found'); }}
verify('photo.jpg');Python
Section titled “Python”from c2pa import Reader
reader = Reader('photo.jpg')manifest = reader.manifest()
if manifest: print(f"Creator: {manifest.creator}") print(f"Created: {manifest.created}") print(f"Valid: {manifest.is_valid}")else: print("No C2PA data found")创建 C2PA 内容
Section titled “创建 C2PA 内容”方法 1:使用支持的软件
Section titled “方法 1:使用支持的软件”无需编码:
Adobe Photoshop/Lightroom
Section titled “Adobe Photoshop/Lightroom”- 在 Photoshop/Lightroom 中打开图像
- 转到编辑 → 内容凭证
- 填写创作者信息
- 保存文件 → 自动添加 C2PA 清单
内置 C2PA 的相机
Section titled “内置 C2PA 的相机”- Nikon Z6 III:在相机设置中启用(2025 年计划) → 拍摄时签名照片
- Leica M11-P/SL3:自动启用签名
- Sony Alpha 系列:通过固件更新启用
方法 2:命令行(c2patool)
Section titled “方法 2:命令行(c2patool)”您需要签名证书:
用于测试(自签名):
# 生成测试证书(验证器不信任)openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes用于生产:
- 从受信任的 CA 购买证书(DigiCert、GlobalSign 等)
- 指定 C2PA 密钥使用要求
创建 manifest.json:
{ "claim_generator": "my-app/1.0", "assertions": [ { "label": "stds.schema-org.CreativeWork", "data": { "@context": "https://schema.org", "@type": "CreativeWork", "author": [ { "@type": "Person", "name": "张三" } ] } }, { "label": "c2pa.actions", "data": { "actions": [ { "action": "c2pa.created" } ] } } ]}# 使用您的证书签名c2patool photo.jpg \ --manifest manifest.json \ --signer-cert cert.pem \ --signer-key key.pem \ --output signed_photo.jpg
# 验证是否成功c2patool signed_photo.jpg方法 3:编程方式
Section titled “方法 3:编程方式”use c2pa::{Builder, SigningAlg};
fn main() -> Result<(), Box<dyn std::error::Error>> { let mut builder = Builder::from_file("input.jpg")?;
// 添加创作者断言 builder.add_assertion("stds.schema-org.CreativeWork", r#"{"author": [{"name": "张三"}]}"#)?;
// 签名并保存 let signer = get_signer(); // 您的证书/密钥 builder.sign("output.jpg", signer)?;
Ok(())}JavaScript/Node.js
Section titled “JavaScript/Node.js”const c2pa = require('c2pa-node');
async function sign(inputPath, outputPath) { const manifest = { claim_generator: 'my-app/1.0', assertions: [ { label: 'stds.schema-org.CreativeWork', data: { author: [{ name: '张三' }] } } ] };
const signer = { cert: 'path/to/cert.pem', key: 'path/to/key.pem' };
await c2pa.sign(inputPath, outputPath, manifest, signer); console.log('签名成功!');}
sign('input.jpg', 'output.jpg');Python
Section titled “Python”from c2pa import Builder, Signer
# 创建构建器builder = Builder.from_file('input.jpg')
# 添加断言builder.add_assertion('stds.schema-org.CreativeWork', { 'author': [{'name': '张三'}]})
# 签名signer = Signer('cert.pem', 'key.pem')builder.sign('output.jpg', signer)
print('签名成功!')方法 4:编辑签名内容(保留来源)
Section titled “方法 4:编辑签名内容(保留来源)”编辑 C2PA 签名内容时,将原始内容引用为”成分”:
# 编辑并保留链c2patool edited_photo.jpg \ --parent original_photo.jpg \ --manifest edit_manifest.json \ --signer-cert cert.pem \ --signer-key key.pem \ --output final_photo.jpg新清单将引用 original_photo.jpg 作为成分,保留完整历史。
理解规范:
探索工具:
常见问题:
官方教程:
代码示例:
上线前:
-
获取生产证书
- 从受信任的 CA 购买(DigiCert、GlobalSign 等)
- 确保 C2PA 兼容的密钥使用
- 成本:约 50-500 美元/年
-
安全密钥存储
- 为私钥使用硬件安全模块(HSM)
- 或云 HSM(AWS CloudHSM、Azure Key Vault)
- 切勿将密钥提交到源代码管理
-
彻底测试
- 使用多个验证器验证签名
- 测试不同文件格式
- 检查跨平台兼容性
-
监控和维护
- 实施证书轮换
- 监控撤销
- 保持 SDK 更新
与您的应用集成
Section titled “与您的应用集成”关键集成点:
您的应用工作流:
1. 内容创建/上传 ↓2. [添加 C2PA 清单] ← 您的集成点 ↓3. 使用证书签名 ↓4. 保存/发布签名内容 ↓5. [可选] 显示时验证 ← 另一个集成点典型集成时间:
- 简单验证:1-2 天
- 基本签名:3-5 天
- 完整生产部署:2-4 周
测试(免费):
- 自签名证书
- 仅适用于开发
- 验证器不信任
生产:
- DigiCert:https://www.digicert.com/
- GlobalSign:https://www.globalsign.com/
- Entrust:https://www.entrust.com/
- 请求带有 C2PA 密钥使用扩展的证书
获取帮助:
- GitHub Issues - 错误报告
- GitHub 讨论 - 问题
- C2PA 网站 - 官方资源
贡献:
- awesome-c2pa - 添加资源、翻译文档
- C2PA 实现 - 贡献代码
- 内容真实性倡议 - 加入运动
c2patool image.jpgc2patool input.jpg \ --manifest manifest.json \ --signer-cert cert.pem \ --signer-key key.pem \ --output signed.jpg从 Web 检查
Section titled “从 Web 检查”https://contentcredentials.org/verify常见清单模板
Section titled “常见清单模板”{ "claim_generator": "app-name/version", "assertions": [ { "label": "stds.schema-org.CreativeWork", "data": { "author": [{"name": "创作者姓名"}] } } ]}”未找到 C2PA 数据”
Section titled “”未找到 C2PA 数据””- 文件可能没有 C2PA 清单
- 元数据可能已被删除
- 尝试不同的文件格式
”无效签名”
Section titled “”无效签名””- 签名后文件被修改
- 证书被撤销或过期
- 信任链断开
”证书不受信任”
Section titled “”证书不受信任””- 使用自签名证书(测试预期)
- CA 不在信任列表中
- 如果需要,添加自定义信任锚点
- C2PA 每个清单添加约 10-50KB(最小)
- 典型文件签名时间 < 1 秒
- 验证几乎是即时的
准备好开始了吗? 选择上面的方法并开始!
最后更新:2025 年 11 月