开源许可证合规性:软件公司实用指南

通过许可证分类、SBOM 生成、copyleft 义务和商业软件的自动合规性扫描来了解开源许可证合规性。

E
ECOSIRE Research and Development Team
|2026年3月16日3 分钟阅读557 字数|

属于我们的Compliance & Regulation系列

阅读完整指南

开源许可证合规性:软件公司实用指南

平均商业应用程序包含 77% 的开源代码,分布在 500 多个依赖项中。 每个依赖项都有自己的许可证和特定义务。违反这些义务将使您的公司面临诉讼、强制代码披露和声誉受损。然而,大多数公司没有跟踪或遵守开源许可证的流程。

本指南为开源许可证合规性提供了一个实用的框架,从许可证分类到自动扫描和 SBOM 生成。

要点

  • 并非所有开源许可证都是相同的:宽松许可证几乎允许任何内容,copyleft 许可证要求您共享修改
  • 软件物料清单 (SBOM) 正在成为政府采购的法律要求(美国行政命令 14028)
  • CI/CD 中的自动许可证扫描可防止不合规的依赖项进入您的代码库
  • Copyleft“感染”风险是真实存在的:一项 GPL 依赖项可能会迫使您开源整个应用程序

许可证类别

许可许可证(低风险)

|许可证|义务|商业用途|改装|分销| |--------|---------|----------------|------------||------------| |麻省理工学院 |包括版权声明+许可|是的 |是的 |是的 | | BSD 2 条款 |包括版权声明+许可|是的 |是的 |是的 | | BSD 3 条款 |相同+无代言声明|是的 |是的 |是的 | |阿帕奇2.0 |包括通知+许可+状态变更+专利授予 |是的 |是的 |是的 | |国际标准委员会 |包括版权声明+许可|是的 |是的 |是的 |

可安全用于商业用途。 在您的分发中包含许可文本和版权声明。 Apache 2.0 还要求注明对原始代码的任何更改,并包含专利许可。

弱 Copyleft(中等风险)

许可证义务关键限制
LGPL v2.1/v3分享对 LGPL 代码的修改;如果动态链接,您的代码将保持专有静态链接可能会触发copyleft
MPL 2.0共享对 MPL 文件的修改;新文件可以是专有的文件级 Copyleft
英超2.0共享修改;提供辅助许可证选项模块级 Copyleft

谨慎使用。 将 LGPL 库保留为共享(动态)库,而不是静态链接。将 MPL 许可的代码与您的专有代码保存在单独的文件中。

强 Copyleft(高风险)

许可证义务关键限制
GPL v2衍生作品必须获得 GPL 许可链接创造衍生作品
GPL v3与v2相同+反tivoization+专利授权更广泛的版权左
AGPL v3与 GPL v3 相同 + 网络使用触发 Copyleft服务器端使用计数
SSPL整个“服务”堆栈必须开源最广泛的版权

商业软件的风险最高。 在应用程序中使用 GPL 代码可能需要您根据 GPL 发布整个应用程序。 AGPL 将其扩展到服务器端软件——即使您从不分发二进制文件,将软件作为 Web 服务提供也会触发 Copyleft 义务。


合规工作流程

第 1 步:生成 SBOM

# For Node.js projects (using CycloneDX)
npx @cyclonedx/cyclonedx-npm --output-file sbom.json --spec-version 1.5

# For Python projects
pip install cyclonedx-bom
cyclonedx-py environment --output sbom.json

# For multi-language projects (using Syft)
syft . -o cyclonedx-json > sbom.json

Step 2: Scan for License Compliance

# Using license-checker for Node.js
npx license-checker --production --json --out licenses.json

# Using scancode-toolkit (comprehensive, all languages)
scancode --license --copyright --output-json scan-results.json .

第 3 步:分类并批准

创建批准的许可证列表:

{
  "approved": [
    "MIT", "BSD-2-Clause", "BSD-3-Clause", "Apache-2.0",
    "ISC", "0BSD", "Unlicense", "CC0-1.0"
  ],
  "conditional": [
    "LGPL-2.1", "LGPL-3.0", "MPL-2.0", "EPL-2.0"
  ],
  "prohibited": [
    "GPL-2.0", "GPL-3.0", "AGPL-3.0", "SSPL-1.0",
    "EUPL-1.2", "OSL-3.0"
  ]
}

步骤 4:CI/CD 集成

# .github/workflows/license-check.yml
name: License Compliance
on: [pull_request]

jobs:
  check-licenses:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - run: pnpm install --frozen-lockfile

      - name: Check licenses
        run: |
          npx license-checker --production --excludePackages "" \
            --failOn "GPL-2.0;GPL-3.0;AGPL-3.0;SSPL-1.0" \
            --summary

SBOM(软件物料清单)

