CSR(Certificate Signing Request,证书签名请求)是你发送给证书颁发机构(CA)以申请 SSL 证书的编码数据块。它包含你的公钥和域名信息。CA 使用它来创建你的证书。
CSR 内包含什么
| 字段 | 示例 | 必需? |
|---|---|---|
| Common Name (CN) | example.com | 是 |
| 公钥 | 你的 RSA 或 ECDSA 公钥 | 是 |
| 密钥算法 | ECDSA P-256 或 RSA 2048 | 是 |
| 组织 | Your Company LLC | DV 可选 |
| 国家 | US | DV 可选 |
| SAN | www.example.com、api.example.com | 多域名时需要 |
对于 DV 证书(如 Let’s Encrypt),只有域名和公钥重要。组织字段会被忽略。
CSR 生成流程
- 生成密钥对 —— 一个私钥和一个公钥
- 构建 CSR —— 将公钥 + 域名信息编码为标准格式(PKCS#10)
- 签名 CSR —— 用私钥签名(证明你持有匹配的私钥)
- 发送给 CA —— CA 验证你的域名所有权,然后使用 CSR 创建你的证书
私钥永远不离开你的系统。CSR 只包含公钥。
GetHTTPS 自动处理 CSR
使用传统工具时,你需要手动用 OpenSSL 生成 CSR:
# The manual way (not needed with GetHTTPS)
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout privkey.pem -out csr.pem -nodes \
-subj "/CN=example.com"
使用 GetHTTPS 时,你完全不需要接触 CSR。工具会:
- 在浏览器中生成密钥对(Web Crypto API)
- 从你输入的域名自动构建 CSR
- 作为 ACME 流程的一部分发送给 Let’s Encrypt
- 给你签名后的证书供下载
CSR 是内部步骤——你只需输入域名即可获得证书。
手动生成 CSR(需要时)
如果你需要独立的 CSR(用于商业 CA,或需要上传 CSR 的平台),方法如下:
ECDSA P-256(推荐)
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout privkey.pem -out csr.pem -nodes \
-subj "/CN=example.com"
RSA 2048
openssl req -new -newkey rsa:2048 \
-keyout privkey.pem -out csr.pem -nodes \
-subj "/CN=example.com"
多域名(SAN)
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout privkey.pem -out csr.pem -nodes \
-subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
验证 CSR
openssl req -in csr.pem -noout -text
这会显示嵌入 CSR 中的域名、密钥算法和密钥大小。
CSR 在 ACME 协议中
在 ACME 协议(Let’s Encrypt 使用的)中,CSR 在完成步骤发送——在域名验证通过之后。CA 使用 CSR 中的公钥构建你的证书。CSR 格式为 PKCS#10,在 ACME JSON 消息中编码为 base64url。
使用 GetHTTPS 时,整个过程在 JavaScript 中通过 Web Crypto API 和 pkijs 库完成。你永远看不到原始 CSR 字节。
常见问题
我需要保留 CSR 文件吗?
不需要。CSR 仅在证书请求期间使用。CA 签发证书后,CSR 就没有用处了。保留你的私钥和证书——CSR 可以丢弃。
续签时能复用 CSR 吗?
技术上可以,但最好每次续签都生成新的密钥对和 CSR。这遵循密钥轮换原则,限制了密钥泄露时的暴露。
CSR 和证书有什么区别?
CSR 是请求——它包含你的公钥并请求 CA 签名。证书是结果——它是 CA 签名的声明,表明你的公钥属于你的域名。CSR 是输入;证书是输出。
能为通配符域名生成 CSR 吗?
可以。使用 *.example.com 作为 Common Name:
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout privkey.pem -out csr.pem -nodes \
-subj "/CN=*.example.com"
使用 GetHTTPS 时不需要手动生成 CSR——输入 *.example.com 作为域名,GetHTTPS 自动处理 CSR。
CSR 中的”密钥用途”是什么意思?
密钥用途扩展指定证书可以用于什么——TLS 证书通常是”数字签名”和”密钥加密”。GetHTTPS 和大多数 ACME 客户端默认正确设置这些。只有当你为有特定要求的商业 CA 手动生成 CSR 时才需要关心密钥用途。