惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
P
Palo Alto Networks Blog
C
Cisco Blogs
The Hacker News
The Hacker News
T
Threatpost
S
Schneier on Security
K
Kaspersky official blog
Spread Privacy
Spread Privacy
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
博客园 - 叶小钗
H
Hackread – Cybersecurity News, Data Breaches, AI and More
N
News and Events Feed by Topic
爱范儿
爱范儿
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
V
V2EX
Webroot Blog
Webroot Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
Scott Helme
Scott Helme
Simon Willison's Weblog
Simon Willison's Weblog
L
LangChain Blog
W
WeLiveSecurity
Cloudbric
Cloudbric

土法炼钢兴趣小组的算法知识备份

国密算法与国密 TLS 系列索引 【系统架构设计】架构质量属性:不只是"高可用高性能" 【系统架构设计百科】告警策略:如何避免"狼来了" 【系统架构设计】CQRS:读写分离的架构哲学 【系统架构设计】空间架构:极端扩展场景的解法 【系统架构设计】微服务架构深度审视:优势、代价与适用边界 【系统架构设计】扩展性原理:水平、垂直与对角扩展 【系统架构设计】无状态设计:扩展的第一步也是最难的一步 【系统架构设计】缓存架构:从本地到分布式的多级缓存体系 【系统架构设计】管道与过滤器:Unix 哲学的架构表达 【系统架构设计】复杂性管理:架构的核心战场 【系统架构设计】消息队列架构:异步解耦的设计与陷阱 【系统架构设计】CDN 架构:全球加速的设计原理 【系统架构设计】连接池设计:被忽视的性能杀手 【系统架构设计】弹性设计模式:熔断器、舱壁与超时 【系统架构设计】高可用设计模式:冗余、故障转移与仲裁 【系统架构设计】容量规划:从拍脑袋到数据驱动 【系统架构设计】数据库扩展:分库分表的工程实践与替代方案 【系统架构设计】SLO 工程:可靠性的量化管理 【系统架构设计】性能建模:用数学思维分析系统瓶颈 【系统架构设计】混沌工程:主动验证系统的韧性 【系统架构设计】零拷贝与内存映射:数据搬运的极致优化 【系统架构设计】线程模型:从 thread-per-request 到协程 【系统架构设计】容灾架构:多活与灾备设计 【系统架构设计】数据库性能模式:索引、查询与连接管理 【系统架构设计】数据建模:从关系范式到文档模型的真实权衡 【系统架构设计】吞吐量优化:批处理、流水线与并发模型 【系统架构设计】流处理架构:从批处理到实时的范式迁移 【系统架构设计】搜索引擎架构:倒排索引之上的系统设计 【系统架构设计】时序数据架构:监控与 IoT 的存储设计 【系统架构设计】数据迁移与版本化:在线不停机的数据演进 【系统架构设计】数据湖与数据仓库:分析架构的演进路线 【系统架构设计】API 网关设计:入口层的职责边界 【系统架构设计】应用层数据一致性模式:在正确性与性能之间走钢丝 【系统架构设计】多模数据库选型:Polyglot Persistence 的工程实践 【系统架构设计】服务发现与注册:动态拓扑的基础设施 【系统架构设计】配置管理架构:从配置文件到配置中心 【系统架构设计】全链路压测:大规模系统的性能验证 【系统架构设计】幂等性设计:分布式环境下的安全重试 【系统架构设计】契约测试与 Schema 演进:服务间的信任协议 【系统架构设计】长连接与推送架构:WebSocket、SSE 与 MQTT 【系统架构设计】延迟分析:从 P50 到 P999 的全链路追踪 【系统架构设计百科】DDD 战术模式:聚合、实体与值对象 【系统架构设计百科】防腐层与开放主机服务:系统集成的 DDD 方案 【系统架构设计百科】领域事件与事件风暴:从业务到架构的桥梁 【系统架构设计百科】CQRS + Event Sourcing 完整实战:从领域建模到部署 【系统架构设计百科】DDD 与微服务:用领域模型划分服务边界 【系统架构设计】DDD 战略设计:限界上下文与上下文映射 【系统架构设计百科】认证架构:从 Session 到 JWT 到 OIDC 【系统架构设计】API 设计哲学:REST vs GraphQL vs gRPC 的真实权衡 排序算法专题:从 TimSort 到并行排序 【密码学百科】国密算法体系:SM2/SM3/SM4/SM9 全景解读 【密码学百科】承诺方案:Pedersen 承诺、向量承诺与多项式承诺 【密码学百科】不经意传输与隐私信息检索:OT、OT 扩展与 PIR 【密码学百科】门限密码学:门限签名、门限解密与分布式密钥生成 完美哈希:从理论到 gperf 实践 【密码学百科】安全多方计算:从 Yao 的混淆电路到实用 MPC 【密码学百科】同态加密:从 Paillier 到全同态加密(FHE) 【密码学百科】零知识证明系统:zk-SNARKs、zk-STARKs 与 Bulletproofs 【密码学百科】概率论与密码分析:生日攻击、差分分析与线性分析 【密码学百科】计算复杂性与归约:密码安全性证明的基石 【密码学百科】秘密共享:Shamir 方案、VSS 与安全多方计算入口 【密码学百科】椭圆曲线代数:Weierstrass 方程、点群运算与曲线选择 【密码学百科】离散对数与配对密码学:从 DLP 到 BLS 签名 【密码学百科】格密码数学基础:SVP、LWE 与格基约化 【密码学百科】抽象代数:群、环、域的密码学视角 【密码学百科】有限域算术:GF(2^n) 运算与在 AES/ECC 中的应用 【密码学百科】数论进阶:二次剩余、椭圆曲线上的 Weil 配对 【密码学百科】密码学简史:从凯撒密码到量子时代 【密码学百科】威胁模型与安全目标:CIA 三要素之外 【密码学百科】Kerckhoffs 原则与现代密码设计哲学 【密码学百科】随机性:密码学的基石 【密码学百科】信息论入门:熵、完美保密与 Shannon 定理 【密码学百科】分组密码原理:Feistel 网络与 SPN 结构 【密码学百科】AES 逐步拆解:SubBytes 到 MixColumns 的数学 【密码学百科】分组密码工作模式全览:ECB/CBC/CTR/OFB/CFB 【密码学百科】流密码:RC4 的兴衰与 ChaCha20 的崛起 【密码学百科】密码学哈希函数:MD5→SHA-2→SHA-3 的进化之路 【密码学百科】MAC 与 HMAC:消息认证的正确姿势 【密码学百科】认证加密(AEAD):GCM、ChaCha20-Poly1305 与 OCB 【密码学百科】密钥派生函数:HKDF、PBKDF2、Argon2 与密码存储 【密码学百科】公钥密码的数论基础:模运算、群、原根 【密码学百科】RSA 从原理到攻击:教科书 RSA 为什么不安全 【密码学百科】Diffie-Hellman 密钥交换与离散对数问题 【密码学百科】椭圆曲线密码学(ECC):从几何直觉到点群运算 【密码学百科】数字签名:ECDSA、EdDSA 与 Schnorr 签名 【密码学百科】现代密钥交换:X25519、ECDHE 与前向保密 【密码学百科】混合加密与 KEM/DEM 范式:ECIES 与 HPKE 【密码学百科】填充方案:PKCS#1 v1.5、OAEP 与 PSS 【密码学百科】TLS 协议全解析:从握手到 0-RTT 【密码学百科】PKI 与数字证书:信任链的构建与崩塌 【密码学百科】密码认证协议:从 SRP 到 OPAQUE 【密码学百科】零知识证明入门:如何证明你知道而不泄露 【密码学百科】安全信道构造:Noise 协议框架与 Signal 协议 【密码学百科】密钥管理工程:HSM、KMS 与密钥生命周期 【密码学百科】侧信道攻击:从时序攻击到功耗分析 【密码学百科】密码学实现陷阱:三层漏洞分类、审计工具链与系统性预防 密码敏捷性:如何设计可升级的密码系统 【密码学百科】OpenSSL/BoringSSL 架构剖析:ENGINE、Provider 与 FIPS 模块 排序基准测试:用数据说话
【开源许可与版权工程】出海合规:ECCN、实体清单、加密出口、基金会与 OFAC
2026-04-22 · via 土法炼钢兴趣小组的算法知识备份

很多中国开发者把”合规”想象成一件离自己很远的事情:那是律师、外贸、大厂法务部门的工作。直到某一天:

  • 自己维护的 npm 包因为账号被识别为位于伊朗而被锁定;
  • 提交到 Apache 某项目的 PR 因为涉及 OpenSSL 的补丁,被要求先走 ASF 的 Export Classification 流程;
  • 在香港开了一家小公司,想把含有 TLS 的 SDK 卖到中东客户,客户要你提供 ECCN(Export Control Classification Number,出口管制分类编号);
  • 2024 年底在 LKML(Linux Kernel Mailing List,Linux 内核邮件列表)里看到俄罗斯维护者被”移除”,于是突然意识到这件事并不只是”国家间的事情”。

对于做基础设施、做加密、做数据库、做云、做操作系统、做区块链的团队,出口管制(export control)几乎不可回避。本篇我们梳理 EAR(Export Administration Regulations,出口管理条例)框架、ECCN 体系、实体清单(Entity List)、OFAC(Office of Foreign Assets Control,美国海外资产控制办公室)制裁名单,以及它们如何落到”开源项目 / 开源基金会 / 个人贡献者”这一层。

本文不是法律意见,是一份工程参考。具体场合请咨询律师。

在继续之前,先给读者一个整体的心态校准:

  • 出口管制不是”要不要遵守”而是”怎么最低成本遵守”。对于 99% 的开源项目,走一次 TSU 通知 + 保留记录就足够;
  • 合规不是越早越严厉越好。过度合规(例如一上来就禁止所有海外 region、要求客户签复杂的出口协议)会严重影响产品体验,反而让业务活不下来;
  • 中国开发者不必焦虑。绝大多数开源参与(贡献代码、维护项目、加入基金会、成为 Committer)都不在出口管制受限范围;真正需要关注的是一小部分高敏场景;
  • 公司层面的合规与个人层面的参与要区分。你在大厂作为员工维护的项目受公司合规约束;你以个人身份参与的开源项目受你所在地法律约束,两者规则不同。

一、出口管制的基础框架

1.1 EAR(出口管理条例)概述

EAR 由美国商务部(Department of Commerce)下属的 BIS(Bureau of Industry and Security,工业与安全局)颁布,法规文本位于《美国联邦行政法典》第 15 编第 730–774 部分(15 CFR Parts 730–774)。它管控的不是”纯粹的军品”(那些在 ITAR 下,由国务院管),而是所谓的”两用物项”(dual-use items):既可民用,也可军用。

EAR 的管辖对象非常宽泛:

  • 美国原产(U.S.-origin)的商品、软件、技术;
  • 在美国之外生产,但含有超过 de minimis 比例美国受控成分的产品;
  • 使用美国受控技术或软件在境外直接生产的产品(FDP,Foreign Direct Product Rule,外国直接产品规则);
  • 某些情况下,位于美国的”人”的行为(deemed export,视同出口,向美国境内外国人披露受控技术也算出口)。

