ECC 是椭圆曲线密码学(Elliptic Curve Cryptography)的英文缩写,是一种建立公开密钥的加密算法。与流行的 RSA 算法不同,它在 SSL 的应用中主要优势是它的密钥、请求与证书长度都更短,对移动设备更友好,也是安全证书厂商们未来力图推广的一种证书算法。其缺点在于算法复杂、加密解密耗时较长,从诞生时长上讲也未经过足够长久的安全检验。

以 Comodo 的证书为例,Android 5.0.1 系统收录了其发布的 ECC 算法证书,但是并未收录它的 RSA 证书,这就导致本站在换证书之前在手机上访问都会受到红锁头提示。

采用 ECC 算法加密的 SSL 证书及其应用的网站可以在密钥交换中使用 ECDHE 这一交换机制,这就能规避 RSA 证书下容易出现的 DH 安全素数位数过短而导致的潜在安全隐患(OpenSSL 为 RSA 算法默认提供的是 1024 位的 DH 素数,这在今天已经容易被破解,一般会建议用户自行生成至少 2048 位的 DH 素数)。ECDHE 能够通过更短小的素数——例如 256 位——来实现与 RSA 同等级的安全性能,目前 ECC SSL 证书流行采用 384 位密钥进行加密,也可以采用 512 位加密,但是证书商不一定会签发,而且这对于性能的影响也比较大。

要签发 ECC SSL 证书,首先要通过 OpenSSL 来生成自身的私钥与 CSR 请求。

生成私钥

openssl ecparam -genkey -name secp384r1 -out site-ecc.key

由于目前 secp521r1 参数已不再被浏览器所支持,推荐采用 secp384r1 进行加密。

生成 CSR 证书请求

openssl req -new -sha384 -key yoursite-ecc.key -out yoursite-ecc.csr

如上文所述,虽然也支持 sha512,,但是对于服务器负担较大也无必要,考虑到 ECC 要求的最小密钥数是 160 位,目前被破解的密钥只到 109 位,选择 384 位是一个比较好的选择。

生成CSR时需要的参数如下:

CN-通用名:输入你的网站域名,一般证书商都会为你提供带 www 与不带 www 的证书,所以写不带 www 的就好。它在证书上显示的便是“颁发给:”字段。如果你购买的是子域名证书,需要在前面加上*.,即诸如*.molun.net这样的形式

O-组织名称

OU-部门名称

L-所在当地名称(一般为城市)

S/ST-所在省名称

C-所在国家

以上几项由于在非组织验证级别的证书里都不会显示,所以随意填也没有关系。

生成的CSR是以-----BEGIN CERTIFICATE REQUEST-----开头-----END CERTIFICATE REQUEST-----结尾的文本,并储存在相应的.csr文件中。从服务端下载这个文件,用记事本打开,就可以提取到你的证书请求信息,并提交给服务商了。

此后,就可以提交给证书商来为你签发 SSL 证书了。拿到 SSL 证书后,可以在服务端修改自身的 SSL 配置以提高安全体验,包括采用对应的 ECDHE 交换机制和重载网站的不安全内容,有关这些配置,可以参阅《为 WordPress 全站开启强制 HTTPS 访问》。

趁着双十一证书商活动,尽管原先的证书还没过期,还是下手签了一张三年期 ECC SSL 证书:

SSL

  • 石樱灯笼

    记得我大学毕业论文就是双椭圆曲线加密啥的算法……