# CSR（证书签名请求）是什么？定义、例子与常见误区

> CSR 是证书签名请求，包含申请者的公钥和希望写入证书的身份信息，用私钥签名后提交给 CA 以申请证书。

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

CSR（Certificate Signing Request）是申请者生成并提交给 CA 的 PKCS #10 结构（RFC 2986）。里面有申请者的[公钥](https://ssl.sh/zh/glossary/public-key/)、主题[可分辨名称](https://ssl.sh/zh/glossary/distinguished-name/)，以及可选的扩展请求（如 SAN 多域名），整体用对应的[私钥](https://ssl.sh/zh/glossary/private-key/)签名。这个签名证明申请者确实持有私钥，而私钥本身从不离开申请者的机器。

## 为什么重要
CSR 是你和 CA 之间的分界线：私钥留在你手里，CA 只拿到签发证书所需的信息。CA 把 CSR 当作"请求"而不是"命令"：它会自己核验域名，忽略没有验证过的主题字段（比如 DV 证书即使 CSR 里填了 O 也不会写进去），有效期、密钥用途和策略也由 CA 决定。阿里云、腾讯云等控制台通常提供由系统生成 CSR 的选项，这时私钥由平台生成；如果希望私钥只留在自己的服务器上，应在本地生成 CSR 再上传。主题里要写中文组织名时，可以给 OpenSSL 加上 `-utf8` 参数避免乱码。

## 例子
```bash
openssl req -new -newkey rsa:2048 -nodes \
  -keyout example.com.key -out example.com.csr \
  -subj "/CN=example.com" \
  -addext "subjectAltName=DNS:example.com,DNS:www.example.com"
openssl req -in example.com.csr -noout -text -verify
```

## 常见误区
- **CSR 里包含私钥。** 只有公钥，.key 文件不要发给任何人。
- **CSR 里填的每个字段都会出现在证书里。** 最终内容由 CA 根据验证结果决定。
- **续期时直接用去年的 CSR。** 这等于继续使用同一对密钥，续期时重新生成密钥和 CSR 更稳妥。

## 相关术语

- [私钥](https://ssl.sh/zh/glossary/private-key/): 私钥是非对称密钥对中保密的那一半，TLS 服务器用它证明自己拥有证书里的那把公钥。
- [公钥](https://ssl.sh/zh/glossary/public-key/): 公钥是非对称密钥对中可以公开的一半，写在证书里，供他人验证由对应私钥生成的签名。
- [DN](https://ssl.sh/zh/glossary/distinguished-name/): DN 即可分辨名称，是由 C、O、CN 等属性组成的 X.500 风格结构化名称，用来标识 X.509 证书的主体和颁发者。
- [SAN](https://ssl.sh/zh/glossary/san/): SAN 即主体备用名称，是 X.509 证书中列出其适用的所有域名、IP 地址等身份的扩展，客户端按它校验主机名。
- [证书颁发机构](https://ssl.sh/zh/glossary/certificate-authority/): 证书颁发机构（CA）是负责审核申请者、签发数字证书，并把公钥与域名或身份绑定在一起的机构。
- [OpenSSL](https://ssl.sh/zh/glossary/openssl/): OpenSSL 是开源密码学工具包，由 TLS 协议库 libssl、通用密码库 libcrypto 和 openssl 命令行工具组成。
- [PEM](https://ssl.sh/zh/glossary/pem/): PEM 是一种把 DER 二进制数据做 Base64 编码、再用 BEGIN 和 END 行包起来的文本格式，是存放证书和私钥最常见的方式。