对开源软件来说,最常打交道的是”软件”(software)和”技术”(technology)这两类,以及它们落到加密类别下的那些条目。

EAR 并不是美国唯一的出口管制机制。旁边还有几个需要同时关注的:

  • ITAR(International Traffic in Arms Regulations):由国务院执行,管军品 USML(United States Munitions List)。开源领域极少涉及,除非你的代码含有明确的武器设计用途。
  • OFAC 制裁:由财政部执行,后文详细讲。
  • CFIUS:外国投资审查,影响公司级别的并购而非代码。
  • 美国商务部 ICTS 规则:信息与通信技术与服务供应链审查,2020 年设立,可能影响涉及中国 / 俄罗斯的 ICT 产品在美国市场的销售。

对中国开发者来说,欧洲的”Dual-Use Regulation”(EU 2021/821)、英国的”UK Strategic Export Control Lists”、日本的”外汇及对外贸易法”都是与 EAR 有协调关系的多边体系(这些体系的底层都参考 Wassenaar Arrangement 瓦森纳安排)。做跨多国生意时,至少要扫过这几套名单。

把 EAR 的管辖要点列成表,便于对照:

管辖面 触发条件 对开源的含义
U.S.-origin 物项 在美国研发 / 生产 / 首发 美国开发者主导的开源项目天然落入 EAR
de minimis 非美国产品含超过 10%(对古巴 / 伊朗等为 0% 或 25%)美国受控成分 你在香港发布的 SDK 如果 80% 代码来自 OpenSSL,则整包须同等对待
FDP Rule 用美国受控技术 / 软件 / 设备在第三地生产 用美国 EDA 工具在大陆流片的芯片,可能仍受 EAR
deemed export 在美国境内,向外国人披露受控技术 在美分公司雇佣中国籍工程师、接触 5E002 技术,触发
re-export 从 A 国出口到 B 国 把美国发布的库再打包上传到俄罗斯镜像站,可能违规

理解这张表后再看后续的开源豁免就会明白:开源之所以能全球流通,不是因为 EAR 不管,而是因为它为”公开可用”留了口子

1.2 ECCN(出口管制分类编号)体系

EAR 附录中的 CCL(Commerce Control List,商业管制清单)把受控物项编号为 ECCN,格式形如 5D002

  • 第一位数字是类别(Category),0–9:0 核材料、1 材料、2 材料加工、3 电子器件、4 计算机、5 电信与信息安全、6 传感器与激光、7 导航、8 海事、9 航空航天推进;
  • 第二位字母是产品组(Product Group),A 设备 / B 测试设备 / C 材料 / D 软件 / E 技术;
  • 后三位是具体条目编号。

开源开发者最熟悉的几个:

  • 5A002:含加密功能的硬件 / 设备;
  • 5D002:含加密功能的软件;
  • 5E002:与上述相关的技术;
  • 4D001:某些高性能计算机软件;
  • 3A001:某些电子器件。

几个”看似无害但其实值得留意”的条目:

  • 3A090 / 4A090:2022 年 10 月新增的先进 AI 芯片类别,用于限制高端 GPU / 加速卡出口;开源项目如果打包了含有这些硬件 SDK 的二进制,要单独评估;
  • 4D090:与 3A090 / 4A090 配套的软件条目;
  • 5D992:mass market 加密软件,介于 EAR99 和 5D002 之间,自我分类 report 即可;
  • 5D002.c.1 vs 5D002.d.1:前者是”含加密功能”的软件,后者是”专用于设计、生产、使用 5A002 / 5D002 / 5E002 物项”的软件,后者出口比前者更敏感;
  • EINS 两种控制原因(Reasons for Control):EI 是 “Encryption Items”,NS 是 “National Security”;TSU §740.13(e) 豁免会移除这两类控制。

不在 CCL 上的物项归为 EAR99——仍在 EAR 管辖内,但一般不需要许可证,除非目的国 / 最终用户 / 最终用途触发了限制。大量普通商业软件(不涉及加密、不涉及高性能计算、不涉及核材料)都落在 EAR99。

大量普通商业软件(不涉及加密、不涉及高性能计算、不涉及核材料)都落在 EAR99。

补充几个开源项目对号入座的例子:

  • Apache Kafka 本体是事件流平台,不实现加密,但 kafka-clients 支持 SASL / SSL。ASF 的 ECCN Matrix 把它列为 5D002(因为它配置层可启用 TLS),使用 TSU 豁免。
  • Apache Tomcat 同理,因为内置 HTTPS connector。
  • Apache POI 是 Office 文档处理库,本身不加密,但由于能读写加密 OOXML,也标记为 5D002。
  • Apache Commons Lang 一类纯工具库,归 EAR99。
  • TensorFlow 本体是机器学习框架,落 EAR99;但 Google 的商业 AI 服务(Vertex AI 等)是另一回事。
  • FRP(Fast Reverse Proxy)这类 Go 语言的反向代理开源工具,因为实现了自己的加密通道(AES),在严格意义上也要算 5D002。

可以看出,“是否含加密”比”是否高科技”对 ECCN 的影响更大。

1.3 开源软件的特殊豁免

EAR 对开源软件有两条关键豁免:

  1. 公开可用(publicly available)例外。见 15 CFR §734.3(b)(3):已公开发布、可被公众无限制获取的”已发布”技术和软件,通常不属于 EAR 管辖范围。但这条不适用于加密软件——加密是个特例。
  2. TSU 豁免(License Exception TSU)中的 “Unrestricted Encryption Source Code”。15 CFR §740.13(e):以源代码形式公开可用的加密软件,只要在首次发布时向 BIS 和 NSA ENC Encryption Request Coordinator 发送一封”URL 通知”邮件,就可以走这条豁免路径,向绝大多数国家出口。这也是 Linux 内核、OpenSSL 等开源加密项目能在全球合法分发的法律基础。

“公开可用”这个术语本身也有精确定义。§734.7 给出了几种情况:

  • 向公众免费发布(例如 GitHub 公开仓库);
  • 期刊、书籍、论文、会议材料中公开发表;
  • 通过图书馆、展会、公开讲座等让公众可获取;
  • 以及经过 “fundamental research” 程序产生的科研成果。

反过来,一些不算公开可用的情况:

  • 仅向特定客户 / 合作伙伴发放的源代码(即使包含在商业协议下);
  • 以 NDA 保护的预发布版本;
  • 内部员工可见但未对外发布的仓库;
  • 通过付费墙访问、但实际上”任何付费都能拿到”的情况,定义上视具体合同而定,偏模糊。

于是就出现了一个微妙的区分:

场景 适用条款
非加密的开源软件 §734.3(b)(3) 公开可用,不在 EAR 管辖
加密的开源源代码 §740.13(e) TSU,在 EAR 管辖但有豁免
加密的开源二进制 也可走 §740.17 ENC 等路径
闭源加密商业软件 5D002,需分类(CCATS)+ 许可证或 ENC 豁免

后面的章节会把这张表展开。

需要澄清的一点:EAR99 与 §734.3(b)(3) 是两件事。EAR99 是 CCL 未分类的状态,它依然”在 EAR 管辖之内”,只是不需要许可证(除非目的地 / 最终用户触发)。而 §734.3(b)(3) 则是”直接移出 EAR 管辖范围”。对开源而言:

  • 非加密 + 公开可用 = 通过 §734.3(b)(3) 直接出 EAR;
  • 加密 + 公开可用 源代码 = 仍在 EAR,但通过 §740.13(e) TSU 不需要许可证;
  • 加密 + 商业闭源 = 留在 EAR,需要 5D002 分类 + ENC 豁免 / 许可证。

二、加密软件的出口分类

2.1 5D002:大多数加密软件的 ECCN

在 CCL 上,5D002 覆盖了”为加密而设计或修改的、使用 对称密钥长度超过 56 比特 / 非对称密钥长度超过 512 比特 / 椭圆曲线超过 112 比特 的软件”。简单说:几乎所有带 TLS 1.2+、AES-128+、RSA-2048+、ECC P-256+ 的软件都会落到 5D002。

几个常见的误解:

  1. “我只是调用 HTTPS,不算密码学实现”:EAR 看的是软件对外提供的功能,而不是”是不是自己实现的”。只要最终用户能通过该软件使用受控强度的加密,一般就归 5D002。
  2. “我用的是系统自带的库,不算我的”:打包 / 分发环节决定管辖,如果你的 binary / image / installer 把加密库捆绑了进去(无论是静态链接还是 bundle so / dll),出口时按整体分类。
  3. “研究论文里的加密算法代码也算 5D002”:纯学术 / 教育用途的公开发布,可走 §734.3(b)(3) 的例外之一(“fundamental research”),但边界需要与具体机构的 technology control plan 结合判断。

这意味着:

  • 一个纯业务逻辑的 Spring Boot 应用不一定在 5D002,但一旦它 implementation 'org.bouncycastle:bcprov-jdk18on' 或走 TLS 握手,链路上的组件多半都是 5D002。
  • Nginx、OpenSSH、OpenSSL、BoringSSL、curl、Go 的 crypto/tls、Python 的 cryptography 都在 5D002。
  • 一个区块链节点(以太坊、比特币客户端)由于使用 secp256k1 的签名、AES 加密 keystore,也在 5D002。
  • Vault / etcd / Consul 等含 TLS 的分布式系统都在 5D002。
  • 一个 Web 框架(如 Rails、Django)本体可能是 EAR99,但其附带的 has_secure_password、session cookie 加密一旦出现,也会使整体分类偏向 5D002。

判断的关键词是”functionality”而不是”行数”。只要最终产物对外暴露出加密能力,就倾向归入 5D002。

但 5D002 只是分类,不等于”禁止出口”。真正决定是否需要许可证的,是”目的地 + 最终用户 + 最终用途”三要素。

2.2 EAR99 与公开可用豁免

如果你的项目:

  • 不含任何密码学功能(纯静态博客、纯业务 SaaS UI);
  • 不在 CCL 上其它条目(不是高性能计算、不是传感器相关);

那它归为 EAR99。EAR99 + 公开可用的项目,加上 §734.3(b)(3) 的豁免,实际上处于”几乎不受 EAR 管辖”的状态。但即便如此,仍然有三条红线:

  1. 不能出口到禁运国(E:1 / E:2 国家名单,包括古巴、伊朗、朝鲜、叙利亚,以及受限制的俄罗斯 / 白俄罗斯领土);
  2. 不能向 SDN / Entity List 上的最终用户出口;
  3. 不能用于被 EAR §744 禁止的用途(大规模杀伤性武器 / 特定军事最终用途等)。

这三条对开源软件意味着:GitHub 在识别到某个账户位于伊朗时会主动锁定,这不是 GitHub 愿意,是 EAR 和 OFAC 要求。

