说ECC算法前,我们先科普下SSL证书在浏览器上面的作用:
1)证书合法性校验。确保证书由合法 CA 签署,且适用于当前访问的网站;
2)使用证书提供的非对称加密公钥,完成密钥交换和服务端认证。
HTTPS 通过 TLS 层和证书机制提供了内容加密、身份认证和数据完整性三大功能,可以有效防止数据被监听或篡改,还能抵御 MITM(中间人)攻击。TLS 在实施加密过程中,需要用到非对称密钥交换和对称内容加密两大算法。
对称内容加密强度非常高,加解密速度也很快,只是无法安全地生成和保管密钥。在 TLS 协议中,应用数据都是经过对称加密后传输的,传输中所使用的对称密钥,则是在握手阶段通过非对称密钥交换而来。常见的 AES-GCM、ChaCha20-Poly1305,都是对称加密算法。
非对称密钥交换能在不安全的数据通道中,产生只有通信双方才知道的对称加密密钥。目前最常用的密钥交换算法有 RSA 和 ECDHE:RSA 历史悠久,支持度好,但不支持 PFS(Perfect Forward Secrecy);而 ECDHE 是使用了 ECC(椭圆曲线)的 DH(Diffie-Hellman)算法,计算速度快,支持 PFS。要了解更多 RSA 和 ECDHE 密钥交换的细节,可以阅读 Cloudflare 的这篇文章。
目前全球使用的SSL证书算法是RSA(非对称秘钥算法),签名算法主要是sha1(已经被淘汰)、sha256(主流)、sha384,但是由于目前移动端的增多,RSA秘钥在加载时显得速度就很不理想,一个256位的ECC算法的证书加密强度相当于RSA4096位的加密强度,但是位数更短,浏览器加载更快,降低了用户访问网站的时间的同时加密强度也有了保障;但是并不是所有浏览器都支持 ECDHE 密钥交换,也就是说 ECC 证书的兼容性要差一些。例如在 Windows XP 中,使用 ECC 证书的网站只有 Firefox 能访问(Firefox 的 TLS 自己实现,不依赖操作系统);Android 平台中,也需要 Android 4+ 才支持 ECC 证书。
好了,话不多说我们直接上申请Gworg多域名证书,由于Gworg如果使用自动申请功能的话证书秘钥是RSA算法的,我们这里使用收到操作;
首先是使用OpenSSL生成ECC算法的秘钥,命令如下
openssl ecparam -genkey -name secp256r1 -out www.gworg.com.key openssl req -new -sha256 -key www.gworg.com.key -nodes -out www.gworg.com.csr
使用上面命令生成好CSR,保存好.key文件,后面配置要用到
下面介绍下Let’s encrypt的Certbot来进行手动证书申请,如何安装Certbot,可以访问官方网站
使用下面命令:
./certbot-auto certonly --webroot -w /root/home/yourwebrootpath/ -d www.gworg.com -d subdomain.morong.me --email "XXXX@gmail.com" --csr "/etc/letsencrypt/csr/www.gworg.com.csr"
参数说明:
–webroot:你的网站主路径
-d :证书要绑定的域名,多个域名就多个-d
–csr:上面使用OpenSSL制作的csr,注意-d里面的域名必须要和csr里面的域名一致
完成以上步骤后,证书就直接签发了,一般会在root目录下面生成三个pem文件,cert.pem公钥、chain.pem证书链(先将这两个文件合成为一个文件,重命名为yourdomain.crt),文件拷贝到nginx的conf目录下面,包括上面使用OpenSSL制作的私钥,可以新建一个sslkey的目录
安装证书:
server { listen 443 ssl; server_name www.gworg.com; ssl_certificate /usr/local/nginx/conf/sslkey/www.gworg.com.crt; ssl_certificate_key /usr/local/nginx/conf/sslkey/www.gworg.com.key; ssl_ciphers ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!3DES:!MD5:!ADH:!RC4:!DH:!DHE; ssl_prefer_server_ciphers on; …… }
至此证书配置结束,使用chrome访问截图如下: