很多中国开发者把”合规”想象成一件离自己很远的事情:那是律师、外贸、大厂法务部门的工作。直到某一天:
- 自己维护的 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.1vs5D002.d.1:前者是”含加密功能”的软件,后者是”专用于设计、生产、使用 5A002 / 5D002 / 5E002 物项”的软件,后者出口比前者更敏感;EI与NS两种控制原因(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 对开源软件有两条关键豁免:
- 公开可用(publicly available)例外。见 15 CFR §734.3(b)(3):已公开发布、可被公众无限制获取的”已发布”技术和软件,通常不属于 EAR 管辖范围。但这条不适用于加密软件——加密是个特例。
- 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。
几个常见的误解:
- “我只是调用 HTTPS,不算密码学实现”:EAR 看的是软件对外提供的功能,而不是”是不是自己实现的”。只要最终用户能通过该软件使用受控强度的加密,一般就归 5D002。
- “我用的是系统自带的库,不算我的”:打包 / 分发环节决定管辖,如果你的 binary / image / installer 把加密库捆绑了进去(无论是静态链接还是 bundle so / dll),出口时按整体分类。
- “研究论文里的加密算法代码也算 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 管辖”的状态。但即便如此,仍然有三条红线:
- 不能出口到禁运国(E:1 / E:2 国家名单,包括古巴、伊朗、朝鲜、叙利亚,以及受限制的俄罗斯 / 白俄罗斯领土);
- 不能向 SDN / Entity List 上的最终用户出口;
- 不能用于被 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 …
使用条件:
- 源代码是 “publicly available”(通常指发布在公开的网站、代码仓库);
- 在首次发布或首次公开可获取之时(不是后续每次更新),向
BIS 的
crypt@bis.doc.gov和 NSA 的enc@nsa.gov发送一封邮件,内容是源代码的 URL(或者告知该 URL 在哪里); - 如果后续代码移动到新 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
工程上一般走这个流程:
- 梳理项目中出现的加密函数 / 库的依赖。包括直接依赖和传递依赖;特别注意 TLS 实现、哈希、签名、对称加密、KDF。
- 查 Apache ECCN Matrix / 依赖项目的上游声明。OpenSSL、Bouncy Castle、WolfSSL 等都有发布过自己的 ECCN。
- 判断你的项目是”单纯调用加密” 还是 “提供加密功能给他人使用”。前者一般随主功能分类(5D002 仍然常见但不一定),后者几乎肯定是 5D002。
- 判断是否公开发布。GitHub 公开仓库 = publicly available。
- 走 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 规则,封堵使用美国技术 / 设备在第三地生产的芯片。
对开源生态的直接震荡:
- Android:Google 宣布对华为新机暂停提供 Google Play 服务的许可版本,但 AOSP(Android Open Source Project,安卓开源项目)部分因为是 §734.3(b)(3) 公开可用,华为仍可下载和使用。
- ARM:因为其部分 IP 含有美国成分,一度宣布暂停与华为的合作,后又在内部评估 IP”美国成分比例”后恢复了部分 ISA 层面的许可。
- SD 协会、Wi-Fi 联盟、JEDEC 等:短期内将华为从会员中移除或暂停投票权,之后随着法律评估完成,基本都恢复了其成员身份。
- 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”),要点:
- Apache 项目的源代码以 Apache License 2.0 开源,是公开可用的出版物,受 EAR §734.3(b)(3) 和 §734.7 约束之外;
- 这些代码的获取、使用、再分发不因 Entity List 而改变;
- ASF 本身位于美国,遵守美国法律;
- 任何个人和组织均可继续参与 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 月发布声明,明确:
- Linux 内核源代码以 GPLv2 开源,是公开可用信息,不受 EAR 限制,亦适用 §734.3(b)(3) 豁免;
- 基金会及其项目(含 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 对中国开发者参与基金会项目的实际影响
从工程视角看,实体清单事件留下的几个长期影响:
- 公有云服务 ≠ 开源代码。华为可以下载 TensorFlow 源码,但不能用 Google 的公有云 AI 服务。很多中国公司因此在内部建立了”对外依赖清单”,把”源代码”与”云服务 / 商业许可证”分开管理。
- 基础设施多点化。大型中企的代码镜像会同时放在 GitHub、GitLab 自建、Gitee、GitCode、Codeberg 等多处,避免任一家出现合规限制时整个研发停摆。
- 法律评估前置到架构。涉及加密的开源库版本锁定 + 本地镜像 + 许可证矩阵评估成为大厂 OSPO 的标配(详见本系列第 17 篇《OSPO 与合规自动化》)。一些典型的架构策略:
| 合规风险 | 对应架构动作 |
|---|---|
| GitHub 访问不稳 | 主 repo 推 Gitee / 自建 Gitea 双向同步 |
| Docker Hub 拉取受限 | 自建 Harbor,统一镜像路径
registry.corp.cn/library/* |
| npm / pypi 被墙 | 自建 Verdaccio / Nexus / devpi |
| 闭源组件授权被停 | 梯度替换为开源平替,提前列出候选 |
| 关键美国开源库断更 | 保留长期支持分支,内部打补丁 |
| 云厂商合作被卡 | 多云策略(AWS + 阿里云国际 + 华为云) |
| 特定地区客户下载 | CDN 前置 GeoIP 规则 |
- 基金会投名状。中国公司在 Apache / CNCF / LF 参与度显著提高;一方面是业务需要,另一方面也是”成为规则参与者而非旁观者”的主动姿态。
- 从”使用者”到”贡献者”再到”捐献者”的进化。过去十年,中国企业对开源从”基本只使用”到”开始贡献”再到”主导捐献项目”的转变,部分动因就是:只有成为上游规则的塑造者,才能减小被合规风险打乱节奏的概率。Apache DolphinScheduler、Apache ShardingSphere、Apache IoTDB、CNCF Harbor、CNCF KubeEdge、Apache OpenDAL 等都是中国企业主导捐献并已毕业的项目。
四、OFAC 制裁与开源贡献
4.1 OFAC 制裁名单(SDN)与制裁国
OFAC 在美国财政部之下,执行经济 / 金融制裁。其主要名单:
- SDN(Specially Designated Nationals and Blocked Persons)List:特别指定国民名单,任何”美国人”(U.S. person,包括美国公民、绿卡持有者、在美公司和位于美国的任何人)不得与其进行交易,其财产在美管辖范围内自动冻结。
- SSI、NS-MBS、FSE-IR、MBS 等细分名单:针对特定行业 / 部门的部分制裁。
- 综合制裁国(Comprehensive Sanctions):古巴、伊朗、朝鲜、叙利亚、以及乌克兰的克里米亚 / 顿涅茨克 / 卢甘斯克 / 扎波罗热 / 赫尔松地区。
对开源而言,关键在两个层面:
- 贡献者个人:如果一个贡献者被 OFAC 认定在这些制裁国 / 在 SDN 上,项目(尤其是由美国组织持有代码库的项目)从事与其相关的”service”可能受限;
- 最终用户 / 部署地:即使代码公开可用,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 的后续讨论中:
- Linus Torvalds 公开表示,这是因为相关维护者受到美国 / 其他国家的制裁法律的影响,Linux 基金会法律部门要求处理;
- 该调整不删除他们既往的贡献(Git 历史不被 rewrite),只是不再把他们作为官方 MAINTAINERS;
- 将来若能提供”不受制裁约束”的证明(例如不在被制裁实体就职),可以恢复身份。
这次调整覆盖的面很小,据公开信息大约十几位维护者,涉及的子系统多集中在特定硬件驱动。邮件列表的回复中有人质疑”为什么不直接说是哪条制裁条款”,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 伊朗、朝鲜、古巴、叙利亚开发者的处境
这几个国家的开发者长期面临:
- GitHub 账户可能被锁定(2019 年有批量锁定伊朗账户事件,后经调整,公开仓库读写在 2021 年前后部分恢复);
- npm / PyPI / Docker Hub 等平台对制裁地区 IP 的访问限制;
- 无法注册 Google Cloud / AWS / Azure / OpenAI 等需要支付的服务;
- 某些 CLA 要求填写国籍 / 所在地,会直接触发法务评估。
- 学术合作和会议发表受限,研究生出国念书时签证困难;
- 开源项目中以”真实姓名 + 所在机构”署名可能遭致项目维护者顾虑。
2019 年 GitHub 限制伊朗账户事件后,社区的反应:
- 伊朗开发者成立 https://github.com/1995parham/github-do-not-ban-us 一类公开抗议项目,获得数千 star;
- GitHub 在官方 blog(https://github.blog/2021-01-05-advancing-developer-freedom-github-is-fully-available-in-iran/)发表长文,说明在获得美国财政部 OFAC 许可(license)之后,已重新允许伊朗开发者访问个人免费公共仓库;
- 但企业 / 付费功能、和位于受限地区的用户账户仍有限制。
古巴、朝鲜、叙利亚因为综合制裁更严,开发者几乎完全无法使用主流美国平台。部分人的选择:
- 迁移到 Codeberg / SourceHut / Gitea 等非美国托管;
- 使用中国、俄罗斯、欧洲私有邮箱注册;
- 以学术身份(大学、研究机构)获得专门的学术豁免。
对中国开发者的提醒:不要用”VPN + 虚假国籍”去帮制裁国同事注册服务,这在美国法律下是”帮助规避制裁”,风险远大于收益。一个折中方案:与制裁国同事的技术合作,尽量在”公开代码层”进行——PR、issue、公开邮件列表这些路径是 EAR 豁免保护的。需要私有协作(内部 Slack、私有 repo、未公开技术文档)时,先咨询法务。
一些社区(包括 Gitea、Codeberg、SourceHut)明确把自己定位为”不受美国管辖为主的平台”,希望为这些开发者保留代码托管能力。
对中国开发者的借鉴:即便今天没人主动锁你,“建立异地镜像”也是成本低、收益大的保险。常见做法是:
- 在 GitHub 主仓库上同时配置 Gitee / GitCode / Codeberg / 自建 Gitea 的 push mirror;
- CI 产物(binary / image)同时发布到 GitHub Releases、Docker Hub、quay.io、阿里云 ACR、Harbor 开源镜像站;
- 对外文档声明”如主站不可用,可从以下镜像获取”,避免”单点失联”。
4.4 GitHub 的制裁执行实践
GitHub 在 https://docs.github.com/en/site-policy/other-site-policies/github-and-trade-controls 里详细说明了自己的合规框架:
- 公开仓库的浏览、克隆、提交 issues 和 PR,在大多数情况下可用,依据是 EAR §734.3(b)(3) 和 §734.7;
- 私有仓库、付费计划、组织账号 等”service”功能,则受到更严格的限制;
- 被 SDN 或位于综合制裁地区的账户会被限制功能;
- 用户可以通过申诉流程证明”不在受制裁实体”或”已搬离受制裁地区”从而恢复。
这套模型对所有美国托管平台(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 名单受影响时,走基金会法律流程,而非社区投票;
- 不因国籍 / 机构所在国而单独排除,只因具体制裁事实而处理;
- 对受影响的贡献者,通常保留其历史贡献记录,只变更未来的权限状态。
主流基金会的共性做法:
- 在总部所在国家(多为美国)聘请合规律师,维护项目 ECCN 列表;
- ICLA / CCLA 中加入出口合规声明(见本系列第 18 篇《CLA 与 DCO》),贡献者承诺其贡献不违反适用的出口管制 / 制裁法律;
- 对涉及加密的新项目做 TSU 通知;
- 必要时调整 MAINTAINERS / 权限(如上文 Linux 案例);
- 在声明中区分”代码 / 项目的公开可用属性”与”平台服务的可用性”,前者尽量保持全球可用,后者遵守当地法律。
- 对接”安全披露 / 漏洞报告”流程做国际化适配: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 处理。
对工程上的启示:
- 在产品设计里尽量把加密层抽象到一个清晰的模块,便于做 ECCN 分类;
- 不要 fork 维护私有版本的 OpenSSL,除非你愿意自己承担分类和许可证责任;
- 做白盒加密 / 国密算法模块时,专门评估出口合规——这是 5.2 要讲的。
- 对 TLS 握手链路上的依赖做明确记录。很多产品文档里只写 “uses HTTPS”,真到合规审计时需要给出具体实现,一时找不到。
- 升级 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,国家密码管理局)管辖的商用密码。详情可见本系列姊妹文《国密算法工程实战》。
出口视角:
- 在中国境内研发并发布开源实现(如 GmSSL、Tongsuo(铜锁)、go-gmsm、Bouncy Castle 的 GM 分支):源头遵守中国《密码法》《商用密码管理条例》,公开发布需满足中国境内商用密码的合规要求;出口境外使用时一般不再由 EAR 管辖,但会被当地国家的加密进口法规(例如俄罗斯 FSB 认证)管辖。
- “回流”场景:开源 SM 实现被 OpenSSL、BoringSSL、rustls 等美国主导项目集成之后,代码本身又成为 5D002 的一部分;此时按”美国项目”规则再出口。
- 商业 SDK:国内商密 SDK 出海时,通常要在目标国做”加密进口备案”(法国 ANSSI、俄罗斯 FSB、越南 MIC 等都有类似制度),和美国 EAR 是平行体系。
开发者尤其要注意:“国密的安全性符合国标”与”国密模块在海外合法分发”是两件事。后者需要做出口 + 进口双向评估。
再细化一些常见的国密 + 出海模式:
- 客户端是国产系统,服务端在海外:典型如面向华人群体的 APP,客户端要用国密适配国产手机的内置算法库,服务端在新加坡。服务端 TLS 用国际算法,应用层包体再叠一层 SM2/SM4。合规上源头 SDK 出境遵守中国商密;目标国进口侧一般不限制;“端到端”只要在法域边界解密 / 再加密清晰即可。
- 金融行业数据跨境:在香港 / 澳门开展对中国大陆客户的服务时,香港侧要支持国密以便与内地清算网关对接;同时本地监管要求使用国际算法。解决方案是”双栈”并行。
- 政企出海的 VPN / 专网:向”一带一路”沿线客户提供含国密的专网设备,往往会被当地列入”本地加密进口”审查。不少国家会要求提供算法白皮书、证明无”后门”。
- SM2 作为可选签名算法出现在国际协议扩展:OpenSSL 3.x 已经内置 SM2 / SM3 / SM4 支持。当一个国际开源项目接收 SM 相关 PR 时,PMC 不需要重新走一次 TSU 通知——SM 系算法被视为 5D002 的具体实例,Matrix 里更新版本号即可。
- SM9 / ZUC 向学术社区的贡献:这两类算法的公开参考实现已经被 ISO 标准化(ISO/IEC 14888-3、18033-3 等),在学术发表和 IETF 文稿中可以自由引用和实现。
5.3 含加密功能的商业软件出海
闭源商业软件如果归为 5D002,出口路径一般有三条:
- §740.17 License Exception ENC:按照条款(b)(1)“最终用户 = 美国子公司 / 外国政府”、(b)(2)“mass market”(大众市场)等不同小类,配合向 BIS 提交的分类请求或 “self-classification report”。
- CCATS 分类 + License:对高强度加密(如量子安全、某些长度以上的 KEM 等)或向受限国家出口时申请单独许可证。
- 特定项目下的豁免:例如对盟国政府的某些 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 项目时:
- 你签的 ICLA 包含 “Contribution” 的授权声明,没有直接的”出口合规”条款,但通过 ASF 的政策隐含:“你提交的内容可以被 ASF 自由分发到全世界”,这意味着你事实上同意”以 TSU / 公开可用 形式公开发布”。
- ASF 的 “Export Control” 页面要求”Committer 在向涉及加密的项目 commit 加密相关 patch 前,先与 PMC / VP, Legal Affairs 联系”,必要时更新 ECCN Matrix。
- 对于中国籍贡献者身份本身,只要不在 SDN 名单、不在被综合制裁的国家、不代表被 Entity List 实体,参与是完全合法的。
如果你是项目外来贡献者,PR 被合并后你不会直接”触发”任何出口动作——是 ASF 以基金会身份对外分发,你只是”把代码交给基金会”。这一设计简化了个体贡献者的合规负担。相对的,Committer 和 PMC 作为基金会代理人,合规责任更大一些。
6.2 Committer / PMC 身份的注意事项
成为 Committer 之后,你获得的是对 ASF 基础设施的写权限。这不同于”贡献公开代码”:
- 访问 ASF 基础设施(svn、git、JIRA、邮件列表)属于 ASF 提供的 “service”,受 OFAC / EAR 管辖的面比”纯公开代码”更大;
- 如果你搬到了综合制裁地区(例如去伊朗 / 朝鲜工作),ASF 可能不得不暂停你的账号;
- PMC 成员参与投票 / release 流程时,是以 ASF 项目管理者身份行事,涉及的合规关注比 Committer 更多,尤其是发布含加密代码的 release 时要走 “ECCN update” 流程。
- 跨多个项目拥有 Committer 身份(俗称 “Committer at ASF”
而非某项目 Committer)时,可以在
people.apache.org的个人页登记所在国家,以便基金会在需要时快速评估; - 变更雇主 / 所在地后,建议主动更新
committer-info,而不是等到基金会查出”某位 Committer 现在在制裁地区工作”才被动处理。
对中国 Committer / PMC 的建议:
- 不要把工作邮箱(例如
xxx@huawei.com)作为唯一联系方式,用个人邮箱(Gmail / ProtonMail / 自建)在基金会内做联络,可以在雇主变更时保持身份稳定; - 贡献加密算法 / 安全相关代码时,留存 PR 讨论链接和 PMC 批准邮件,作为自己”以基金会流程贡献”的证据;
- 参加 ApacheCon / PMC 会议时,注意不透露所在公司内部未公开的信息,避免”deemed export”的理论风险。
6.3 涉及加密模块的贡献
实操建议:
- 新增 / 修改加密算法 的 PR 要在 description 里注明算法、密钥长度、调用来源,方便 PMC 判断是否更新 ECCN;
- 引入 OpenSSL / BoringSSL / BouncyCastle 等依赖,并不要求重新分类,但要注明版本;
- 引入国密(例如给 Apache ShardingSphere / Apache IoTDB 添加 SM2 / SM4 支持),需要特别提示——它在中国合规视角叫”商用密码”,在美国 EAR 视角下仍然落在 5D002 的通用加密范畴,需要走 TSU 豁免或 ENC;
- 写单元测试使用的测试密钥要公开、足够短或明示为测试用途,避免被误判成”真实商业加密部署”。
6.4 涉及中国政府 / 国密的项目捐献
近几年一个活跃的方向是:中国公司把自家的国密增强项目捐献到国际开源基金会。例如 Tongsuo(铜锁)早期在 GitHub 开源、后续引入多家企业共同维护;Apache 的部分 Committer 在 PMC 决策中讨论过”国密支持是否进入主线”。从出口合规角度看:
- 捐献过程涉及代码 copyright transfer / license 再授权,该走 Software Grant Agreement;
- 捐献后新主库一旦在 Apache / CNCF 基础设施上托管,ECCN 由基金会登记,整体落入 TSU 豁免链条;
- 中国原主库的”镜像”或”长期维护版本”仍然留在 Gitee / 自建 Gitea,面向中国境内客户使用,走中国商密体系;
- 海外用户下载基金会版本,合规路径清晰;海外用户若希望”商业支持”,一般由上游公司在当地法人提供。
这套路径既满足了”真正国际化”,也不牺牲”中国境内合规”。对想把国产基础软件推向全球的团队,值得参考。
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。出海合规的核心动作:
- 数据本地化与 GDPR:欧洲 region 的数据默认留在欧盟,控制面由阿里云海外法人运营;
- 加密合规:TLS / KMS 等产品使用的加密算法在不同 region 有差异——例如中国 region 默认支持国密算法,境外 region 默认仅支持国际算法,二者不交叉;
- 实体清单 / SDN 筛查:在客户注册、实名认证时做 OFAC / EU sanction 名单筛查;
- 与美国制裁的互动:阿里云作为中国公司,不受美国 EAR 直接管辖,但其海外 region 所使用的部分芯片 / 软件来自美国供应商,仍要遵守这些供应商的出口条款(这也是所谓”美国成分”问题)。
- 合规认证:逐步拿下 C5(德国)、IRAP(澳大利亚)、SOC 2、ISO 27001 / 27017 / 27018 等,增加 enterprise 客户选型时的可信度。
7.2 华为云的合规框架
华为云 Huawei Cloud 由于 2019 年 Entity List 事件,更早建立了一整套多国合规体系:
- 三朵云战略:中国、香港、新加坡、荷兰、沙特、巴西等多 region 运营,分别由当地法人作为合规主体;
- 产品的”美国成分”替换:逐步用国内 / 非美供应链替代部分 x86 / GPU / 软件组件,减少 FDP Rule 触发面;
- 客户端侧加密:KMS / HSM 服务同时支持国密和国际算法,按 region 策略选择;
- 出口合规团队:向海外客户出货 / 部署服务器时,走自己的 ECCN 评估流程。
- 国密与国际算法双栈:中国境内用国密、海外 region 用国际算法,编译期 / 部署期通过 feature flag 切换,避免单一版本跨境误用。
- 对欧盟 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 小团队如何避免一开始就掉进陷阱
对三五个人的出海创业团队,给不起一支合规团队,可以按这个优先级处理:
- 先别碰闭源强加密 SDK 这条路。能走开源 + TSU 就走,法律负担最轻。
- 所有对外付费接口通过 Stripe / Paddle 等成熟 MOR(Merchant of Record)。他们替你处理 OFAC 筛查和税务合规。
- 公司注册地与客户法域分开考虑。中国境内研发 + 香港 / 新加坡 / 开曼控股公司 + 美国 / 欧洲销售实体,每一层做一件合规的事情,不要让一个实体背所有风险。
- 保留一次小额外聘律师预算。在”签第一份海外企业客户合同”、“第一次融资”、“第一次出货给中东 / 非洲”前找一次律师,远比事后补救便宜。
- 宁愿多拆一层法律实体,也不要为了省事把中国研发与美国销售揉在同一家公司。许多小型 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 篇)通常要填写国家 / 地址。工程上可以:
- 通过 CLA Assistant / EasyCLA 等工具,在贡献者签署时收集国家字段;
- 把字段与 OFAC 制裁国列表做对照(使用 Treasury 提供的 SDN XML 定期同步);
- 命中时不自动拒绝,而是转人工复核:很多情况下,贡献者可能只是 VPN / 临时旅行 / 双重国籍,需要额外证明。
- 把贡献者记录的法律基础以隐私政策的形式明示:为什么收集、存多久、是否共享。欧洲贡献者会特别在意这一点(GDPR)。
- 把”国籍”与”实际工作国”分开记录,前者可能更稳定,后者才是合规判断依据(例如一位中国籍开发者长期在瑞士工作,其贡献应按瑞士法律风险评估)。
8.3 git 仓库审查
对于涉及加密、涉及海外客户的项目,发布前对 git 仓库做一次审查:
grep -ri "aes\|rsa\|ecdsa\|sm2\|sm3\|sm4" --include='*.go' --include='*.c' .列出加密算法出现位置;- 把这些模块与 ECCN Matrix 对齐:是自己实现 ? 调用依赖 ? 可配置关闭 ?
- 检查 commit author / committer 的 email 域名是否涉及制裁实体;
- 对 tag / release 打包时,自动产出 SBOM(见本系列第 16 篇《SCA 与 SBOM》),SBOM 中包含每个组件的 ECCN。
- 扫描
*.pem、*.key、id_rsa等文件,确保没有把生产密钥 / 客户密钥误 commit;这是 security 与 compliance 交叉的高危点。 - 对 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)都有对”重要数据”出境的限制。与出口管制的关系:
- 一套”向海外客户提供 SaaS”的部署会同时触发:EAR(软件出口)、OFAC(服务提供)、PIPL(个人信息出境)、GDPR(欧盟用户数据处理);
- 好的架构会让数据尽量留在客户法域内(“data residency by default”),控制面才是跨境流通的核心;
- 开源代码本身一般不包含个人数据,因此”代码出境”与”数据出境”是两件事——把它们分清楚能避免把简单问题复杂化。
中国数据跨境合规的具体做法(PIPL 标准合同、安全评估、认证机制三条路径)不在本文范围,推荐另起专题阅读。
九、工程坑点
下面是常见的”踩过才知道”的坑:
- 以为开源就一定不受 EAR 管辖:错,加密软件是特例,需要走 TSU 豁免而不是 §734.3(b)(3)。
- 把”不在 SDN”当作完整的筛查:还要查 Entity List、DPL(Denied Persons List)、Unverified List、MEU(Military End User)list、各国的本地制裁名单。
- VPN 解决合规问题:VPN 不是合规工具,OFAC / EAR 看的是 “who” 而不是 “IP”。真实所在国和真实最终用户才是关键。
- “我的项目不卖美国”所以不用管 EAR:只要你有一位美国开发者、你用美国的库、你在美国 CDN 发布,你就已经在 EAR 的某个面里。
- 忘记 TSU 的 URL notification:很多创业公司自己写了加密库丢到 GitHub,没有发过通知。严格说是不合规的,但补发并不难——一封邮件的成本。
- 闭源 SDK 随便给海外客户试用:走过大方向的 ENC 豁免之前,不要向未审 region 的客户 “试用版”,否则是”未申报出口”。
- Git 历史里留下了含密钥 / 含政府标识的测试文件:历史不能轻易 rewrite,出口审计时容易被挑。产生前就 .gitignore 掉。
- 把”中国公司”与”中国员工”混淆:实体清单上是特定公司,个人只要不是代表这些实体就可以正常参与开源。反之,SDN 上的个人即便身处第三国,交易也受限。
- 只看 EAR 不看 OFAC:EAR 关注”物项流向”,OFAC 关注”与谁做交易”;后者违反的刑事风险更高。二者常被同时触发。
- 用 CLA 代替出口合规评估:CLA 主要解决版权许可 / 专利授权(见本系列第 05 篇《专利与商标》、第 18 篇),不代替 ECCN 分类与 sanction 筛查。
- 把”美国成分”理解成纯硬件概念:错。软件、技术、Know-How、甚至 EDA 工具使用生成的 IP 都可能算美国成分。服务于云端的 API 本身也可能算。
- 在公开仓库里放内部法务意见或合规报告:这类文档虽无版权风险,但可能包含客户名单、地区分布等信息,一旦公开反而缩小了未来的回旋空间。合规材料建议放私有目录。
- GitLab / Gitea 自建 = 完全无合规负担:错。只要你的业务涉及向制裁国 / SDN 出口,平台换成自建不改变法律评估。自建的价值在于”不因第三方合规而被断服”,不在于”绕过合规”。
- 把 TSU 通知当成一次性任务:错。项目 URL 变更、顶级加密算法发生重大替换(例如加入 PQC 算法)时,一般建议补通知。
- 以为”我的项目从没向美国卖过”就没关系:EAR 的管辖基于”物项”而非”买方”。只要包含美国 origin 成分 + 出口到制裁地区,就已经违规。
- 把 “mass market” 判定想当然:§740.17 ENC 下的 “mass market” 有明确条件(零售销售、终端用户可自行安装、不因用户定制而变化等)。企业 SDK 一般都不满足 mass market,常被误归。
- release notes
里写大段密码学细节:看起来专业,但会让审计员要求对每个算法单独分类。除必要的安全公告外,把”算法列表”维护在
EXPORT_COMPLIANCE.md或 ECCN Matrix,release notes 保持简洁。 - 在公开场合承认”我们产品可能被某实体列客户使用”:即便是玩笑,也会被竞品 / 监管留档。对敏感客户保持沉默是一种合规姿态。
- 出国参加会议带着未发布代码的笔记本:这涉及 deemed export / 海关电子设备检查,历史上有开发者被要求检查笔记本。保险做法是只带公开代码 + 通过私有 VPN / 云 IDE 访问未发布代码。
十、决策树:我的项目需要做什么
把全文的操作压缩成一张问答表:
Q:我的项目不含任何加密算法,也不在 CCL 其他条目。 A:归 EAR99,公开发布可走 §734.3(b)(3)。避免向制裁国 / SDN 出口即可。不需要走 TSU 通知。
Q:我的项目含加密,源代码公开发布在 GitHub。 A:5D002 + §740.13(e) TSU。请发一封 URL 通知给
crypt@bis.doc.gov和enc@nsa.gov(抄送项目 Maintainer 邮件列表存档)。移站时补通知。Q:我的项目含加密,是商业闭源 SDK,向海外客户出售。 A:做 self-classification 或 CCATS 分类;走 §740.17 ENC;年度 self-classification report + 半年度 sales report;不向 E:1 / E:2、SDN、Entity List 出口;部分国家可能还需要当地加密进口备案。
Q:我的项目由中国公司主导,想捐献到 Apache / CNCF。 A:可以。按基金会流程走孵化。涉及加密算法时,注册 ECCN Matrix;中国籍贡献者身份不影响 Committer / PMC 资格(前提是不属于被制裁实体)。
Q:我所在公司被列入 Entity List。 A:贡献 / 使用公开发布的开源源码不受影响;使用 GitHub / AWS 等”service”部分可能受限;请咨询公司合规部门。个人身份下参与开源一般不受限(以个人而非公司身份贡献)。
Q:我的项目想集成国密算法给海外客户使用。 A:国密开源实现出海后仍被美国视角归为 5D002 下的通用加密,须走 TSU 或 ENC;同时目的国可能有加密进口 / 算法认证要求(如俄罗斯 FSB、法国 ANSSI)。
Q:我收到一个来自伊朗 IP 的 PR。 A:合并公开代码本身属 EAR 豁免范围;但如果该贡献者被 OFAC 单独列入 SDN,或代表被制裁实体,需拒绝并记录。单凭 IP 不能判断,建议与法务共同评估。
Q:我想把服务部署到中东客户。 A:筛查客户是否在 SDN / Entity List;评估是否涉及受限最终用途;检查 SaaS 本身的 ECCN;若涉及加密商业软件,走 ENC 或许可证路径;并考虑当地数据保护法规。
Q:我在海外研究所工作,想以个人身份给 OpenHarmony 这样的中国主导项目贡献代码。 A:只要项目本身的贡献者协议不把你排除在外,并且你贡献的是源代码而非具体的军用技术,就是合法的。但要注意:你所在国家可能有针对特定中国受限实体的”逆向”限制,如果 OpenHarmony 背后的某个法人被列入该国名单,理论上有风险;实际上中国主导项目对海外贡献者始终持欢迎态度。
Q:我的项目在 GitHub,突然哪天 GitHub 因政策不得不限制中国大陆访问,我应该怎么办? A:提前做好镜像(Gitee / GitCode / Codeberg / 自建 Gitea),至少保障代码、release、文档三处多点;对于 CI,把关键密钥放在你自己的 secret manager 而不是绑死在某一家 CI Provider。这个问题更多是韧性工程问题,而不是合规问题。
Q:我的 AI 开源项目用的模型权重,算不算”软件”? A:截至目前,美国对 AI 模型权重的出口管制尚在动态变化中(2024–2025 年有多轮规则制定)。一种保守姿态:把”权重”与”代码”分开 release,并在权重发布时注明训练数据与用途限制。
Q:我想做一个完全不涉及加密的小工具,SaaS 化卖到全球。 A:EAR99 + 公开可用使得代码分发不受限,但 SaaS 本体仍然是 service,需要对注册用户做 OFAC 筛查;账单系统一般会捆绑这项能力(Stripe / Paddle 等会自动拒绝制裁地区信用卡)。
Q:我是独立开发者,完全没时间研究这些。 A:最低成本路径——项目完全开源(选 Apache-2.0 或 MIT)发布在 GitHub;涉及加密就发一封 TSU 邮件;付费接入 Stripe / Paddle;不要自己做海外银行账户 + 现金交易。这样做完,绝大多数风险都被平台和豁免吸收掉了。
Q:我以个人名义贡献过一些加密相关代码给某 US 项目,现在要入职某家被列入 Entity List 的中国公司,是否需要做什么? A:个人历史贡献不受影响。入职后以该公司员工身份与该 US 项目的交互(例如以
@corp-email提交、代表公司出席技术会议)则应由公司法务评估。个人继续以私人邮箱贡献通用代码通常没问题,但涉及敏感技术细节的互动需要谨慎。
本文为工程参考,不构成法律意见。涉及具体法律风险请咨询专业法律顾问。
最后,给一个”现实主义”的总结:
对于 95% 的中国开源开发者,你真正要做的事不多:
- 如果项目含加密且在 GitHub 公开,发一封 TSU 通知邮件;
- 在
README.md或EXPORT_COMPLIANCE.md里声明 ECCN; - 不主动向伊朗、朝鲜、古巴、叙利亚、克里米亚等综合制裁地区出口;
- 不主动与明确在 SDN / Entity List 的客户做商业合作;
- 保持镜像多点化,以防基础设施单点不可用。
剩下 5% 的场景(强加密商业 SDK、政府客户、军工相关、受限实体合作)才需要专业律师介入。把精力花在对的地方,合规就不是负担,而是出海的基础能力。
十一、参考资料
法规与官方文件
- 15 CFR Parts 730–774,EAR 全文:https://www.bis.doc.gov/index.php/regulations/export-administration-regulations-ear
- BIS Commerce Control List(CCL):https://www.bis.doc.gov/index.php/documents/regulations-docs/2330-ccl5-pt2/file
- License Exception TSU(15 CFR §740.13)与 ENC(§740.17)全文见 BIS 官网
- Entity List(15 CFR Part 744, Supplement No. 4):https://www.bis.doc.gov/index.php/policy-guidance/lists-of-parties-of-concern/entity-list
- OFAC SDN List:https://ofac.treasury.gov/specially-designated-nationals-and-blocked-persons-list-sdn-human-readable-lists
- OFAC Consolidated Sanctions List:https://ofac.treasury.gov/consolidated-sanctions-list-non-sdn-lists
基金会与平台声明
- Apache Software Foundation ECCN Matrix:https://www.apache.org/licenses/exports/
- Apache Software Foundation 2019 年关于华为的声明(ASF Blog)
- Linux Foundation 2019 年关于出口管制的声明:https://www.linuxfoundation.org/blog/blog/us-export-controls-and-open-source-projects
- GitHub and Trade Controls:https://docs.github.com/en/site-policy/other-site-policies/github-and-trade-controls
事件与新闻报道
- Phoronix / LWN 2024 年 10 月关于 Linux 内核移除俄罗斯维护者的报道与 LKML 讨论
- 华为被列入 Entity List 的 BIS 公告(Federal Register 2019-10616)
- OpenSSL 项目出口合规页面:https://www.openssl.org/source/
本系列其他文章
延伸阅读
- Peter Swire, “A Pedagogic Cybersecurity Framework”(对 EAR / 国际合规的工程化理解);
- BIS 官方 FAQ:“Encryption FAQs”(https://www.bis.doc.gov/index.php/policy-guidance/encryption/1-encryption-items-not-subject-to-the-ear);
- 美国商务部对开源软件的专门解释:“Publicly Available Technology and Software”;
- Wassenaar Arrangement 公开文档(多边出口管制框架);
- 中国商用密码管理条例与《密码法》全文(国家密码管理局官网);
- Eclipse Foundation 迁址公告:“Eclipse Foundation to Become a European Foundation”,2020;
- GitHub 2021 年关于恢复伊朗开发者访问的 blog(https://github.blog/2021-01-05-advancing-developer-freedom-github-is-fully-available-in-iran/);
- Phoronix 2024 年 10 月《Russian Linux Kernel Maintainers Dropped》报道与后续 LWN 综述;
- Apache Software Foundation 2019 年 5 月关于华为的官方声明存档。
上一篇:CLA、DCO 与贡献者协议 | 下一篇:开源战略:什么时候开源、选哪个协议、如何构建商业壁垒
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【开源许可与版权工程】开源许可证实操手册:从选型到发布
面向工程团队的开源许可证完整操作手册:许可证选型决策树、LICENSE/NOTICE/SPDX 文件写法、第三方依赖声明、CI 自动化检查、发布物合规标注,以及六套真实可复制的项目结构模板。
开源许可与版权工程
面向中国工程团队的开源许可、版权与合规系列。从 GPL、AGPL、Apache、木兰协议到中国真实案例、SCA/SBOM 工具链与出海合规,讲清楚开源在工程落地中的坑与方法。
【开源许可与版权工程】开源许可证全景:宽松、弱 Copyleft、强 Copyleft、网络 Copyleft
从 MIT 到 AGPL,从 SPDX 标识符到 OSI 认证:一篇讲清楚四类开源许可证的边界、兼容性矩阵、SSPL/BSL 的争议、Commons Clause 事件,以及工程里最常见的踩坑场景和选型建议。
【开源许可与版权工程】MIT、BSD、Apache 2.0:宽松许可证的真实区别
深入对比 MIT、BSD 家族与 Apache 2.0 的条款差异:NOTICE 文件义务、专利授权、重新授权权利;BSD advertising clause 的历史与废除;ISC 许可证的关系;以及阿里、腾讯、字节内部为何强烈推荐 Apache 2.0 的工程原因。