值得展开的一点是 EAR §744 的”最终用途”清单,通常包括:

  • 核武器设计 / 部署用途(§744.2);
  • 化学 / 生物武器相关用途(§744.4);
  • 导弹技术用途(§744.3);
  • 对伊朗 / 古巴 / 朝鲜 / 叙利亚的军事最终用户(§744.8–§744.11);
  • 对中国、委内瑞拉、缅甸等国的军事最终用户(§744.21);
  • 特定”超级计算机”用途(§744.23);
  • 人权侵害(§744.6 中部分条款)。

这些”use-based”控制是开源项目最容易忽视的红线之一——即便软件本身是 EAR99,如果知道或应知最终用户是这类用途,仍然不得出口。典型应对:在用户协议或 README 里添加一段”prohibited use”说明,并配合 CI 扫描检测已知高风险用户模式。

2.3 TSU 豁免(Technology and Software — Unrestricted)

§740.13 下的 TSU 豁免包含几种小类,其中 §740.13(e) 专门给开源加密源代码:

Publicly available encryption source code classified under ECCN 5D002 (and corresponding object code resulting from the compiling of such source code) is released from “EI” and “NS” controls …

使用条件:

  1. 源代码是 “publicly available”(通常指发布在公开的网站、代码仓库);
  2. 在首次发布或首次公开可获取之时(不是后续每次更新),向 BIS 的 crypt@bis.doc.gov 和 NSA 的 enc@nsa.gov 发送一封邮件,内容是源代码的 URL(或者告知该 URL 在哪里);
  3. 如果后续代码移动到新 URL,一般需要再次发送通知。

Apache 基金会在 https://www.apache.org/licenses/exports/ 维护了一份”ECCN Matrix”,把所有顶级项目的 ECCN、加密算法、TSU 通知情况列出来。这是给下游用户(特别是美国及其合作国用户)看的合规证据。

一封”符合 §740.13(e)“的 TSU 通知邮件长什么样?大致如下(实际文本以 BIS 最新指南为准):

To: crypt@bis.doc.gov
Cc: enc@nsa.gov
Subject: TSU notification for publicly available encryption source code

Pursuant to 15 CFR §740.13(e), this is a notification that the following
publicly available encryption source code has been posted on the
Internet and is available for download without restriction:

  Project:      <project name>
  URL:          https://github.com/<org>/<repo>
  Description:  <one-paragraph description; algorithms used>
  Maintainer:   <name, affiliation, country>

Any future changes in URL will be notified.

Regards,
<name>

这封邮件不是”申请许可证”,是”通知”。一般不会收到批准回执,保留发信记录即可。

2.4 如何判断你的项目的 ECCN

工程上一般走这个流程:

  1. 梳理项目中出现的加密函数 / 库的依赖。包括直接依赖和传递依赖;特别注意 TLS 实现、哈希、签名、对称加密、KDF。
  2. 查 Apache ECCN Matrix / 依赖项目的上游声明。OpenSSL、Bouncy Castle、WolfSSL 等都有发布过自己的 ECCN。
  3. 判断你的项目是”单纯调用加密” 还是 “提供加密功能给他人使用”。前者一般随主功能分类(5D002 仍然常见但不一定),后者几乎肯定是 5D002。
  4. 判断是否公开发布。GitHub 公开仓库 = publicly available。
  5. 走 TSU 通知。真正商业化 / 闭源化的版本,另外做 CCATS(Commodity Classification Automated Tracking System,商品分类自动跟踪系统)分类请求。

再补充几条”不太容易踩的”细节:

  • 静态链接 vs 动态链接:若项目在 release artifact 中 静态链接了 OpenSSL / BoringSSL,通常就被视为”软件包含加密”,分类依然是 5D002;如果只是在运行时 dlopen 系统自带的加密库,项目本体可能仍能归 EAR99,但要在文档中明确说明”本软件不包含加密实现”。
  • 可选加密功能:某些项目提供 --with-ssl / --with-crypto 编译开关,默认关闭。这种情况下主 release 可以保持 EAR99,而含加密的 release 走 5D002;两种 artifact 分开分类。
  • 第三方插件机制:项目本体是插件宿主,插件由第三方编写并加密。通常宿主归 EAR99,插件各自分类。代表案例:VS Code 本体(EAR99)vs 插件市场里的加密插件(各自分类)。

下面的伪代码把判断过程写成一个函数,便于在仓库 CI 中执行:

def classify(project) -> str:
    if project.uses_crypto:
        if project.source_publicly_available and project.license.is_osi_approved:
            return "5D002 (TSU exempt under 15 CFR 740.13(e))"
        if project.is_mass_market:
            return "5D992.c (ENC (b)(1), self-classification)"
        return "5D002 (requires CCATS / ENC classification)"
    if project.is_high_performance_compute:
        return "4D001 (check APP thresholds)"
    return "EAR99"

这个函数不是权威依据,但能让团队在项目立项时就回答”我会落在哪里”的问题。

本文附的 SVG 决策图是对以上流程的可视化:

出口管制决策流程

三、实体清单与基金会

3.1 实体清单(Entity List)简介

Entity List 是 EAR 附录 4(15 CFR Part 744, Supplement No. 4)列出的”受限最终用户”名单。被列入后,向其出口 / 再出口 / 国内转移任何 EAR 管辖物项通常需要许可证,且大多数申请会被”推定拒绝”(presumption of denial)。

与 OFAC 的 SDN 列表不同:

  • Entity List 管的是”物项流向这些实体”的行为,由 BIS 执行;
  • SDN List 管的是”与这些实体的任何金融 / 财产交易”,由 OFAC 执行,违反后果更严厉(资产冻结、刑事)。

一个实体可能同时出现在两个名单上,也可能只在其一。

除了 Entity List 和 SDN,开发者还会遇到:

  • Denied Persons List(DPL):被直接剥夺出口特权的个人 / 实体;
  • Unverified List(UVL):BIS 无法在最终用途检查中核实身份的实体;
  • Military End User(MEU)List:可能用于军事最终用途的实体;
  • Section 1260H List:美国国防部发布的”中国军事公司”名单;
  • OFAC 的 Non-SDN Chinese Military-Industrial Complex Companies(NS-CMIC)List:限制美国人投资的中国军工复合体公司。

对出海企业来说,仅做一次 SDN 筛查远远不够,通常需要引入 Dow Jones Risk & Compliance / Refinitiv World-Check / 海关 screening API 之类的商业服务,一次把十几张名单打平。

几个容易被忽略的”名单交叉”细节:

  • 同一个实体被列入 Entity List 不代表自动进入 SDN;两套名单由不同机构维护,需要同时查;
  • 实体的”子公司 / 分公司”在不同名单中按 “owned 50% or more” 规则有不同扩展逻辑,OFAC 对”实际控制”识别更宽,BIS 对此则要求明确列出;
  • 名单更新频率:BIS 和 OFAC 几乎每周都有增改;合规数据库的更新延迟一般不超过 24 小时,自建系统则要做好 cron job 每日同步。

3.2 2019 年 BIS 对华为的限制

2019 年 5 月 16 日,BIS 将华为技术有限公司及其约 68 家关联子公司列入 Entity List,生效日为 5 月 16 日。随后进行了多轮补充,包括 2019 年 8 月追加 46 家、2020 年 8 月追加 38 家,以及 2020 年 5 月 / 8 月两次扩展 FDP 规则,封堵使用美国技术 / 设备在第三地生产的芯片。

对开源生态的直接震荡:

  1. Android:Google 宣布对华为新机暂停提供 Google Play 服务的许可版本,但 AOSP(Android Open Source Project,安卓开源项目)部分因为是 §734.3(b)(3) 公开可用,华为仍可下载和使用。
  2. ARM:因为其部分 IP 含有美国成分,一度宣布暂停与华为的合作,后又在内部评估 IP”美国成分比例”后恢复了部分 ISA 层面的许可。
  3. SD 协会、Wi-Fi 联盟、JEDEC 等:短期内将华为从会员中移除或暂停投票权,之后随着法律评估完成,基本都恢复了其成员身份。
  4. GitHub:继续为华为员工提供公有仓库访问,依据即是 EAR 对公开可用内容的豁免。

这件事的意义在于:它让整个开源社区第一次大规模地认识到”开源项目 / 开源基金会 / 开源账号”在出口管制体系下并非完全中立。

从时间线看,2019 年之后的几次重要加码:

  • 2020 年 5 月:BIS 修订 FDP Rule,将使用美国 EDA 软件 / 半导体生产设备”为华为设计或定制”的芯片也纳入 EAR,直接切断了当时华为通过台积电代工 Kirin 的链路;
  • 2020 年 8 月:进一步扩展 FDP,使得任何”有理由知道最终用户是华为”的芯片都受 EAR 约束;
  • 2022 年 10 月:美国发布针对中国先进制程 / 高性能计算 / AI 芯片的一揽子新规,扩大到 SMIC 等更多实体;
  • 2023 年 10 月:NVIDIA A100 / H100 / L40 / RTX 4090 在 4D090 / 3A090 的新类别下被限制向中国出口。

这些都不直接涉及开源项目,但开源基础设施(特别是 AI 开源社区)的模型权重、训练集群、硬件适配层,都因此出现了”上游非美国化”的动作,比如 llama.cpp 的 CPU 推理优化、国产 GPU 厂商与 PyTorch 的后端集成。

3.3 Apache 基金会的声明与应对

ASF(Apache Software Foundation)在 2019 年 5 月 23 日发布声明(“Apache Software Foundation statement regarding the U.S. Department of Commerce restrictions on Huawei Technologies”),要点:

  1. Apache 项目的源代码以 Apache License 2.0 开源,是公开可用的出版物,受 EAR §734.3(b)(3) 和 §734.7 约束之外;
  2. 这些代码的获取、使用、再分发不因 Entity List 而改变;
  3. ASF 本身位于美国,遵守美国法律;
  4. 任何个人和组织均可继续参与 Apache 项目,遵循项目的社区规则。

这条声明保护了大量与华为 / 中国公司有关的贡献者,也让”贡献代码给 Apache 项目”这件事没有立刻变得复杂。Apache 的 ECCN Matrix 依然把含加密的项目登记为 5D002 并以 TSU 豁免方式出口。

其中一些更细的操作值得一提:

  • ASF 明确了”公司 vs 个人”的贡献边界:即便华为被列入 Entity List,其员工以 ASF Committer 身份(非以公司代表身份)参与项目仍是正常的;
  • ASF 与 Linux Foundation 的律师口径一致:代码公开可用 + service 访问基于 U.S. law,是”双层”防护模型;
  • 后续 2020–2024 年间,ASF 多次在年报中重申该立场,没有因华为之后的每一次加码而变化立场。

3.4 Linux 基金会的声明

Linux Foundation 在 2019 年 6 月发布声明,明确:

  1. Linux 内核源代码以 GPLv2 开源,是公开可用信息,不受 EAR 限制,亦适用 §734.3(b)(3) 豁免;
  2. 基金会及其项目(含 CNCF / Hyperledger / LF Networking 等)继续欢迎中国公司和开发者参与。

Linus Torvalds 本人的位置(芬兰 / 美国)和 kernel.org 基础设施(分布在多地)让内核项目在法律上有很强的”国际公开可用”属性。

