# 名称约束（Name Constraints）是什么？

> 名称约束是 CA 证书中的 X.509 扩展，用来限定该 CA 之下签发的证书只能包含哪些域名、IP 段、邮箱或 DN。

Source: https://ssl.sh/zh/glossary/name-constraints/
Last updated: 2026-11-10

名称约束（Name Constraints）在 RFC 5280 中定义，包含 `permittedSubtrees`（允许的子树）和 `excludedSubtrees`（排除的子树）。验证方会把它应用到链上位于该 CA 之下的所有证书：主体和 [SAN](https://ssl.sh/zh/glossary/san/) 中的每个名称都必须落在某个允许子树内，并且不落在任何排除子树内。对 DNS 名称而言，约束 `example.com` 会匹配 `example.com` 本身以及 `api.example.com` 等所有子域名；IP 约束则写成“地址/掩码”的形式。

## 为什么重要
名称约束能把 CA 变成“技术上受限”的 CA。企业可以运营一个只允许签发自家域名的 [下级 CA](https://ssl.sh/zh/glossary/subordinate-ca/)，或者搭建一个 [私有 CA](https://ssl.sh/zh/glossary/private-ca/)，即使它的根证书装进了员工电脑，也无法被用来冒充外部网站。这样一来，信任合作方、外包商或集团子公司的内部根证书，风险就小得多。各平台和 TLS 库对名称约束的支持历史上并不一致，正式依赖之前，应在实际使用的客户端上逐一测试。

## 例子
```text
nameConstraints = critical, permitted;DNS:example.com, permitted;IP:10.0.0.0/255.0.0.0
```

写在 OpenSSL 扩展配置段中，表示该 CA 只能签发 `example.com` 及其子域名、10.0.0.0/8 网段的证书。

## 常见误区
- **名称约束可以写在终端证书里。** 它只在 CA 证书中有意义，用来约束其下方签发的证书。
- **约束 example.com 不包括子域名。** 对 DNS 名称来说，它覆盖该域名及其下的所有名称。
- **名称约束能阻止 CA 签发其他名称。** CA 仍然可以签任何内容，拒绝越界证书的是客户端，所以客户端是否支持才是关键。

## 相关术语

- [下级 CA](https://ssl.sh/zh/glossary/subordinate-ca/): 下级 CA 是 CA 证书由另一个 CA（通常是根 CA）签发的证书颁发机构，一般负责实际签发终端证书。
- [私有 CA](https://ssl.sh/zh/glossary/private-ca/): 私有 CA 是企业为自己的系统和设备搭建的证书颁发机构，其根证书只在企业主动安装的设备上受信任。
- [基本约束](https://ssl.sh/zh/glossary/basic-constraints/): 基本约束是 X.509 证书扩展，用来声明该证书是否属于 CA，以及其下方还允许出现多少层 CA。
- [X.509](https://ssl.sh/zh/glossary/x509/): X.509 是 ITU-T 制定的公钥证书标准格式，其互联网配置规范 RFC 5280 规定了 TLS 所用证书的结构和验证方法。
- [SAN](https://ssl.sh/zh/glossary/san/): SAN 即主体备用名称，是 X.509 证书中列出其适用的所有域名、IP 地址等身份的扩展，客户端按它校验主机名。
- [EKU](https://ssl.sh/zh/glossary/extended-key-usage/): EKU 即扩展密钥用途，是列出证书可用于哪些目的（如 serverAuth 服务器认证、clientAuth 客户端认证、代码签名）的 X.509 扩展。
