术语表

ECDSA (椭圆曲线数字签名算法)

最后核实

定义

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

ECDSA 是数字签名算法(DSA)的椭圆曲线版本,由 NIST 在 FIPS 186 中标准化。TLS 证书中使用的是 P-256 和 P-384 曲线。P-256 密钥约有 128 位安全强度,与 3072 位 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 两张证书:

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"
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 重复或有偏差会直接泄露私钥,应使用成熟的密码库,不要自己实现。

延伸阅读