为什么 SBOM 很重要

  • 美国行政命令 14028 要求出售给美国政府的软件具有 SBOM
  • 欧盟网络弹性法案将要求在欧盟销售的软件具有 SBOM
  • 供应链安全:SBOM 可实现快速漏洞响应(当 log4j 发生时,您知道自己是否受到影响)
  • 客户信任:企业买家在采购过程中越来越多地要求 SBOM

SBOM 标准

标准格式维护者领养
旋风DXJSON、XMLOWASP成长(npm 默认)
SPDXJSON、RDF、标签值Linux 基金会成立(ISO/IEC 5962:2021)
SWIDXML美国国家标准技术研究院政府

建议:CycloneDX 适用于大多数软件公司。它更简单,具有更好的工具支持,并且正在成为行业默认设置。


常见合规场景

场景 1:Node.js Web 应用程序

典型的 node_modules 目录包含 500-2,000 个包。绝大多数使用 MIT 或 ISC 许可证。常见问题:

  • 使用 GPL 的传递依赖项(您没有直接添加它们)
  • UNKNOWN 需要手动调查的许可证字段
  • 单个软件包上的多个许可证(例如“MIT OR Apache-2.0”)

行动:每周运行 npx license-checker --production。调查任何非许可许可证。 Replace GPL dependencies with permissive alternatives.

场景 2:Odoo 模块开发

Odoo 社区版是 LGPL v3。 Odoo Enterprise 是专有的。您的自定义模块:

  • 社区模块:必须是 LGPL v3 或兼容(如果已分发)
  • 私有内部模块:未分发,因此 LGPL 不适用
  • 企业附加组件:必须遵守 Odoo Enterprise 许可条款

场景 3:具有 AGPL 依赖项的 SaaS

如果您的 SaaS 应用程序使用 AGPL 许可的代码(例如,切换到 SSPL 之前的 MongoDB),您必须:

  1. 在 AGPL 下发布您的整个应用程序源代码
  2. 删除 AGPL 依赖项并使用替代方案
  3. 获得AGPL项目的商业许可(如果有)

即使您从不“分发”二进制文件,服务器端使用 AGPL 代码也会触发 Copyleft 义务。


常见问题

在我们的 API 中使用 GPL 库是否会迫使我们开源 API?

这取决于你如何使用它。如果 GPL 库链接到您的应用程序(静态或动态),FSF 的立场是您的应用程序是“衍生作品”,必须根据 GPL 获得许可。如果您通过网络 API(例如,使用 GPL 许可的数据库服务器)与 GPL 软件进行通信,则通常不被视为衍生作品。针对您的具体案件咨询律师。

如果依赖项更改其许可证怎么办?

您受获得代码时所依据的许可证的约束,而不是未来许可证更改的约束。但是,如果您使用新许可证更新到新版本,则新许可证适用于该版本。这就是为什么具有版本固定功能的 SBOM 很重要——它们准确记录了您正在使用的版本(和许可证)。

我们如何处理“未知”许可证的依赖关系?

检查包的存储库中是否有许可证文件。如果未指定许可证,则该代码在技术上受到完全版权保护——您无权使用、修改或分发它。要么找到许可证(它可能位于非标准位置),请求作者添加许可证,要么用明确许可的替代方案替换依赖项。

我们需要为 MIT 许可的软件包提供归属吗?

是的。麻省理工学院和大多数宽松的许可证要求您在分发软件时包含版权声明和许可证文本。对于 Web 应用程序,这通常意味着包含第三方通知文件或列出所有开源组件及其许可证的页面。


建立合规计划

季度合规审查

  1. 为所有项目重新生成 SBOM
  2. 扫描自上次审核以来添加的新依赖项
  3. 检查更新包中的许可证更改
  4. 查看出现的任何“未知”许可证
  5. 如果遇到新许可证,则更新批准的许可证列表
  6. 存档 SBOM 快照以进行审计跟踪

合规角色

角色责任
工程主管审查 PR 中的依赖项添加
法律/合规维护批准的许可证列表,审查边缘案例
安全与许可证扫描一起扫描易受攻击的依赖项
产品负责人决定产品是否接受有条件许可证

对于小团队来说,轻量级合规计划每季度需要 2-4 小时,并且可以避免在产品发布后或尽职调查期间发现合规问题而付出更大的成本。


接下来会发生什么

许可证合规性是软件治理的一方面。将其与针对您自己的代码的IP 保护、针对供应商软件的SaaS 协议要点 以及针对安全合规性的网络安全监管要求 相结合。

联系 ECOSIRE 以获取开源合规性审计和 SBOM 生成服务。


由 ECOSIRE 发布——帮助企业负责任地使用开源。

E

作者

ECOSIRE Research and Development Team

在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。

通过 WhatsApp 聊天