# ECDSA（椭圆曲线数字签名算法）是什么？定义、例子与常见误区

> ECDSA 是基于椭圆曲线的数字签名算法，在 TLS 证书中作为 RSA 的替代方案，密钥和签名更小、签名运算更快。

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

ECDSA 是数字签名算法（DSA）的椭圆曲线版本，由 NIST 在 FIPS 186 中标准化。TLS 证书中使用的是 [P-256](https://ssl.sh/zh/glossary/p-256/) 和 P-384 曲线。P-256 密钥约有 128 位安全强度，与 3072 位 [RSA](https://ssl.sh/zh/glossary/rsa/) 相当，原始签名却只有 64 字节。每次 ECDSA 签名都要用一个保密的随机数 nonce，一旦 nonce 重复或可预测，私钥就能从签名中被算出来，因此 RFC 6979 定义了确定性生成 nonce 的方法。

## 为什么重要
同等或更高安全强度下，ECDSA 证书让握手数据更小，服务器端签名开销也比 RSA 低得多。截至 2026 年 11 月，WebPKI 中的 CA 签发的 TLS 证书使用 RSA 或 ECDSA（P-256/P-384）密钥，很多 ACME 客户端都能申请 ECDSA 证书，国内云厂商的证书服务一般也提供 ECC 选项。主要代价是兼容性：极老的客户端只支持 RSA，服务器可以同时部署一张 ECDSA 证书和一张 RSA 证书来兼顾。

## 例子
生成 P-256 私钥和 CSR，并在 Nginx 中同时提供 ECDSA 与 RSA 两张证书：

```bash
openssl ecparam -name prime256v1 -genkey -noout -out example.com.ecdsa.key
openssl req -new -key example.com.ecdsa.key -out example.com.csr -subj "/CN=example.com"
```

```nginx
ssl_certificate     /etc/nginx/certs/example.com.ecdsa.crt;
ssl_certificate_key /etc/nginx/certs/example.com.ecdsa.key;
ssl_certificate     /etc/nginx/certs/example.com.rsa.crt;
ssl_certificate_key /etc/nginx/certs/example.com.rsa.key;
```

## 常见误区
- **ECDSA 证书必须由 ECDSA 的 CA 签发。** 证书链可以混用算法，由 RSA 中间证书签发 ECDSA 叶子证书很常见。
- **256 位 ECDSA 不如 2048 位 RSA。** 不同算法的密钥长度不能直接比较，P-256 反而更强。
- **签名用的随机数无关紧要。** nonce 重复或有偏差会直接泄露私钥，应使用成熟的密码库，不要自己实现。

## 相关术语

- [ECC](https://ssl.sh/zh/glossary/ecc/): ECC 即椭圆曲线密码学，是基于有限域上椭圆曲线代数结构的公钥密码技术，能用较短的密钥提供很高的安全强度。
- [P-256](https://ssl.sh/zh/glossary/p-256/): P-256 是 NIST 标准化的 256 位素数域椭圆曲线，也叫 secp256r1 或 prime256v1，广泛用于 ECDSA 证书和 ECDHE 密钥交换。
- [RSA](https://ssl.sh/zh/glossary/rsa/): RSA 是 1977 年提出的公钥算法，TLS 用它对证书和握手进行签名，在 TLS 1.3 之前还用它传输会话密钥。
- [数字签名](https://ssl.sh/zh/glossary/digital-signature/): 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。
- [Ed25519](https://ssl.sh/zh/glossary/ed25519/): Ed25519 是在 Curve25519 爱德华兹形式上实现的 EdDSA 签名方案，由 RFC 8032 定义，公钥 32 字节，签名 64 字节且为确定性签名。
- [ECDHE](https://ssl.sh/zh/glossary/ecdhe/): ECDHE 是椭圆曲线上的临时 Diffie-Hellman 密钥交换，TLS 双方每次握手都生成新的椭圆曲线密钥对，并据此协商出共享密钥。
- [密钥长度](https://ssl.sh/zh/glossary/key-size/): 密钥长度是密钥的位数，其安全含义取决于算法，例如 256 位的 ECDSA 密钥比 2048 位的 RSA 密钥更强。