除了”声明”这种形式,Linux Foundation 还通过几项结构性设计降低了合规单点:

  • 每一个子项目(含 OpenSSF、CNCF、CD Foundation、Hyperledger、LF Edge、LF Networking 等)都有独立的治理结构和财务架构;
  • 基础设施按职责分布,例如 kernel.org 服务器、GitHub mirror、国内镜像站各有冗余;
  • 会员公司分级(Platinum / Gold / Silver)但不因国籍而区别对待,华为、阿里、腾讯、字节等至今仍是 LF / CNCF 的 Platinum 或主要赞助商。

3.5 CNCF 的处理方式

CNCF(Cloud Native Computing Foundation,云原生计算基金会)作为 Linux Foundation 旗下的子基金会,同样适用 LF 的声明框架。

  • 华为、阿里云、腾讯云、字节等中国公司的员工持续担任 CNCF 各项目(Kubernetes、etcd、Envoy、containerd、Harbor 等)的 Maintainer;
  • Harbor(原 VMware 贡献,现捐献 CNCF)是第一个由中国公司主导并完成毕业的 CNCF 项目;
  • KubeCon China 延续举办。

CNCF 的治理特色使它对”国际化合规”友好:

  • 每个项目有自己的 MAINTAINERS 文件和 Governance 文档,治理决策主要由社区投票决定;
  • TOC(Technical Oversight Committee)选举向所有会员公司开放,中国公司成员长期参与;
  • CNCF 的 Code of Conduct 明确”不以国籍、所在地、雇主等作为参与门槛”。

这种”社区治理 + 基金会法务双轨”在出现合规事件时更具韧性:日常运营不因国际政治波动而变化,合规事件由基金会法务按事件处理,不波及治理结构。

3.6 对中国开发者参与基金会项目的实际影响

从工程视角看,实体清单事件留下的几个长期影响:

  1. 公有云服务 ≠ 开源代码。华为可以下载 TensorFlow 源码,但不能用 Google 的公有云 AI 服务。很多中国公司因此在内部建立了”对外依赖清单”,把”源代码”与”云服务 / 商业许可证”分开管理。
  2. 基础设施多点化。大型中企的代码镜像会同时放在 GitHub、GitLab 自建、Gitee、GitCode、Codeberg 等多处,避免任一家出现合规限制时整个研发停摆。
  3. 法律评估前置到架构。涉及加密的开源库版本锁定 + 本地镜像 + 许可证矩阵评估成为大厂 OSPO 的标配(详见本系列第 17 篇《OSPO 与合规自动化》)。一些典型的架构策略:
合规风险 对应架构动作
GitHub 访问不稳 主 repo 推 Gitee / 自建 Gitea 双向同步
Docker Hub 拉取受限 自建 Harbor,统一镜像路径 registry.corp.cn/library/*
npm / pypi 被墙 自建 Verdaccio / Nexus / devpi
闭源组件授权被停 梯度替换为开源平替,提前列出候选
关键美国开源库断更 保留长期支持分支,内部打补丁
云厂商合作被卡 多云策略(AWS + 阿里云国际 + 华为云)
特定地区客户下载 CDN 前置 GeoIP 规则
  1. 基金会投名状。中国公司在 Apache / CNCF / LF 参与度显著提高;一方面是业务需要,另一方面也是”成为规则参与者而非旁观者”的主动姿态。
  2. 从”使用者”到”贡献者”再到”捐献者”的进化。过去十年,中国企业对开源从”基本只使用”到”开始贡献”再到”主导捐献项目”的转变,部分动因就是:只有成为上游规则的塑造者,才能减小被合规风险打乱节奏的概率。Apache DolphinScheduler、Apache ShardingSphere、Apache IoTDB、CNCF Harbor、CNCF KubeEdge、Apache OpenDAL 等都是中国企业主导捐献并已毕业的项目。

4.1 OFAC 制裁名单(SDN)与制裁国

OFAC 在美国财政部之下,执行经济 / 金融制裁。其主要名单:

  • SDN(Specially Designated Nationals and Blocked Persons)List:特别指定国民名单,任何”美国人”(U.S. person,包括美国公民、绿卡持有者、在美公司和位于美国的任何人)不得与其进行交易,其财产在美管辖范围内自动冻结。
  • SSI、NS-MBS、FSE-IR、MBS 等细分名单:针对特定行业 / 部门的部分制裁。
  • 综合制裁国(Comprehensive Sanctions):古巴、伊朗、朝鲜、叙利亚、以及乌克兰的克里米亚 / 顿涅茨克 / 卢甘斯克 / 扎波罗热 / 赫尔松地区。

对开源而言,关键在两个层面:

  1. 贡献者个人:如果一个贡献者被 OFAC 认定在这些制裁国 / 在 SDN 上,项目(尤其是由美国组织持有代码库的项目)从事与其相关的”service”可能受限;
  2. 最终用户 / 部署地:即使代码公开可用,GitHub / npm / Docker Hub 等平台可能对来自制裁地区的 IP / 账号做限制。

注意,“source code 公开可用”豁免主要来自 EAR,而 OFAC 的 sanction 在”service”(例如私有仓库管理、付费计划、支持服务)层面执行起来独立于 EAR。2019 年 GitHub 锁定伊朗账户时给出的解释就是”私人仓库、组织账户等属于 service,受 OFAC 管辖”。

一个有用的区分:

  • 把源代码 git push 到 GitHub 公开 repo:EAR 主导,§734.3(b)(3) / §740.13(e) 豁免;
  • 使用 GitHub Actions 消耗计算分钟数:OFAC 主导,属于 service;
  • 访问 GitHub Copilot(付费 AI 功能):OFAC 主导,属于 service;
  • 向 OpenAI / Anthropic API 发起调用:OFAC 主导 + 各家平台自己的服务条款。

所以即使一个项目的代码完全”自由流通”,其背后的 CI / 协作工具也可能在制裁触发时不可用——这也是为什么大型中国项目越来越重视”CI 自主可控”。

4.2 俄罗斯内核维护者被移除事件(2024)

2024 年 10 月,Linux 内核 6.12 开发周期中,Greg Kroah-Hartman 提交了一个补丁(commit 6e90b675cf942e50c70e8394dfb5862975c3b3b2 附近,在 MAINTAINERS 文件中),将一批俄罗斯籍或在俄罗斯实体工作的维护者从 MAINTAINERS 文件中的条目删除。提交信息中写道:

Remove some entries due to various compliance requirements. They can come back in the future if sufficient documentation is provided.

在 LKML 和 Phoronix、LWN 的后续讨论中:

  1. Linus Torvalds 公开表示,这是因为相关维护者受到美国 / 其他国家的制裁法律的影响,Linux 基金会法律部门要求处理;
  2. 该调整不删除他们既往的贡献(Git 历史不被 rewrite),只是不再把他们作为官方 MAINTAINERS;
  3. 将来若能提供”不受制裁约束”的证明(例如不在被制裁实体就职),可以恢复身份。

这次调整覆盖的面很小,据公开信息大约十几位维护者,涉及的子系统多集中在特定硬件驱动。邮件列表的回复中有人质疑”为什么不直接说是哪条制裁条款”,Greg KH 的回答大意是:具体条款细节由基金会法律部门判断,他不对外转述法律意见,这是一次”合规执行”而不是”社区价值判断”。Linus Torvalds 在补充回复中措辞更直接:作为身在美国的内核首席维护者,他”个人不喜欢这件事,但也不会去打这场官司”。

从时间线看,这件事并不是孤立的:

  • 2022 年 2 月,俄乌战争爆发后,美国、欧盟、英国相继对俄罗斯金融、能源、技术部门加码制裁;
  • 2022 年 3 月,Docker 对俄罗斯开发者的 Docker Pro / Docker Team 付费计划做了临时限制,后在社区反弹下调整;
  • 2022 年起,多个美国基金会在内部对”受制裁实体员工是否能继续担任 MAINTAINERS / Committer”做评估;
  • 到 2024 年 10 月,这次评估终于在内核这样一个高可见度的项目上落地。

对关心 Linux 内核治理的开发者,这件事是一个值得长期观察的分界点。

这件事的意义:

  • 它证明了即便是”公开可用”的内核代码,项目本身运营在美国 / 使用美国基础设施时,仍然会被 OFAC 的制裁体系触达到”谁有 maintainer 权限”这一层;
  • 它也显示了 Linus 在”政治立场”和”维护代码质量 / 项目稳定”之间优先选择后者,同时承认无法对抗法律约束;
  • 中国维护者目前并未受到直接类似处理,但这是一个先例:身份所在国 / 所在实体 会影响开源治理权限
  • 对整个社区的长期启示:开源治理的”中立性”是有边界的,当基金会与法律发生冲突时,合规优先级往往高于社区习惯。相反,被移除维护者的 git 历史提交不被 revert,也表明了社区对”代码贡献 vs 治理权限”这两者的区分态度。

4.3 伊朗、朝鲜、古巴、叙利亚开发者的处境

这几个国家的开发者长期面临:

  1. GitHub 账户可能被锁定(2019 年有批量锁定伊朗账户事件,后经调整,公开仓库读写在 2021 年前后部分恢复);
  2. npm / PyPI / Docker Hub 等平台对制裁地区 IP 的访问限制;
  3. 无法注册 Google Cloud / AWS / Azure / OpenAI 等需要支付的服务;
  4. 某些 CLA 要求填写国籍 / 所在地,会直接触发法务评估。
  5. 学术合作和会议发表受限,研究生出国念书时签证困难;
  6. 开源项目中以”真实姓名 + 所在机构”署名可能遭致项目维护者顾虑。

2019 年 GitHub 限制伊朗账户事件后,社区的反应:

古巴、朝鲜、叙利亚因为综合制裁更严,开发者几乎完全无法使用主流美国平台。部分人的选择:

  • 迁移到 Codeberg / SourceHut / Gitea 等非美国托管;
  • 使用中国、俄罗斯、欧洲私有邮箱注册;
  • 以学术身份(大学、研究机构)获得专门的学术豁免。

对中国开发者的提醒:不要用”VPN + 虚假国籍”去帮制裁国同事注册服务,这在美国法律下是”帮助规避制裁”,风险远大于收益。一个折中方案:与制裁国同事的技术合作,尽量在”公开代码层”进行——PR、issue、公开邮件列表这些路径是 EAR 豁免保护的。需要私有协作(内部 Slack、私有 repo、未公开技术文档)时,先咨询法务。

一些社区(包括 Gitea、Codeberg、SourceHut)明确把自己定位为”不受美国管辖为主的平台”,希望为这些开发者保留代码托管能力。

对中国开发者的借鉴:即便今天没人主动锁你,“建立异地镜像”也是成本低、收益大的保险。常见做法是:

  1. 在 GitHub 主仓库上同时配置 Gitee / GitCode / Codeberg / 自建 Gitea 的 push mirror;
  2. CI 产物(binary / image)同时发布到 GitHub Releases、Docker Hub、quay.io、阿里云 ACR、Harbor 开源镜像站;
  3. 对外文档声明”如主站不可用,可从以下镜像获取”,避免”单点失联”。

4.4 GitHub 的制裁执行实践

GitHub 在 https://docs.github.com/en/site-policy/other-site-policies/github-and-trade-controls 里详细说明了自己的合规框架:

  1. 公开仓库的浏览、克隆、提交 issues 和 PR,在大多数情况下可用,依据是 EAR §734.3(b)(3) 和 §734.7;
  2. 私有仓库、付费计划、组织账号 等”service”功能,则受到更严格的限制;
  3. 被 SDN 或位于综合制裁地区的账户会被限制功能;
  4. 用户可以通过申诉流程证明”不在受制裁实体”或”已搬离受制裁地区”从而恢复。

这套模型对所有美国托管平台(GitLab.com、Bitbucket、Docker Hub、npm、PyPI 等)都适用。

4.5 开源基金会如何应对

开源基金会面对制裁时大致采取”分层”策略:公开代码保持全球开放;平台服务按法律要求收紧;治理权限 case by case 处理。具体展开:

代码层

  • 所有源代码继续按既定 license 公开发布;
  • 发布物(二进制、镜像、wheel 包)在官方镜像保持全球可下载,依赖 §734.3(b)(3) / §740.13(e) 豁免;
  • ECCN / TSU 通知照常维护。

服务层

  • 邮件列表、JIRA、Slack、Discord、Forum 等 service 按平台所在国家的制裁法处理;
  • 收费产品(某些基金会的 training、conference tickets)按 OFAC 筛查;
  • 会员申请(foundation membership)对受限实体走额外审批。

治理层

  • MAINTAINERS / Owners 名单受影响时,走基金会法律流程,而非社区投票;
  • 不因国籍 / 机构所在国而单独排除,只因具体制裁事实而处理;
  • 对受影响的贡献者,通常保留其历史贡献记录,只变更未来的权限状态。

主流基金会的共性做法:

  1. 在总部所在国家(多为美国)聘请合规律师,维护项目 ECCN 列表;
  2. ICLA / CCLA 中加入出口合规声明(见本系列第 18 篇《CLA 与 DCO》),贡献者承诺其贡献不违反适用的出口管制 / 制裁法律;
  3. 对涉及加密的新项目做 TSU 通知
  4. 必要时调整 MAINTAINERS / 权限(如上文 Linux 案例);
  5. 在声明中区分”代码 / 项目的公开可用属性”与”平台服务的可用性”,前者尽量保持全球可用,后者遵守当地法律。
  6. 对接”安全披露 / 漏洞报告”流程做国际化适配:PSIRT 或 security@ 邮件组如果完全托管在美国,收到来自制裁国研究者的漏洞报告时会触发复杂评估;部分基金会在多个司法辖区分散设置协调人(例如 Apache 有 security committee、CNCF 有 security TAG)。

不同基金会的具体姿态有差异:

  • Apache Software Foundation:倾向于”项目代码完全开源 + ECCN Matrix 显式登记 + 偶尔在贡献流程中加一两条出口合规问询”,治理上不基于国籍 / 雇主排除贡献者;
  • Linux Foundation:有更多商业会员(很多是大型公司),大型项目(kernel、Kubernetes、Hyperledger 等)各自有独立治理,LF 法务在出现具体合规事件时介入;
  • CNCF:在 LF 框架下,对中国云厂商参与度最高,保持”治理中立但服务遵守美国法”的姿态;
  • Eclipse Foundation:2020 年从美国 Delaware 改组到比利时(Eclipse Foundation AISBL),部分原因正是为了让基金会运营尽量与美国法律解耦;
  • Mozilla Foundation:注册在加州,受 EAR / OFAC 约束;
  • OpenJS Foundation(Node.js 等):Linux Foundation 旗下,与 LF 一致;
  • Rust Foundation:注册在 Delaware,但 rustc / crates.io 的代码与镜像分布广泛。

中国开发者参与不同基金会时,“美国成分”的暴露程度天然有差异,但基本都是:只要不在 SDN、不代表 Entity List 实体、不试图把代码或服务出口给禁运国,参与本身没有障碍


五、加密出口的具体问题

5.1 OpenSSL 与 EAR

OpenSSL 项目是加密出口管制史上最经典的案例之一。

  • OpenSSL 起源 SSLeay,作者 Eric A. Young 和 Tim J. Hudson 在澳大利亚。OpenSSL 本身的开发也是国际合作。
  • 早期版本中,美国使用者需要从 OpenSSL 主站之外的镜像获取,因为美国对”加密软件从美国出口”有严格限制。这也是为什么历史上有 SSLeay → OpenSSL 的跨境分工。
  • 1999 年克林顿政府放宽加密出口政策之后,OpenSSL 源代码 + TSU 豁免的模式才成为主流;其后 OpenSSL 团队长期在 https://www.openssl.org/source/exp/ 等页面维护出口合规说明。
  • 现在 OpenSSL 官方明确归为 5D002,且通过 TSU 向 BIS / NSA 做过通知。

回顾美国加密出口政策的几次大转折,对开源开发者理解今天的规则有帮助:

  • 1990 年代:加密被视为”军品”,在 ITAR 下管辖。出口强加密软件需要 State Department 许可证。典型事件:PGP 作者 Phil Zimmermann 因 PGP 被分发到美国之外,受到联邦调查,案件最终未被起诉但拖了三年;Daniel J. Bernstein 起诉美国政府的 Bernstein v. United States 案,法院裁定”源代码是受第一修正案保护的言论”。
  • 1996 年:加密软件从 ITAR 移到 EAR,由 State Department 转给 Commerce Department 管辖。
  • 1999 / 2000 年:EAR 修订,引入 License Exception TSU,公开加密源代码基本自由。
  • 2010 年:再次放宽 mass market 加密产品的分类路径。
  • 2021 年:进一步调整 ENC 类别与报告要求,简化企业合规。

这段历史让”开源加密 + TSU 通知”成为今天的标准操作。反过来,一些国家(如俄罗斯、印度、越南)在自己的加密进口管制上还保留着早年的繁琐流程,出海企业依然会遇到相应成本。

值得一提的还有几个同领域项目的分类:

  • BoringSSL(Google fork 自 OpenSSL):由 Google 在美国维护,直接适用 ASF 之外的 Google 内部合规框架,对外用户基本通过 Chromium / gRPC 间接使用;
  • wolfSSL:美国爱达荷州公司维护的嵌入式 TLS 库,对商业用户采用双许可(GPLv2 / 商业),商业版本会提供 ECCN 说明;
  • mbedTLS:原 ARM 维护,现由 Trusted Firmware 社区托管,以 Apache-2.0 发布,同样 5D002 + TSU;
  • rustls:纯 Rust TLS 实现,ISRG(Let’s Encrypt 母组织)托管,公开可用归 5D002 + TSU;
  • libsodium:NaCl 的易用封装,公开可用 5D002 + TSU;
  • Tongsuo(铜锁):蚂蚁开源的 OpenSSL 分支,支持国密,源头在中国,出境后按 5D002 处理。

对工程上的启示:

  1. 在产品设计里尽量把加密层抽象到一个清晰的模块,便于做 ECCN 分类;
  2. 不要 fork 维护私有版本的 OpenSSL,除非你愿意自己承担分类和许可证责任;
  3. 做白盒加密 / 国密算法模块时,专门评估出口合规——这是 5.2 要讲的。
  4. 对 TLS 握手链路上的依赖做明确记录。很多产品文档里只写 “uses HTTPS”,真到合规审计时需要给出具体实现,一时找不到。
  5. 升级 OpenSSL 主版本时重做一次 ECCN 审查。例如从 OpenSSL 1.1 升到 3.x 时,引入了新算法(如 KTLS、新的 KEM 接口),最好复核 ECCN Matrix。

5.2 国密算法(SM2/SM3/SM4)的出口与”回流”

中国国密算法(SM2 椭圆曲线签名、SM3 哈希、SM4 分组密码、SM9 基于身份的密码、ZUC 祖冲之序列密码)属于中国 OSCCA(State Cryptography Administration,国家密码管理局)管辖的商用密码。详情可见本系列姊妹文《国密算法工程实战》。

出口视角:

  1. 在中国境内研发并发布开源实现(如 GmSSL、Tongsuo(铜锁)、go-gmsm、Bouncy Castle 的 GM 分支):源头遵守中国《密码法》《商用密码管理条例》,公开发布需满足中国境内商用密码的合规要求;出口境外使用时一般不再由 EAR 管辖,但会被当地国家的加密进口法规(例如俄罗斯 FSB 认证)管辖。
  2. “回流”场景:开源 SM 实现被 OpenSSL、BoringSSL、rustls 等美国主导项目集成之后,代码本身又成为 5D002 的一部分;此时按”美国项目”规则再出口。
  3. 商业 SDK:国内商密 SDK 出海时,通常要在目标国做”加密进口备案”(法国 ANSSI、俄罗斯 FSB、越南 MIC 等都有类似制度),和美国 EAR 是平行体系。

开发者尤其要注意:“国密的安全性符合国标”与”国密模块在海外合法分发”是两件事。后者需要做出口 + 进口双向评估。

再细化一些常见的国密 + 出海模式:

  1. 客户端是国产系统,服务端在海外:典型如面向华人群体的 APP,客户端要用国密适配国产手机的内置算法库,服务端在新加坡。服务端 TLS 用国际算法,应用层包体再叠一层 SM2/SM4。合规上源头 SDK 出境遵守中国商密;目标国进口侧一般不限制;“端到端”只要在法域边界解密 / 再加密清晰即可。
  2. 金融行业数据跨境:在香港 / 澳门开展对中国大陆客户的服务时,香港侧要支持国密以便与内地清算网关对接;同时本地监管要求使用国际算法。解决方案是”双栈”并行。
  3. 政企出海的 VPN / 专网:向”一带一路”沿线客户提供含国密的专网设备,往往会被当地列入”本地加密进口”审查。不少国家会要求提供算法白皮书、证明无”后门”。
  4. SM2 作为可选签名算法出现在国际协议扩展:OpenSSL 3.x 已经内置 SM2 / SM3 / SM4 支持。当一个国际开源项目接收 SM 相关 PR 时,PMC 不需要重新走一次 TSU 通知——SM 系算法被视为 5D002 的具体实例,Matrix 里更新版本号即可。
  5. SM9 / ZUC 向学术社区的贡献:这两类算法的公开参考实现已经被 ISO 标准化(ISO/IEC 14888-3、18033-3 等),在学术发表和 IETF 文稿中可以自由引用和实现。

5.3 含加密功能的商业软件出海

闭源商业软件如果归为 5D002,出口路径一般有三条:

  1. §740.17 License Exception ENC:按照条款(b)(1)“最终用户 = 美国子公司 / 外国政府”、(b)(2)“mass market”(大众市场)等不同小类,配合向 BIS 提交的分类请求或 “self-classification report”。
  2. CCATS 分类 + License:对高强度加密(如量子安全、某些长度以上的 KEM 等)或向受限国家出口时申请单独许可证。
  3. 特定项目下的豁免:例如对盟国政府的某些 IT 合同、ITAR 项下军用密码移交国务院等。

无论哪条路径,“每年 self-classification report”和”semi-annual sales report”是常规动作。出海团队要把这部分流程化,否则一年后补报会非常痛苦。

以一个典型的出海 SaaS 产品为例,合规的每年度操作清单大致如下:

时间点 合规动作 输出
新版本发布 核对 ECCN Matrix / 算法变更 内部 changelog + ECCN 更新说明
首次发布或大版本迁址 发 TSU 通知 邮件存档
每年 2 月 1 日前 向 BIS 提交 self-classification report(涵盖上年度 5D002 发货) CSV 上传 + 回执
每年 2 月 / 8 月 向 BIS 提交 semi-annual sales report(特定 ENC 条款下) CSV 上传 + 回执
客户出现变动 重新做 SDN / Entity List 筛查 screening log
年度审计 审查合同 / 付款 / 客户清单 审计报告

把这些动作写进 OSPO 的年度日历,甚至自动化执行,是企业成熟度的一个标志。

把”开源 vs 商业、含加密 vs 不含加密”画成 2x2 矩阵,会更直观:

不含加密 含加密
开源 / 公开可用 EAR99 + §734.3(b)(3),几乎自由 5D002 + §740.13(e) TSU,发一次通知
商业闭源 EAR99,避开制裁地区 / 客户 5D002 + ENC,年度 report;高强度需许可证

绝大多数中国出海开源项目都落在右上角;要做闭源 SaaS / SDK 时才会真正进入右下角。


六、中国开发者在 Apache 基金会的注意事项

6.1 贡献代码的出口合规

ASF 是美国(Delaware)注册的 501(c)(3) 非营利组织,其运营适用美国法律。中国开发者贡献到 Apache 项目时:

  1. 你签的 ICLA 包含 “Contribution” 的授权声明,没有直接的”出口合规”条款,但通过 ASF 的政策隐含:“你提交的内容可以被 ASF 自由分发到全世界”,这意味着你事实上同意”以 TSU / 公开可用 形式公开发布”。
  2. ASF 的 “Export Control” 页面要求”Committer 在向涉及加密的项目 commit 加密相关 patch 前,先与 PMC / VP, Legal Affairs 联系”,必要时更新 ECCN Matrix。
  3. 对于中国籍贡献者身份本身,只要不在 SDN 名单、不在被综合制裁的国家、不代表被 Entity List 实体,参与是完全合法的。

如果你是项目外来贡献者,PR 被合并后你不会直接”触发”任何出口动作——是 ASF 以基金会身份对外分发,你只是”把代码交给基金会”。这一设计简化了个体贡献者的合规负担。相对的,Committer 和 PMC 作为基金会代理人,合规责任更大一些。

6.2 Committer / PMC 身份的注意事项

成为 Committer 之后,你获得的是对 ASF 基础设施的写权限。这不同于”贡献公开代码”:

  1. 访问 ASF 基础设施(svn、git、JIRA、邮件列表)属于 ASF 提供的 “service”,受 OFAC / EAR 管辖的面比”纯公开代码”更大;
  2. 如果你搬到了综合制裁地区(例如去伊朗 / 朝鲜工作),ASF 可能不得不暂停你的账号;
  3. PMC 成员参与投票 / release 流程时,是以 ASF 项目管理者身份行事,涉及的合规关注比 Committer 更多,尤其是发布含加密代码的 release 时要走 “ECCN update” 流程。
  4. 跨多个项目拥有 Committer 身份(俗称 “Committer at ASF” 而非某项目 Committer)时,可以在 people.apache.org 的个人页登记所在国家,以便基金会在需要时快速评估;
  5. 变更雇主 / 所在地后,建议主动更新 committer-info,而不是等到基金会查出”某位 Committer 现在在制裁地区工作”才被动处理。

对中国 Committer / PMC 的建议:

  • 不要把工作邮箱(例如 xxx@huawei.com)作为唯一联系方式,用个人邮箱(Gmail / ProtonMail / 自建)在基金会内做联络,可以在雇主变更时保持身份稳定;
  • 贡献加密算法 / 安全相关代码时,留存 PR 讨论链接和 PMC 批准邮件,作为自己”以基金会流程贡献”的证据;
  • 参加 ApacheCon / PMC 会议时,注意不透露所在公司内部未公开的信息,避免”deemed export”的理论风险。

6.3 涉及加密模块的贡献

实操建议:

  1. 新增 / 修改加密算法 的 PR 要在 description 里注明算法、密钥长度、调用来源,方便 PMC 判断是否更新 ECCN;
  2. 引入 OpenSSL / BoringSSL / BouncyCastle 等依赖,并不要求重新分类,但要注明版本;
  3. 引入国密(例如给 Apache ShardingSphere / Apache IoTDB 添加 SM2 / SM4 支持),需要特别提示——它在中国合规视角叫”商用密码”,在美国 EAR 视角下仍然落在 5D002 的通用加密范畴,需要走 TSU 豁免或 ENC;
  4. 写单元测试使用的测试密钥要公开、足够短或明示为测试用途,避免被误判成”真实商业加密部署”。

6.4 涉及中国政府 / 国密的项目捐献

近几年一个活跃的方向是:中国公司把自家的国密增强项目捐献到国际开源基金会。例如 Tongsuo(铜锁)早期在 GitHub 开源、后续引入多家企业共同维护;Apache 的部分 Committer 在 PMC 决策中讨论过”国密支持是否进入主线”。从出口合规角度看:

  1. 捐献过程涉及代码 copyright transfer / license 再授权,该走 Software Grant Agreement;
  2. 捐献后新主库一旦在 Apache / CNCF 基础设施上托管,ECCN 由基金会登记,整体落入 TSU 豁免链条;
  3. 中国原主库的”镜像”或”长期维护版本”仍然留在 Gitee / 自建 Gitea,面向中国境内客户使用,走中国商密体系;
  4. 海外用户下载基金会版本,合规路径清晰;海外用户若希望”商业支持”,一般由上游公司在当地法人提供。

这套路径既满足了”真正国际化”,也不牺牲”中国境内合规”。对想把国产基础软件推向全球的团队,值得参考。

Apache 的 ECCN Matrix(https://www.apache.org/licenses/exports/)是所有 TLP(Top-Level Project,顶级项目)的 single source of truth。中国 PMC 成员通常不直接碰这个矩阵,但要在 release vote 时留意 RM(Release Manager,发布经理)是否勾选”此 release 包含加密功能”并更新相应条目。

进一步给一个具体的 PR template 示例,方便项目 Owner 借鉴:

## 本次贡献的内容
- [ ] 功能描述
- [ ] 涉及加密 / 哈希 / 签名算法?若是,列出算法与密钥长度
- [ ] 是否引入 / 升级加密相关的第三方依赖?
- [ ] 是否已通知 PMC 更新项目 ECCN Matrix?

## 出口合规声明
我确认:
- 我不位于 15 CFR §746 列出的综合制裁地区;
- 我不是 OFAC SDN 名单上的个人,也不代表被美国 Entity List 限制的实体以该身份贡献;
- 我的贡献将按项目适用的开源许可证被公开发布。

把这样一段加进 CONTRIBUTING.md 或 PR 模板,本身就是对项目合规姿态的最小成本表达。


七、云厂商出海合规实践

7.1 阿里云在欧洲 / 中东的部署

阿里云 Alibaba Cloud 在法兰克福、伦敦、迪拜、吉达、利雅得、雅加达等地设有 region。出海合规的核心动作:

  1. 数据本地化与 GDPR:欧洲 region 的数据默认留在欧盟,控制面由阿里云海外法人运营;
  2. 加密合规:TLS / KMS 等产品使用的加密算法在不同 region 有差异——例如中国 region 默认支持国密算法,境外 region 默认仅支持国际算法,二者不交叉;
  3. 实体清单 / SDN 筛查:在客户注册、实名认证时做 OFAC / EU sanction 名单筛查;
  4. 与美国制裁的互动:阿里云作为中国公司,不受美国 EAR 直接管辖,但其海外 region 所使用的部分芯片 / 软件来自美国供应商,仍要遵守这些供应商的出口条款(这也是所谓”美国成分”问题)。
  5. 合规认证:逐步拿下 C5(德国)、IRAP(澳大利亚)、SOC 2、ISO 27001 / 27017 / 27018 等,增加 enterprise 客户选型时的可信度。

7.2 华为云的合规框架

华为云 Huawei Cloud 由于 2019 年 Entity List 事件,更早建立了一整套多国合规体系:

  1. 三朵云战略:中国、香港、新加坡、荷兰、沙特、巴西等多 region 运营,分别由当地法人作为合规主体;
  2. 产品的”美国成分”替换:逐步用国内 / 非美供应链替代部分 x86 / GPU / 软件组件,减少 FDP Rule 触发面;
  3. 客户端侧加密:KMS / HSM 服务同时支持国密和国际算法,按 region 策略选择;
  4. 出口合规团队:向海外客户出货 / 部署服务器时,走自己的 ECCN 评估流程。
  5. 国密与国际算法双栈:中国境内用国密、海外 region 用国际算法,编译期 / 部署期通过 feature flag 切换,避免单一版本跨境误用。
  6. 对欧盟 NIS2 / GDPR / CSA、英国 UK Cyber Essentials 等合规框架的逐一响应:这些虽然不是”出口管制”,但与”服务向海外用户”紧密相关。

7.3 字节 / 腾讯 / 快手的海外业务

非基础设施云之外,内容 / 社交类应用出海也会遇到加密合规:

  • TikTok:由于美国 CFIUS(Committee on Foreign Investment in the United States,美国外国投资委员会)审查、各州 app store 限制、印度 / 欧洲的本地合规命令,字节国际化业务在加密侧走纯国际算法 + 多 region 数据分离。客户端 TLS 用 BoringSSL / OkHttp;服务端用 OpenSSL。
  • 腾讯云海外:与阿里云类似,把海外业务和国内业务分成两套技术栈,前者不默认启用国密。
  • 快手 Kwai:在巴西、东南亚的业务合规姿态主要围绕数据本地化和内容审核;加密侧采用国际算法。

这些公司本身虽不是开源基金会,但他们贡献的开源项目(OpenJDK Dragonwell、Kuasar、OceanBase、ByConity 等)在 release 时会带上对应 ECCN 说明,某种意义上也是”基金会级别”的合规姿态。

7.4 小团队如何避免一开始就掉进陷阱

对三五个人的出海创业团队,给不起一支合规团队,可以按这个优先级处理:

  1. 先别碰闭源强加密 SDK 这条路。能走开源 + TSU 就走,法律负担最轻。
  2. 所有对外付费接口通过 Stripe / Paddle 等成熟 MOR(Merchant of Record)。他们替你处理 OFAC 筛查和税务合规。
  3. 公司注册地与客户法域分开考虑。中国境内研发 + 香港 / 新加坡 / 开曼控股公司 + 美国 / 欧洲销售实体,每一层做一件合规的事情,不要让一个实体背所有风险。
  4. 保留一次小额外聘律师预算。在”签第一份海外企业客户合同”、“第一次融资”、“第一次出货给中东 / 非洲”前找一次律师,远比事后补救便宜。
  5. 宁愿多拆一层法律实体,也不要为了省事把中国研发与美国销售揉在同一家公司。许多小型 SaaS 被并购或 IPO 时,尽调阶段的第一个”红旗”往往就是”实体未分层”,事后重组成本十倍。

这两家的经验对中小出海团队的启示:region 选择 + 算法支持 + 客户筛查 + 供应链美国成分 是需要同时设计的四条线,忽略任何一条都可能在某个客户、某个订单、某个审计时爆雷。

把”出海合规”拆成可执行的检查项,可以这样列:

维度 关键问题 工具 / 输出
项目分类 ECCN 是什么?是否走 TSU? ECCN Matrix、TSU 邮件存档
依赖审查 是否含未审 5D002 依赖? SBOM + ECCN DB
供应链 美国成分占比?是否触发 FDP? BOM + 成分表
客户筛查 客户是否在 SDN / Entity List? Sanctions screening 服务
部署地 是否服务于 E:1 / E:2? Region 拓扑 + GeoIP
加密强度 算法是否超出 ENC 自分类阈值? 算法清单
国密支持 是否在中国 region 默认开启国密? Region 配置矩阵
数据本地化 数据是否跨境?是否触发 GDPR / PIPL? DPIA 报告(参考本系列第 17 篇 OSPO)

八、工程实践

8.1 禁用特定地区下载

典型做法:在 CDN / 对象存储 / 下载站前置一个制裁名单 filter:

# nginx 示例:按 GeoIP 拦截制裁国下载
geo $ofac_blocked {
    default 0;
    include /etc/nginx/geoip/sanctioned.conf;  # CU, IR, KP, SY, 克里米亚等
}

server {
    location /download/ {
        if ($ofac_blocked) {
            return 451 "Unavailable for legal reasons";
        }
        try_files $uri =404;
    }
}

几个要点:

1.HTTP 451 Unavailable For Legal Reasons 是正确的语义状态码(RFC 7725); 2. GeoIP 不是 100% 准确,合规目标是”reasonable efforts”而不是”perfect blocking”; 3. 对于开源加密项目,这个 filter 的适用范围一般限定在 商业版本 / 付费下载,开源源代码 + TSU 豁免的部分仍应全球可用——否则反而违反 TSU 的”publicly available”前提。 4. 对命中地区,建议给出申诉入口(例如一个 compliance@<domain> 邮箱),允许”我已搬离”或”VPN 误判”的用户请求人工复核。 5. 定期(至少每月一次)从 BIS / OFAC 官网更新名单,不要硬编码在代码里——制裁地区会变。

对 SaaS 而言,这套 filter 应当位于 登录 / 注册 / 支付 / 下载 四个环节,单纯在前端 JS 里做拦截是不够的(用户改一下 User-Agent 就绕过)。

8.2 贡献者所在地登记

ICLA / CCLA(见本系列第 18 篇)通常要填写国家 / 地址。工程上可以:

  1. 通过 CLA Assistant / EasyCLA 等工具,在贡献者签署时收集国家字段;
  2. 把字段与 OFAC 制裁国列表做对照(使用 Treasury 提供的 SDN XML 定期同步);
  3. 命中时不自动拒绝,而是转人工复核:很多情况下,贡献者可能只是 VPN / 临时旅行 / 双重国籍,需要额外证明。
  4. 把贡献者记录的法律基础以隐私政策的形式明示:为什么收集、存多久、是否共享。欧洲贡献者会特别在意这一点(GDPR)。
  5. 把”国籍”与”实际工作国”分开记录,前者可能更稳定,后者才是合规判断依据(例如一位中国籍开发者长期在瑞士工作,其贡献应按瑞士法律风险评估)。

8.3 git 仓库审查

对于涉及加密、涉及海外客户的项目,发布前对 git 仓库做一次审查:

  1. grep -ri "aes\|rsa\|ecdsa\|sm2\|sm3\|sm4" --include='*.go' --include='*.c' . 列出加密算法出现位置;
  2. 把这些模块与 ECCN Matrix 对齐:是自己实现 ? 调用依赖 ? 可配置关闭 ?
  3. 检查 commit author / committer 的 email 域名是否涉及制裁实体;
  4. 对 tag / release 打包时,自动产出 SBOM(见本系列第 16 篇《SCA 与 SBOM》),SBOM 中包含每个组件的 ECCN。
  5. 扫描 *.pem*.keyid_rsa 等文件,确保没有把生产密钥 / 客户密钥误 commit;这是 security 与 compliance 交叉的高危点。
  6. 对 git 的 committer identity 做一次年度清理,离职的外籍贡献者如果还挂名 MAINTAINERS 却失联,可能在合规审计时被问询。

8.4 CI/CD 中的出口合规检查

# GitHub Actions 示例
name: export-compliance
on:
  pull_request:
  workflow_dispatch:

jobs:
  eccn-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate SBOM
        run: syft packages dir:. -o cyclonedx-json > sbom.json
      - name: Match SBOM against ECCN DB
        run: |
          python scripts/eccn_match.py sbom.json > eccn-report.json
      - name: Fail if unreviewed 5D002 components
        run: |
          jq -e '.unreviewed | length == 0' eccn-report.json
      - uses: actions/upload-artifact@v4
        with:
          name: eccn-report
          path: eccn-report.json

  sdn-check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Check committer emails against SDN
        run: python scripts/check_sdn.py

搭配一份由安全团队维护的 eccn_db.csv(package name → ECCN → 是否已走 TSU 通知),就能在 PR 阶段就拦截”新引入了未分类加密依赖”的情况。

一个最小可用的 eccn_db.csv 长这样:

name,ecosystem,eccn,tsu_notified,note
openssl,apt,5D002,yes,upstream notified
boringssl,git,5D002,yes,Google maintains
wolfssl,apt,5D002,dual-license,"GPL or commercial"
rustls,cargo,5D002,yes,ISRG hosted
libsodium,apt,5D002,yes,
mbedtls,apt,5D002,yes,Trusted Firmware
bcprov-jdk18on,maven,5D002,yes,Bouncy Castle
cryptography,pip,5D002,yes,PyCA
tongsuo,git,5D002,notified-by-self,Chinese-origin; SM2/SM3/SM4
gmssl,git,5D002,notified-by-self,
jackson-databind,maven,EAR99,,
commons-lang3,maven,EAR99,,

配合 eccn_match.py 这样的脚本,就能把 SBOM 里的每一项与 DB 做 join,未命中条目自动标记为 “unreviewed”,由合规评审兜底。

8.5 Release 发布前的 checklist

在 release vote 或 GA(General Availability)tag 之前,建议跑一次:

#!/usr/bin/env bash
set -euo pipefail

echo "== SBOM =="
syft packages . -o cyclonedx-json > dist/sbom.json

echo "== ECCN 匹配 =="
python scripts/eccn_match.py dist/sbom.json

echo "== 贡献者国籍检查 =="
git log --format='%ae' v$(PREV)..HEAD | sort -u | python scripts/check_sdn.py

echo "== 加密算法扫描 =="
rg -n --hidden --no-heading \
    -e 'AES' -e 'RSA' -e 'ECDSA' -e 'Ed25519' \
    -e 'SM2' -e 'SM3' -e 'SM4' -e 'ZUC' \
    -g '!vendor' -g '!node_modules' > dist/crypto-grep.txt

echo "== 许可证检查 =="
license-checker --production --json > dist/licenses.json

echo "== Docker 镜像签名 =="
cosign sign --yes $IMAGE

echo "OK. 请人工复核 dist/*.json"

把这个脚本接入 release pipeline,是从”靠人记忆”迈向”靠流程”的关键一步。

8.6 出口合规文档模板

推荐每个出海项目在仓库根目录放一份 EXPORT_COMPLIANCE.md,内容大致:

# Export Compliance

## Classification

This software is classified as ECCN **5D002** under the U.S. Export
Administration Regulations (EAR).

## Exemption

Publicly available encryption source code is released from "EI" and "NS"
controls pursuant to 15 CFR §740.13(e). A TSU notification was sent to
`crypt@bis.doc.gov` and `enc@nsa.gov` on `<YYYY-MM-DD>`.

## Cryptographic algorithms used

| Algorithm | Purpose | Source |
| --- | --- | --- |
| TLS 1.2/1.3 | Transport security | OpenSSL 3.x |
| AES-256-GCM | Data at rest | libsodium |
| Ed25519 | Release signing | cosign |
| SHA-256 | Integrity | standard library |

## Sanctioned destinations

This software should not be exported, re-exported, or transferred to:

- Comprehensively sanctioned regions (Cuba, Iran, North Korea, Syria,
  Crimea, Donetsk, Luhansk, Zaporizhzhia, Kherson).
- Any party on the BIS Entity List, Denied Persons List, Unverified
  List, or OFAC SDN List, without appropriate U.S. government
  authorization.

## Questions

Contact `compliance@<your-domain>`.

把类似文档放在仓库中,一次性解决用户、律师、合规审计员的大部分疑问。

8.7 发布渠道与镜像策略

对中国发起的出海开源项目,通常建议的发布拓扑:

  • 主 Git 仓库:GitHub(全球可见) + Gitee / GitCode(中国可见) + 自建 Gitea 作为长期归档;
  • 二进制 / 镜像:GitHub Releases + Docker Hub + ghcr.io + 阿里云 ACR + 华为云 SWR;
  • 包管理器:按语言选择(npm / PyPI / crates.io / Maven Central / NuGet),这些是美国为主的基础设施,公开包不受限;
  • 文档站点:Cloudflare Pages / Netlify / GitHub Pages 海外 + 阿里云 OSS + 腾讯云 COS 境内;
  • 社区:GitHub Discussions + Discord + Slack 海外,微信群 / 飞书 / 知乎专栏 境内。

关键原则:不把任何”唯一的关键节点”放在可能被单边切断的服务商上。同时也不把任何”唯一的关键节点”放在仅境外服务商上——中国用户的体验和全球用户的体验要同时保障。

8.8 合规事件响应 runbook

当真正发生合规事件(GitHub 账号被限制、维护者被要求确认身份、客户被列入 Entity List)时,有一份 runbook 能让团队不慌:

EVENT:  贡献者账号被 GitHub 限制 / maintainer 被质询身份
---
T+0h    事件发现方把信息同步到 #compliance 内部频道
T+1h    由 OSPO / 法务接手,确认事件性质(合规 or 账号问题)
T+4h    对外保持沉默,不公开猜测;只在私下与当事人确认细节
T+24h   如涉及合规,由法务起草对外措辞;给 PMC / 社区 lead 预览
T+48h   必要时对外声明,保留充分"我方已合作"证据
T+1w    做一次内部复盘,更新 EXPORT_COMPLIANCE.md 与 runbook

提前有 runbook 的项目比没有的项目,在舆论和法律两端的表现都会稳得多。

8.9 数据跨境与出口管制的重叠

数据跨境(cross-border data transfer)是另一条平行的合规线。在中国,《个人信息保护法》(PIPL)、《数据安全法》(DSL)、《关键信息基础设施安全保护条例》(CII)都有对”重要数据”出境的限制。与出口管制的关系:

  1. 一套”向海外客户提供 SaaS”的部署会同时触发:EAR(软件出口)、OFAC(服务提供)、PIPL(个人信息出境)、GDPR(欧盟用户数据处理);
  2. 好的架构会让数据尽量留在客户法域内(“data residency by default”),控制面才是跨境流通的核心;
  3. 开源代码本身一般不包含个人数据,因此”代码出境”与”数据出境”是两件事——把它们分清楚能避免把简单问题复杂化。

中国数据跨境合规的具体做法(PIPL 标准合同、安全评估、认证机制三条路径)不在本文范围,推荐另起专题阅读。


九、工程坑点

下面是常见的”踩过才知道”的坑:

  1. 以为开源就一定不受 EAR 管辖:错,加密软件是特例,需要走 TSU 豁免而不是 §734.3(b)(3)。
  2. 把”不在 SDN”当作完整的筛查:还要查 Entity List、DPL(Denied Persons List)、Unverified List、MEU(Military End User)list、各国的本地制裁名单。
  3. VPN 解决合规问题:VPN 不是合规工具,OFAC / EAR 看的是 “who” 而不是 “IP”。真实所在国和真实最终用户才是关键。
  4. “我的项目不卖美国”所以不用管 EAR:只要你有一位美国开发者、你用美国的库、你在美国 CDN 发布,你就已经在 EAR 的某个面里。
  5. 忘记 TSU 的 URL notification:很多创业公司自己写了加密库丢到 GitHub,没有发过通知。严格说是不合规的,但补发并不难——一封邮件的成本。
  6. 闭源 SDK 随便给海外客户试用:走过大方向的 ENC 豁免之前,不要向未审 region 的客户 “试用版”,否则是”未申报出口”。
  7. Git 历史里留下了含密钥 / 含政府标识的测试文件:历史不能轻易 rewrite,出口审计时容易被挑。产生前就 .gitignore 掉。
  8. 把”中国公司”与”中国员工”混淆:实体清单上是特定公司,个人只要不是代表这些实体就可以正常参与开源。反之,SDN 上的个人即便身处第三国,交易也受限。
  9. 只看 EAR 不看 OFAC:EAR 关注”物项流向”,OFAC 关注”与谁做交易”;后者违反的刑事风险更高。二者常被同时触发。
  10. 用 CLA 代替出口合规评估:CLA 主要解决版权许可 / 专利授权(见本系列第 05 篇《专利与商标》、第 18 篇),不代替 ECCN 分类与 sanction 筛查。
  11. 把”美国成分”理解成纯硬件概念:错。软件、技术、Know-How、甚至 EDA 工具使用生成的 IP 都可能算美国成分。服务于云端的 API 本身也可能算。
  12. 在公开仓库里放内部法务意见或合规报告:这类文档虽无版权风险,但可能包含客户名单、地区分布等信息,一旦公开反而缩小了未来的回旋空间。合规材料建议放私有目录。
  13. GitLab / Gitea 自建 = 完全无合规负担:错。只要你的业务涉及向制裁国 / SDN 出口,平台换成自建不改变法律评估。自建的价值在于”不因第三方合规而被断服”,不在于”绕过合规”。
  14. 把 TSU 通知当成一次性任务:错。项目 URL 变更、顶级加密算法发生重大替换(例如加入 PQC 算法)时,一般建议补通知。
  15. 以为”我的项目从没向美国卖过”就没关系:EAR 的管辖基于”物项”而非”买方”。只要包含美国 origin 成分 + 出口到制裁地区,就已经违规。
  16. 把 “mass market” 判定想当然:§740.17 ENC 下的 “mass market” 有明确条件(零售销售、终端用户可自行安装、不因用户定制而变化等)。企业 SDK 一般都不满足 mass market,常被误归。
  17. release notes 里写大段密码学细节:看起来专业,但会让审计员要求对每个算法单独分类。除必要的安全公告外,把”算法列表”维护在 EXPORT_COMPLIANCE.md 或 ECCN Matrix,release notes 保持简洁。
  18. 在公开场合承认”我们产品可能被某实体列客户使用”:即便是玩笑,也会被竞品 / 监管留档。对敏感客户保持沉默是一种合规姿态。
  19. 出国参加会议带着未发布代码的笔记本:这涉及 deemed export / 海关电子设备检查,历史上有开发者被要求检查笔记本。保险做法是只带公开代码 + 通过私有 VPN / 云 IDE 访问未发布代码。

十、决策树:我的项目需要做什么

把全文的操作压缩成一张问答表:

  1. Q:我的项目不含任何加密算法,也不在 CCL 其他条目。 A:归 EAR99,公开发布可走 §734.3(b)(3)。避免向制裁国 / SDN 出口即可。不需要走 TSU 通知。

  2. Q:我的项目含加密,源代码公开发布在 GitHub。 A:5D002 + §740.13(e) TSU。请发一封 URL 通知给 crypt@bis.doc.govenc@nsa.gov(抄送项目 Maintainer 邮件列表存档)。移站时补通知。

  3. Q:我的项目含加密,是商业闭源 SDK,向海外客户出售。 A:做 self-classification 或 CCATS 分类;走 §740.17 ENC;年度 self-classification report + 半年度 sales report;不向 E:1 / E:2、SDN、Entity List 出口;部分国家可能还需要当地加密进口备案。

  4. Q:我的项目由中国公司主导,想捐献到 Apache / CNCF。 A:可以。按基金会流程走孵化。涉及加密算法时,注册 ECCN Matrix;中国籍贡献者身份不影响 Committer / PMC 资格(前提是不属于被制裁实体)。

  5. Q:我所在公司被列入 Entity List。 A:贡献 / 使用公开发布的开源源码不受影响;使用 GitHub / AWS 等”service”部分可能受限;请咨询公司合规部门。个人身份下参与开源一般不受限(以个人而非公司身份贡献)。

  6. Q:我的项目想集成国密算法给海外客户使用。 A:国密开源实现出海后仍被美国视角归为 5D002 下的通用加密,须走 TSU 或 ENC;同时目的国可能有加密进口 / 算法认证要求(如俄罗斯 FSB、法国 ANSSI)。

  7. Q:我收到一个来自伊朗 IP 的 PR。 A:合并公开代码本身属 EAR 豁免范围;但如果该贡献者被 OFAC 单独列入 SDN,或代表被制裁实体,需拒绝并记录。单凭 IP 不能判断,建议与法务共同评估。

  8. Q:我想把服务部署到中东客户。 A:筛查客户是否在 SDN / Entity List;评估是否涉及受限最终用途;检查 SaaS 本身的 ECCN;若涉及加密商业软件,走 ENC 或许可证路径;并考虑当地数据保护法规。

  9. Q:我在海外研究所工作,想以个人身份给 OpenHarmony 这样的中国主导项目贡献代码。 A:只要项目本身的贡献者协议不把你排除在外,并且你贡献的是源代码而非具体的军用技术,就是合法的。但要注意:你所在国家可能有针对特定中国受限实体的”逆向”限制,如果 OpenHarmony 背后的某个法人被列入该国名单,理论上有风险;实际上中国主导项目对海外贡献者始终持欢迎态度。

  10. Q:我的项目在 GitHub,突然哪天 GitHub 因政策不得不限制中国大陆访问,我应该怎么办? A:提前做好镜像(Gitee / GitCode / Codeberg / 自建 Gitea),至少保障代码、release、文档三处多点;对于 CI,把关键密钥放在你自己的 secret manager 而不是绑死在某一家 CI Provider。这个问题更多是韧性工程问题,而不是合规问题。

  11. Q:我的 AI 开源项目用的模型权重,算不算”软件”? A:截至目前,美国对 AI 模型权重的出口管制尚在动态变化中(2024–2025 年有多轮规则制定)。一种保守姿态:把”权重”与”代码”分开 release,并在权重发布时注明训练数据与用途限制。

  12. Q:我想做一个完全不涉及加密的小工具,SaaS 化卖到全球。 A:EAR99 + 公开可用使得代码分发不受限,但 SaaS 本体仍然是 service,需要对注册用户做 OFAC 筛查;账单系统一般会捆绑这项能力(Stripe / Paddle 等会自动拒绝制裁地区信用卡)。

  13. Q:我是独立开发者,完全没时间研究这些。 A:最低成本路径——项目完全开源(选 Apache-2.0 或 MIT)发布在 GitHub;涉及加密就发一封 TSU 邮件;付费接入 Stripe / Paddle;不要自己做海外银行账户 + 现金交易。这样做完,绝大多数风险都被平台和豁免吸收掉了。

  14. Q:我以个人名义贡献过一些加密相关代码给某 US 项目,现在要入职某家被列入 Entity List 的中国公司,是否需要做什么? A:个人历史贡献不受影响。入职后以该公司员工身份与该 US 项目的交互(例如以 @corp-email 提交、代表公司出席技术会议)则应由公司法务评估。个人继续以私人邮箱贡献通用代码通常没问题,但涉及敏感技术细节的互动需要谨慎。

本文为工程参考,不构成法律意见。涉及具体法律风险请咨询专业法律顾问。

最后,给一个”现实主义”的总结:

对于 95% 的中国开源开发者,你真正要做的事不多:

  1. 如果项目含加密且在 GitHub 公开,发一封 TSU 通知邮件;
  2. README.mdEXPORT_COMPLIANCE.md 里声明 ECCN;
  3. 不主动向伊朗、朝鲜、古巴、叙利亚、克里米亚等综合制裁地区出口;
  4. 不主动与明确在 SDN / Entity List 的客户做商业合作;
  5. 保持镜像多点化,以防基础设施单点不可用。

剩下 5% 的场景(强加密商业 SDK、政府客户、军工相关、受限实体合作)才需要专业律师介入。把精力花在对的地方,合规就不是负担,而是出海的基础能力。


十一、参考资料

法规与官方文件

基金会与平台声明

事件与新闻报道

  • Phoronix / LWN 2024 年 10 月关于 Linux 内核移除俄罗斯维护者的报道与 LKML 讨论
  • 华为被列入 Entity List 的 BIS 公告(Federal Register 2019-10616)
  • OpenSSL 项目出口合规页面:https://www.openssl.org/source/

本系列其他文章

延伸阅读


上一篇:CLA、DCO 与贡献者协议 | 下一篇:开源战略:什么时候开源、选哪个协议、如何构建商业壁垒

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-04-22 · architecture / opensource

开源许可与版权工程

面向中国工程团队的开源许可、版权与合规系列。从 GPL、AGPL、Apache、木兰协议到中国真实案例、SCA/SBOM 工具链与出海合规,讲清楚开源在工程落地中的坑与方法。